主题中讨论的其他器件:TCA9555、TCA9534A 、、 EK-TM4C129EXL
您好!
我们使用 TCA9555 I2C 芯片运行直接通信。 芯片在同一块板上的距离为4英寸。 芯片直接连接、无需任何缓冲器或隔离器。 我们有4.75kR 上拉电阻。 我编写的固件在另一个项目中经过了测试、在与 TCA9534A 芯片通信时工作正常。 通信频率为100kHz。
我们会随机看到其中一个时钟脉冲会半路并且看起来会出现尖峰。 我们知道这不是尖峰、而是异常的时钟脉冲、因为当我们用其相邻脉冲测量脉冲的周期时、它是相同的周期。 当我们看到这个尖峰时钟脉冲时、TCA9555芯片将不会发布 SDO 线、我认为这是因为 TCA9555在无法识别尖峰半时钟脉冲时、芯片需要微控制器提供另一个脉冲、因此不会释放 SDO 线。
此外、我们还注意到 SDO 数据线上的一些脉冲也不正常。 请查看下面的两个快照。
第一个 Snapshot 鞋带中的一个时钟脉冲是半向的,显示为尖峰,因此 SDO 线不会从低到高转换。
下面的第二个快照显示了所有时钟脉冲都是正确的、因此 SDO 线路被释放、但是 SDO 线路上的一些数据脉冲似乎不正常。
下图是电路原理图。
i2c 初始化和 i2c_read 代码如下所示;
void Internal_I2C_Init(void) { //I2C0 Module initialization ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_I2C0); SysCtlDelay(100); ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_I2C0); SysCtlDelay(100); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C0)){} //Wait for I2C0 Module to stabilize I2CMasterEnable(IOChip_I2C_BASE); GPIOPinConfigure(GPIO_PB2_I2C0SCL); GPIOPinConfigure(GPIO_PB3_I2C0SDA); GPIOPinTypeI2CSCL(IOChip_I2C_BASE, IOChip_I2C_SCL_PIN); GPIOPinTypeI2C(IOChip_I2C_BASE, IOChip_I2C_SDA_PIN); ROM_I2CMasterInitExpClk(IOChip_I2C_BASE, sys_clock, I2C_100kHz_CLOCK); } uint32_t I2C_read(uint32_t ulBase, uint8_t chip_address, uint8_t internal_address) { //Send Chip Hardware Address and Internal address of the register to write the date ROM_I2CMasterSlaveAddrSet(ulBase, chip_address, false); // Specify slave address with read request set to false ROM_I2CMasterDataPut(ulBase, internal_address); //Place the Internal register address ROM_I2CMasterControl(ulBase, I2C_MASTER_CMD_SINGLE_SEND); // Initiate send of 1Byte character from Master to Slave while (!(ROM_I2CMasterBusy(ulBase))); //Wait till end of transaction while(I2CMasterBusy(ulBase)); // not busy //Receive Data ROM_I2CMasterSlaveAddrSet(ulBase, chip_address, true); // Specify slave address with read request set to true ROM_I2CMasterControl(ulBase, I2C_MASTER_CMD_SINGLE_RECEIVE);// Initiate send of character from Master to Slave while (!(ROM_I2CMasterBusy(ulBase))); //Wait till end of transaction while(I2CMasterBusy(ulBase)); //Read Receive Data from FIFO return (ROM_I2CMasterDataGet (ulBase)); //Read from FIFO }
非常感谢您的观看。