CH365与CH423的I2C通信问题

用CH365设计的一块PCI卡,板卡可以正常识别,且可以读写卡上的双口RAM芯片,但是CH365与CH423之间的I2C通信始终不能通信。 CH365的SCL使用默认的A15引脚,且CH365的SCL(A15)和SDA(D7)直接与CH423的SCL和SDA相连,没有接上拉电阻。因为只是调试,用WinDriver进行读写测试,首先向0xF7(设备地址和命令寄存器)中写入0x44(设置低8 位开漏输出命令),向0xF4(数据存取寄存器)写入0xC3,最后向0xF5(控制和状态寄存器)写入0x01开始I2C通信传输,等待读取0xF5(控制和状态寄存器)为0x00后,应该是IC0-IC8既有不输出也有输出低电平的引脚,但是实际测量发现都没有输出 此外,向0xF7(设备地址和命令寄存器)中写入0x4D(读取双向输入输出命令),向0xF5(控制和状态寄存器)写入0x01开始I2C通信传输,等待读取0xF5(控制和状态寄存器)为0x00后读取0xF4(数据存取寄存器),发现读入的值都为0并没有反映出实际输入信号 不知道我的硬件连接上有误还是读写程序上有误,就是不能实现CH365与CH423的通信,麻烦帮我看下有什么问题,谢谢

CH365与CH423通过I2C接口连接,总的来说可以用模拟I2C时序或者硬件I2C时序来控制. A15和D7是硬件I2C时序的接口,在软件上要对I/O空间F4/F5/F6/F7访问 如果你选择模拟I2C,你可以选择其他的信号线来模拟 硬件上直接连接就可以应该不会有什么问题


BOOL WINAPI CH365mWriteI2C( // 向I2C接口写入一个字节数据 ULONG iIndex, // 指定CH365设备序号 UCHAR iDevice, // 低7位指定I2C设备地址 UCHAR iAddr, // 指定数据单元的地址 UCHAR iByte ) // 待写入的字节数据 { UCHAR mByte; if ( CH365mWriteIoByte( iIndex, & dllIoBaseAddr[ iIndex ] -> mCh365I2cDev, (UCHAR) ( iDevice << 1 | 0x00 ) ) ) { // 设备地址和命令 if ( CH365mWriteIoByte( iIndex, & dllIoBaseAddr[ iIndex ] -> mCh365I2cAddr, iAddr ) ) { // 设定地址 if ( CH365mWriteIoByte( iIndex, & dllIoBaseAddr[ iIndex ] -> mCh365I2cData, iByte ) ) { // 待写入的数据 if ( CH365mReadIoByte( iIndex, & dllIoBaseAddr[ iIndex ] -> mCh365I2cCtrl, &mByte ) ) { // 读取控制和状态 mByte |= 0x01; // 位0置1则启动操作 if ( CH365mWriteIoByte( iIndex, & dllIoBaseAddr[ iIndex ] -> mCh365I2cCtrl, mByte ) ) { // 开始写操作 while ( mByte & 0x01 ) CH365mReadIoByte( iIndex, & dllIoBaseAddr[ iIndex ] -> mCh365I2cCtrl, &mByte ); // 等待写操作完成 CH365DelayUS( 4 ); // 延时4uS作为两次I2C操作的间隔 return( TRUE ); } } } } } return( FALSE ); }


谢谢! 1) CH365的A15和D7与CH423的SCL和SDA直接相连是否可以? 2) 2楼程序中的iAddr地址指的是什么地址?对应到CH423中应该是什么值?CH423的操作只有两个字节,一个是各操作的命令字节1,一个是各操作的真正数据,这些对应到上面的这个函数的话怎么去设置每个输入参数的值呢?


1-可以 2-是数据单元地址,比如操作EEPROM,往哪和地址写/读数据 3-可以不要该参数


1-请查看CH423芯片说明书5.7节,有详细说明 2-针对CH423可以对CH365mWriteI2C函数进行改动(去掉设备地址和命令 去掉设定地址) 也可以模拟I2C(参考CH423IF.C)


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