初始化0x81错误的测试

贴上读写函数 /* 单片机的引脚 CH374芯片的引脚 PINE.4 INT# PORTE.2 A0 PORTE.3 CS# PORTE.5 WR# PORTE.6 RD# PORTF(8位端口) D7-D0 */

void CH374_PORT_INIT( ) /* 由于使用通用I/O模拟并口读写时序,所以进行初始化 */ { DDRF = 0x00; /* 设置8位并口为输入 */ PORTE = 0x68; /* 设置CS,WR,RD默认为高电平 */ DDRE = 0xEF; /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */ } void Write374Index( UINT8 mCmd ) /* 向索引端口写入索引地址 */ { PORTE |= 0x04; /* 输出A0=1 */ PORTF = mCmd; /* 向CH374的并口输出数据 */ DDRF = 0xFF; /* 并口D0-D7输出 */ PORTE &= 0xD4; /* 输出有效写控制信号, 写CH374芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ DDRF = 0xFF; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ PORTE |= 0xFF; /* 输出无效的控制信号, 完成操作CH374芯片, A0=1; CS=1; WR=1; RD=1; */ DDRF = 0x00; /* 禁止数据输出 */ PORTE &= 0xF3; /* 输出A0=0; 可选操作 */ } void Write374Data( UINT8 mData ) /* 向数据端口写入数据,索引地址自动加1 */ { PORTF = mData; /* 向CH374的并口输出数据 */ DDRF = 0xFF; /* 并口D0-D7输出 */ PORTE &= 0x40; /* 输出有效写控制信号, 写CH374芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ DDRF = 0xFF; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ PORTE |= 0xFF; /* 输出无效的控制信号, 完成操作CH374芯片, A0=0; CS=1; WR=1; RD=1; */ DDRF = 0x00; /* 禁止数据输出 */ } UINT8 Read374Data( void ) /* 从数据端口读出数据,索引地址自动加1 */ { UINT8 mData;

DDRF = 0x00; /* 数据输入 */ PORTE &= 0x20; /* 输出有效读控制信号, 读CH374芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ DDRF = 0x00; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ mData = PINF; /* 从CH374的并口PA输入数据 */ PORTE |= 0x6B; /* 输出无效的控制信号, 完成操作CH374芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); } 读写寄存器,写索引和读数据都测试过,正常,但是写数据函数不对,写数据到40H~45H再读出来一只都是0xFD,求救.

寄存器的速度相对来说速度快些,40--45是RAM速度稍微慢写,这可能是读写速度快导致出现错误。 另外建议A0先与CS WR,RD变化,然后CS,然后WR在变,WR电平保持宽些,另外数据与数据,数据与索引之间的延时按照芯片说明书上去做,你可以在以上每个函数之间做个延时,大概1.5US即可


芯片的延迟都是几十ns的。 再贴个按你说的改的程序,帮我看看谢谢!! /* 单片机的引脚 CH374芯片的引脚 PINE.4 INT# PORTE.2 A0 PORTE.3 CS# PORTE.5 WR# PORTE.6 RD# PORTF(8位端口) D7-D0 */

void CH374_PORT_INIT( ) /* 由于使用通用I/O模拟并口读写时序,所以进行初始化 */ { DDRF = 0x00; /* 设置8位并口为输入 */ PORTE = 0x68; /* 设置CS,WR,RD默认为高电平 */ DDRE = 0xEF; /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */ } void Write374Index( UINT8 mCmd ) /* 向索引端口写入索引地址 */ { PORTE |= 0x04; /* 输出A0=1 */ PORTF = mCmd; /* 向CH374的并口输出数据 */ DDRF = 0xFF; /* 并口D0-D7输出 */ PORTE &= 0xD4; /* 输出有效写控制信号, 写CH374芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ DDRF = 0xFF; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ PORTE |= 0xF0; /* 输出无效的控制信号, 完成操作CH374芯片, A0=0; CS=0; WR=1; RD=1; */ PORTE |= 0xF8; /* 输出无效的控制信号, 完成操作CH374芯片, A0=0; CS=1; WR=1; RD=1; */ DDRF = 0x00; /* 禁止数据输出 */ PORTE &= 0xFB; /* 输出A0=0; 可选操作 */ } void Write374Data( UINT8 mData ) /* 向数据端口写入数据,索引地址自动加1 */ { PORTE &= 0xFB; /* 输出A0=0 */ PORTF = mData; /* 向CH374的并口输出数据 */ DDRF = 0xFF; /* 并口D0-D7输出 */ PORTE &= 0xD8; /* 输出有效写控制信号, 写CH374芯片的命令端口, A0=0; CS=1; WR=0; RD=1; */ PORTE &= 0xD0; /* 输出有效写控制信号, 写CH374芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ DDRF = 0xFF; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ DDRF = 0xFF; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ delay_nus(5); PORTE |= 0xF0; /* 输出无效的控制信号, 完成操作CH374芯片, A0=0; CS=0; WR=1; RD=1; */ PORTE |= 0xF8; /* 输出无效的控制信号, 完成操作CH374芯片, A0=0; CS=1; WR=1; RD=1; */ DDRF = 0x00; /* 禁止数据输出 */ PORTE |= 0x04; /* 输出A0=1; 可选操作 */ } UINT8 Read374Data( void ) /* 从数据端口读出数据,索引地址自动加1 */ { UINT8 mData;

DDRF = 0x00; /* 数据输入 */ PORTE &= 0xB0; /* 输出有效读控制信号, 读CH374芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ DDRF = 0x00; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ mData = PINF; /* 从CH374的并口PA输入数据 */ PORTE |= 0x6B; /* 输出无效的控制信号, 完成操作CH374芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); } /* 并口接口子程序,供CH374子程序库调用 */ //********************************************************************** //函 数 名: //说 明: //返 回 值: //示 范: //********************************************************************** UINT8 CH374_READ_REGISTER( UINT8 mAddr ) /* 外部定义的被CH374程序库调用的子程序,从指定寄存器读取数据 */ { Write374Index( mAddr ); return( Read374Data( ) ); } //********************************************************************** //函 数 名: //说 明: //返 回 值: //示 范: //********************************************************************** void CH374_WRITE_REGISTER( UINT8 mAddr, UINT8 mData ) /* 外部定义的被CH374程序库调用的子程序,向指定寄存器写入数据 */ { Write374Index( mAddr ); delay_nus(5); Write374Data( mData ); } 测试用程序:

printf("Read 0x04 Register is %02x.\n",CH374_READ_REGISTER(0x04)); delay_nms( 100 ); CH374_WRITE_REGISTER(0x40,0x48); delay_nms( 100 ); CH374_WRITE_REGISTER(0x41,0x49); delay_nms( 100 ); CH374_WRITE_REGISTER(0x42,0x50); delay_nms( 100 ); CH374_WRITE_REGISTER(0x43,0x51); delay_nms( 100 ); printf("Read 0x05 Register is %02x.\n",CH374_READ_REGISTER(0x05)); delay_nms( 100 ); printf("Read 0x06 Register is %02x.\n",CH374_READ_REGISTER(0x06)); delay_nms( 100 ); printf("Read 0x07 Register is %02x.\n",CH374_READ_REGISTER(0x07)); delay_nms( 100 ); printf("Read 0x08 Register is %02x.\n",CH374_READ_REGISTER(0x08)); delay_nms( 100 ); printf("\n"); printf("Read 0x40 Register is %02x.\n",CH374_READ_REGISTER(0x40)); delay_nms( 100 ); printf("Read 0x41 Register is %02x.\n",CH374_READ_REGISTER(0x41)); delay_nms( 100 ); printf("Read 0x42 Register is %02x.\n",CH374_READ_REGISTER(0x42)); delay_nms( 100 ); printf("Read 0x43 Register is %02x.\n",CH374_READ_REGISTER(0x43));


现在的测试结果是什么?不知道你的MCU以及频率多快


还是一样的结果,我使用的是Atmega64A的单片机,模拟并口方式,使用16M晶振和8M晶振都测试过,读0x40以后的发送缓存都是0xfd,读不出写进去的数据,救命啊~! ~~估计ch374u初始化0x81的错误就是写数据这个函数造成的。所以急需解决这个问题!


解决!! 错误:CH374与HY62256的A0连在一起了!! 低级错误........ 画电路时都使用了A0标号,所以连接一起了.....


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