CH376初始化返回0xFF

程序如下,我是用mega128芯片做的,采用并口,芯片用的是官方的376模块,但是初始化总是通不过,返回值res为0xFF,出错的原因是什么地方呢? unsigned char mInitCH376Host( void ) /* 初始化CH376 */ { unsigned char res=0; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 测试单片机与CH376之间的通讯接口 */ xWriteCH376Data( 0x55 ); res = xReadCH376Data( ); //------------------------------ PORTC=res; //------------------------------ if ( res != 0xAA ) return (ERR_USB_UNKNOWN); /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */ xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); else return (ERR_USB_UNKNOWN); /* 设置模式错误ERR_USB_UNKNOWN */ }

检查并口时序,用示波器看下输出的电平对不对,以及时序有没有问题。其次检查硬件,按照我们手册上给硬件


硬件没有查出错误。程序都是按照376编程指南上写的,麻烦帮看下读写程序是否有不妥,实在是找不到错误了,崩溃掉!!!!!!!!!!!!! void xWriteCH376Cmd( unsigned char mData ) /* 向CH376写命令 */ { CH376_DATA_PORT=mData; CH376_DATA_DDR=0xFF; //设置端口为输出 CH376_A0_H; CH376_PCS_L; CH376_RD_H; CH376_WR_L; //写控制信号 CH376_DATA_DDR=0x00; mDelayuS(2);//延时应大于1.5us CH376_WR_H; } unsigned char xReadCH376Data(void)//从376读取数据 { unsigned char mData; CH376_DATA_DDR=0x00; //端口为输入 CH376_DATA_PORT=0xFF;//上拉端口电阻 CH376_PCS_L; CH376_A0_L; CH376_WR_H; CH376_RD_L; asm("nop"); mData=CH376_DATA_PIN;//读取数据 mDelayuS(1); CH376_RD_H; return(mData); }


应该是单片机速度的原因,我单步执行是可以的,一旦全速运行就不行了,376编程指南上说向CH376 写命令周期大于1.5uS,是整个写周期大于1.5uS还是每个指令周期要大于1.5uS?


看了你的时序,你片选拉低之后怎么没有再拉高?还有需要你做下测试命令,看下测试命令给你返回的数据是多少?同时用万用表去测下芯片的25脚,正常芯片复位之后25脚电压为高。还有上电之后需要做50MS以上的延时之后在做芯片初始化或者测试命令。


因为并口就376一个芯片所以直接片选拉低了,现在测试数据单步运行总是返回0x00,全速运行总返回0xFF(已经加延时了),昨天测试时,24脚变低了好使,现在24脚一直高,不知道怎么回事,另外复位时25脚变高了,然后再RSTI低电平25脚就变低了,复位后25脚为低对吧?


对。你写命令函数不对WR拉低后,此时数据要保持,不能把CH376_DATA_DDR=0x00;


初始化调通了,写命令下面写的就能通过,居然要是100mS!!!但是确实是通过了,说明书不是大于1.5uS就行了吗,感觉差别也太大了! void xWriteCH376Cmd( unsigned char mData ) /* 向CH376写命令 */ { CH376_DATA_DDR=0xFF; //端口为输出 CH376_DATA_PORT=mData; CH376_A0_H;; mDelaymS(100);//延时 CH376_WR_L; //写控制信号 mDelaymS(100);//延时应大于1.5us CH376_WR_H; }


怀疑延时程序不准,测试下延时时间没问题,做了PORTD.0口延时1ms循环,示波器显示周期是3mS,所以事实是确实376需要延时几十毫秒 while(1) { PORTD |=0x01; mDelaymS(1);// PORTD &=0xFE; mDelaymS(1);// }

而且我试了试376写程序需要延时40mS左右才行,低于40就返回不了正确数据。My God.


UINT8 xReadCH376Status( void ) /* 从CH376读状态,仅用于并口方式 */ { UINT8 mData; CH376_DATA_DIR_IN( ); /* 设置并口方向为输入 */ CH376_A0 = 1; CH376_CS = 0; CH376_RD = 0; /* 输出有效读控制信号, 读CH376芯片的状态端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据 */ mData = CH376_DATA_DAT_IN( ); /* 从CH376的并口输入数据 */ CH376_RD = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; return( mData ); }

void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ { CH376_DATA_DAT_OUT( mCmd ); /* 向CH376的并口输出数据 */ CH376_DATA_DIR_OUT( ); /* 设置并口方向为输出 */ CH376_A0 = 1; CH376_CS = 0; CH376_WR = 0; /* 输出有效写控制信号, 写CH376芯片的命令端口 */ // CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; CH376_DATA_DIR_IN( ); /* 禁止数据输出 */ /* mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );*/ /* 延时1.5uS确保读写周期大于1.5uS,或者用状态查询代替 */ }

void xWriteCH376Data( UINT8 mData ) /* 向CH376写数据 */ { CH376_DATA_DAT_OUT( mData ); /* 向CH376的并口输出数据 */ CH376_DATA_DIR_OUT( ); /* 设置并口方向为输出 */ CH376_A0 = 0; CH376_CS = 0; CH376_WR = 0; /* 输出有效写控制信号, 写CH376芯片的数据端口 */ // CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_DATA_DIR_IN( ); /* 禁止数据输出 */ // mDelay0_5uS( ); /* 确保读写周期大于0.6uS */ }

UINT8 xReadCH376Data( void ) /* 从CH376读数据 */ { UINT8 mData; // mDelay0_5uS( ); /* 确保读写周期大于0.6uS */ CH376_DATA_DIR_IN( ); /* 设置并口方向为输入 */ CH376_A0 = 0; CH376_CS = 0; CH376_RD = 0; /* 输出有效读控制信号, 读CH376芯片的数据端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据 */ mData = CH376_DATA_DAT_IN( ); /* 从CH376的并口输入数据 */ CH376_RD = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; return( mData ); } 按照这个思路修改你AVR的IO


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