用AVR单片机控制CH372能检测到设备但读取不到数据

我用51单片机控制CH372时上位机软件能自动检测到硬件并且读写数据都没问题,接收的数据都正常,但是换为AVR单片机控制时,能检测到硬件但是无法读写数据,不清楚是什么原因?使用CHK_EXIST命令检测时返回的还是写进去的数,并没有得到取反的值,是不是读写函数有问题?这些操作在51单片机上都是正常的,但转到AVR就不行了。用的AVR单片机为ATMEGA32,其底层操作部分函数如下: 其中A0接PC0,CS接PC1,WR接PC2,RD接PC3,D0~D7接PB,中断信号采用外部中断0的PD2口,通过中断来进行读写数据操作。 //*********************************************************************** void ch372_delay_us(unsigned long count) { int i,j; for(i=0; i<20; i++) { for(j=0; j } } void CH372_PORT_INIT(void) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { Pc_out; CH372_CS_H; CH372_WR_H; CH372_RD_H; CH372_A0_L; Pb_in; //DDRA=0x00; //for input state Pb_ff; } //*************************************** //系统初始化 //返回:初始化成功置1, 初始化失败置0 //*************************************** unsigned char InitCH372Sys(void) { unsigned char InitFlag; InitFlag = CH372Init(); // 初始化CH372 CH372_PORT_INIT(); MCUCR |= b0000_1010;//下降沿触发 MCUCSR|= 0x00; GICR |= 0xC0;//b1100_0000 打开中断1,0 sei();//开全局中 return InitFlag; }

void SendCommand372(unsigned char command) { ch372_delay_us(10); Pc_out; Pb_out; PORTB=command; CH372_A0_H; CH372_CS_L; CH372_WR_L; //在此加上ch372_delay_us(500); 也还是不行 CH372_WR_H; CH372_A0_L; ch372_delay_us(10); } void WriteData372(unsigned char *psrc, unsigned char n_byte) { unsigned char q0; Pc_out; for(q0=0; q0 { ch372_delay_us(10); Pb_out; PORTB=(*psrc); CH372_A0_L; CH372_CS_L; CH372_WR_L;//在此加上ch372_delay_us(500); 也还是不行 CH372_WR_H; CH372_CS_H; ch372_delay_us(10); psrc++; } } void ReadData372(unsigned char *pdest, unsigned char n_byte) { unsigned char q0; Pc_out; for(q0=0; q0 { ch372_delay_us(10); Pb_in; Pb_ff; CH372_A0_L; CH372_CS_L; CH372_RD_L;//在此加上ch372_delay_us(500); 也还是不行 CH372_CS_L; *pdest=PORTB; CH372_RD_H; CH372_CS_H;//CH372_A0_H; ch372_delay_us(10); pdest++; } }

看了一下你的程序,请检查: 1:硬件连接是否正确 2:IO方向是否设置正确.你可以做一下实验,比如循环写入数据0X55,用示波器探测WR,CS,D0-D7,A0是否输出正确数据,电平状态是否正确.同样测试写命令,读数据函数, 参考程序: /* 单片机的引脚 CH375芯片的引脚 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTA(8位端口) D7-D0 */

void mDelay1uS( ) /* 至少延时1uS,根据单片机主频调整 */ { UINT8 i; for ( i = 5; i != 0; i -- ); }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { DDRA = 0x00; /* 设置8位并口为输入 */ PORTB = 0x07; /* 设置CS,WR,RD默认为高电平 */ DDRB = 0x0F; /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ /* *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; 通过并口直接读写CH375而非普通I/O模拟 */ PORTB |= 0x08; /* 输出A0=1 */ PORTA = mCmd; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */ PORTB &= 0xF9; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRA = 0x00; /* 禁止数据输出 */ PORTB &= 0xF7; /* 输出A0=0; 可选操作 */ mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { /* *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; 通过并口直接读写CH375而非普通I/O模拟 */ PORTA = mData; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */ PORTB &= 0xF1; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRA = 0x00; /* 禁止数据输出 */ mDelay1uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通过并口直接读写CH375而非普通I/O模拟 */ mDelay1uS( ); /* 至少延时1.2uS */ DDRA = 0x00; /* 数据输入 */ PORTB &= 0xF2; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ DDRA = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = PINA; /* 从CH375的并口PA输入数据 */ PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); }


看了楼上的例子,有一个函数比较疑惑: UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通过并口直接读写CH375而非普通I/O模拟 */ mDelay1uS( ); /* 至少延时1.2uS */ DDRA = 0x00; /* 数据输入 */ PORTB &= 0xF2; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ DDRA = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = PINA; /* 从CH375的并口PA输入数据 */ PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); } 在读取数据时的PINA应该用PORTA吧?


不是的,PINA是输入寄存器,PORTB是输出寄存器,读数据肯定是输入寄存器


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