主题中讨论的其他器件: IO-EXPANDER-EVM、 TCA9535、 TCA6424A
大家好、我在 Tiva C Launchpad TM4C123GXL 上使用 TM4C123GH6PM 、通过 I2C 与组装有 TCA6242A 和 TCA9535芯片的 IO-Expander EVM 连接。 我使用跳线将3.3V/GND 从 TivaC 连接到 IO-Expander EVM、因为 IO-Expander EVM 用于连接 MSP430 Launchpad、而分线接头/连接器不允许使用任何具有堆叠 I2C 功能的 TM4C123GH6PM GPIO 引脚 连接。 我的问题是、当我尝试发送 I2C 帧时、地址字节和数据字节会被 NACK。 我可以通过在 CCS 中单步执行我的代码并在调试寄存器窗口中监控 I2C1_MCS 寄存器来看到这一点。 这是我 要引用的 CCS 调试中的代码和寄存器窗口。
#include "TM4C123GH6PM.h" #include #include #include #include #include #include #include #include #include #include #include #include int main (void) { SysCtlPeripheralEnable (SYSCTL_Periph_I2C1); ////等待 I2C0模块准备就绪。// while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C1)){} //启用包含 I2C 的 GPIO 外设 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); //为端口 A6和 A7上的 I2C3功能配置引脚复用。 GPIOPinConfigure (GPIO_PA6_I2C1SCL); GPIOPinConfigure (GPIO_PA7_I2C1SDA); //为这些引脚选择 I2C 功能。 GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_6); GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_7); ////初始化主设备和从属设备// I2CMasterInitExpClk (I2C1_base、SysCtlClockGet ()、false); ///指定从器件地址// I2CMasterSlaveAddrSet (I2C1_base、0x23、false); ////将要发送的字符放入数据寄存器// I2CMasterDataPut (I2C1_base、0x08); ////开始将字符从主控方发送到从属方// I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND); while (I2CMasterBusy (I2C1_base)){} 返回0; }
I2C1_MCS 寄存器 在该函数调用完成后将这些位置为有效:
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND);
我认为我的问题是由于通道中的噪声。 我认为这是因为以下原因:
1) 1)我已经尝试过 MSP430评估。 可控制具有 GUI 驱动器和 IO 扩展器的板、切换 LED 以进行验证。 虽然通过分线接头/连接器连接时 MSP430评估板可与 IO 扩展器评估板配合使用、但使用跳线时通信不起作用。 我已通过原理图、布局文件和数字万用表测试验证所有设置上的引脚是否正确连接。 由于已知的工作设置中的信号路径较短、而跳线(6英寸) 不工作、这向我表明、差异是一个有噪声的通道、当使用跳线实现时、MSP430/TIVAC 上的噪声通道将是相同的。
2) 2)我已通过数据表验证了在 TCA6424A 上获取 NACKED 的地址、以及将与 GUI IO 扩展器 Eval 一起使用的 MSP430评估源代码。 当 作为参数传递到地址集函数时、可执行文件应具有值0x23。
我还尝试在评估时与 TCA9535通信。 没有成功。
现在、由于我在地址上得到了 NACKED、所以我对帧的其余部分不是很担心。 但我尝试发送整个帧、但没有成功。
我没有可用的示波器来验证我的噪声通道理论或位流。
我经常看到使用跳线实现类似这样的简单 I2C。 我在其中一个 TI 论坛中看到了一个、有人在其中连接到 IO Eval。 有问题的电路板、具有跳线和 RPI。 因此、我认为这是可能的。
我的描述和发布的代码中是否有任何内容可供大家认为是一个潜在的问题、需要在不良的物理 I2C 通道之外进行改进?
通过检测 NACK 并基本上重置消息并再次发送直到 NACK 来处理有噪声的通道是否不可取或不可能?
我一直在尝试为此程序开发错误处理代码、在该代码中检测 AddressNACK 并 停止通信并重新发送消息。 目前我正在尝试这样的方法、但没有成功、I2C_MCS 中的停止位和开始位似乎都保持启用状态、无论发生什么情况。 我检查了总线监控寄存器、SCL 没有被从器件保持在低电平。
此外、i2c 评估板上还为 SDA/SCL 线路提供4.7K 上拉电阻。
uint32_t ERROR_STATUS = 0x01;
while (error_status|I2CMasterBusy (I2C1_base)){ I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND); if (I2CMasterErr (I2C1_base)) { I2CMasterIntClear (I2C1_base); while (I2CMasterIntStatus (I2C1_base、true)){} I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_ERROR_STOP); } 其他 { ERROR_STATUS =0x00; } }
我在中断处理程序之外使用了 I2CMasterIntClear (),因为我想使用这样一个简单的程序,忙/等待的实现对我来说会更容易,并且在尝试实施 ISR 时更明智。
非常感谢您花时间在这里为我提供帮助、我对此表示感谢。

