求助:CH376 返回总是 0xff

我自己搭的板子,用万用表和示波器测过,连线都是通的,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 ); } }

软件上面没什么问题,需要你去检查下硬件上面是否按照你的硬件连线来操作的。


CH376S并口方式时,第5脚(TXD)应为低电平


另外检查一下CH376是否正常工作了。测量一下第25的电平是否为低电平。测量晶振是否起振。


非常感谢二楼的回答,是我太粗心了


只有登录才能回复,可以选择微信账号登录