我自己搭的板子,用万用表和示波器测过,连线都是通的,CH376的12M晶振也起振。 CH376用的是3.3V,并口通信。单片机用的是 STC12LE5A60S2,频率20M。 实验时将返回数据通过单片机串口发到计算机上。但返回数据均为0xff。
注:程序里 PCS 调试时一直拉低 COM test.h 里有串口发送函数
#include #include "STC12C5A.h" #include "COM test.h"
#define PDATA P2
#define uchar unsigned char #define uint unsigned int
sbit LED1 = P3^7; sbit LED2 = P3^5;
sbit SDWP = P0^0; //SD卡允许读写 0:允许 1:禁止 sbit SDIN = P0^1; //SD卡插入判断 0:插入 1:未插入 sbit CH376_INT = P0^2; //CH376 中断 低电平有效 sbit CH376_RSTI = P0^3; //CH376 外部复位输入 高电平有效 sbit CH376_WR = P0^4; //CH376 写选通 低电平有效 sbit CH376_RD = P0^5; //CH376 读选通 低电平有效 sbit CH376_A0 = P0^6; //CH376 命令,数据选择 0:读写数据 1:写命令或读状态 sbit CH376_PCS = P0^7; //CH376 并口片选 低电平有效
uchar buf[50]; //发送字符缓冲 uchar s; //临时变量
void Init(void) { SCON = 0x40; //设定串口1工作于方式1;禁止接收 PCON = 0x80; //波特率加倍 AUXR = 0xFD; //Time0,1,波特率发生器工作于 1T;串口1使用波特率发生器 BRT = 126; //波特率发生器初始值;工作于9600
LED1 = 1; LED2 = 1; }
void Delay_0_5us(void) //0.5us 延时 { unsigned char a; for(a=3;a>0;a--); }
void Delay_us(uchar us) //us 延时,输入延时量 { unsigned char a,b; for(a=us;a>0;a--) for(b=7;b>0;b--); }
void Delay_ms(uint ms) //ms 延时,输入延时量 { unsigned char a,b; uint c; for(c=ms;c>0;c--) for(b=215;b>0;b--) for(a=45;a>0;a--); }
void MCU_port_init(void) { CH376_RSTI = 1; //CH376 复位 CH376_PCS = 0; //CH376并口片选 CH376_WR = 1; CH376_RD = 1; CH376_A0 = 0; PDATA = 0xff; Delay_us(20); CH376_RSTI = 0; //取消 CH376 复位 Delay_ms(1000); //等待12M晶体起振 }
void xWriteCH376Cmd(uchar Cmd) //向CH376写命令 { PDATA = Cmd; CH376_A0 = 1; CH376_WR = 0; //输出有效写控制信号, 写CH376芯片的命令端口 Delay_us(20); CH376_WR = 1; //输出无效的控制信号, 完成操作CH376芯片 CH376_A0 = 0; PDATA = 0xff; Delay_us(40); // 延时1.5uS确保读写周期大于1.5uS,或者用状态查询代替 }
void xWriteCH376Data(uchar Data) //向CH376写数据 { PDATA = Data; //向CH376的并口输出数据 CH376_A0 = 0; CH376_WR = 0; //输出有效写控制信号, 写CH376芯片的数据端口 Delay_us(20); CH376_WR = 1; //输出无效的控制信号, 完成操作CH376芯片 PDATA = 0xff; Delay_us(20); //确保读写周期大于0.6uS }
uchar xReadCH376Data(void) //从CH376读数据 { uchar Data; PDATA = 0xff; CH376_A0 = 0; CH376_RD = 0; //输出有效读控制信号, 读CH376芯片的数据端口 Delay_us(20); Data = PDATA; //从CH376的并口输入数据 CH376_RD = 1; //输出无效的控制信号, 完成操作CH376芯片 Delay_us(20); //确保读写周期大于0.6uS return(Data); }
void main(void) { Init(); Delay_ms(100); MCU_port_init(); send_string_com(buf,sprintf(buf,"PDATA: %02X\n", (uint)PDATA)); send_string_com("Start\n",6); // 串口输出Start LED2 = 0; xWriteCH376Cmd(0x06); //向CH376写命令 LED2 = 1; xWriteCH376Data(0x55); //向CH376写数据 LED2 = 0; s = xReadCH376Data(); LED2 = 1; send_string_com(buf,sprintf(buf,"DATA: %02X\n", (uint)s)); while(1) { LED1 = ~LED1; Delay_ms( 200 ); } }