各位前辈: 我在调试CH375时遇到以下问题: 设置好内置固件模式后,安装驱动程序正常,USB设备枚举成功,用调试工具传数据时,程序也能进入中断,准备中断程序中看一下时否能正确接收数据,以为很顺利,可是发现问题了,用CH375_RD_DAT_PORT()读数据时,发现总是返回0xff,程序的都检查了好多次,还是这样,非常郁闷,为什么写命令和数据都能成功,可是读的时候不行了呢? 请那位好心我帮帮我啊,拜谢!
/******************************************* CH375B驱动程序V0.1 MCU:ATmega128L OSC:8MHz *******************************************/ #include "CH375INC.H" #include /******************************************* INT:pin26(PD1) CH375_CS:pin39(PC4),对于USB设备可以将此引脚接地 CH375_A0:pin40(PC5) CH375_WR:pin12(PB2) CH375_RD:pin13(PB3) ********************************************/
#define CH375_WR PORTB.2 #define CH375_RD PORTB.3 #define CH375_CS PORTC.4 #define CH375_A0 PORTC.5 #define CH375_DQ PORTA #define CH375_DQ1 PINA
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ DDRA = 0xff; DDRB |= 0x06; DDRC |= 0x30; delay_us(2); CH375_DQ = cmd; CH375_A0 = 1; //选择CH375的命令口 CH375_RD = 1; CH375_CS = 0; //使能ch375 CH375_WR = 0; #asm("NOP"); //CH375_WR产生宽度至少为80nS的低电平脉冲 CH375_WR = 1; CH375_CS = 1; CH375_A0 = 0; // DDRA = 0x00; //将数据端口置为输入 // PORTA = 0xff; //使能内部上拉电阻 delay_us(2); }
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ DDRA = 0xff; DDRB |= 0x06; DDRC |= 0x30; delay_us(1); CH375_DQ = dat; CH375_A0 = 0; CH375_RD = 1; CH375_CS = 0; CH375_WR = 0; #asm("NOP"); //CH375_WR产生宽度至少为80nS的低电平脉冲 CH375_WR = 1; CH375_CS = 1; // DDRA = 0x00; // PORTA = 0xFF; //使能内部上拉电阻 delay_us(1); }
unsigned char CH375_RD_DAT_PORT(void) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ unsigned char dat = 0; DDRA = 0x00; //将数据端口设置为输入 DDRB |= 0x06; DDRC |= 0x30; CH375_A0 = 0; CH375_WR = 1; CH375_CS = 0; CH375_RD = 0; dat = PINA; CH375_RD = 1; CH375_CS = 1; return dat; }
void CH375_INIT() { unsigned char i; unsigned char str[10]; lcd_init(); /* 测试CH375是否正常工作,可选操作,通常不需要 */ CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据 i = CH375_RD_DAT_PORT(); //返回数据应该是测试数据取反 sprintf(str,"#######%x",i); print_str(1,0,str); if(i != ~0x55) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT(CMD_RESET_ALL); //多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); delay_ms(50); //延时50ms } CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //设置为使用内置固件的USB设备方式 */ delay_us(20); if(CH375_RD_DAT_PORT() == CMD_RET_SUCCESS) { sprintf(str,"枚举成功!"); print_str(1,0,str); } /*******************外部中断1初始化*************************/ EIMSK = 0x02; //使用外部中断1 EICRA &= 0xf3; //低电平触发 #asm("sei"); //开全局中断使能 }
[b]文字[/b][size=6]文字[/size][b]文字[/b]