我用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++; } }