This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:带有 TCA9555的 TM4C1294NCPDT I2C 接口无法正常工作

Guru**** 2390735 points
Other Parts Discussed in Thread: TM4C1294NCPDT, TCA9555

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1213474/tm4c1294ncpdt-tm4c1294ncpdt-i2c-interface-with-tca9555-not-working

器件型号:TM4C1294NCPDT
主题中讨论的其他器件: TCA9555TM4C123

我正在尝试将基于 TCA9555的 LED 显示板连接到 i2c。   已在 TM4C1294NCPDT 中使用 I2C0。   在 TCA9555中将 Port0配置为输出。  但 LED 未亮起。  如下代码片段。

void initi1 (void)


//
//启用 I2C0外设
//
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
//
//等待 I2C0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0)

}

//
//初始化主设备和从设备
//
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true);//400速度
//
//指定从机地址
//
I2CMasterSlaveAddrSet (I2C0_BASE、0x27、false);//0x27是地址和只写
//
//将要发送的字符放入数据寄存器中
//
I2CMasterDataPut (I2C0_BASE、0x06);//configuration 寄存器命令
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

while (I2CMasterBusy (I2C0_BASE));
I2CMasterDataPut (I2C0_BASE、0x00);//配置寄存器写入位
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

while (I2CMasterBusy (I2C0_BASE));
I2CMasterSlaveAddrSet (I2C0_BASE、0x27、false);//0x27是地址和只写
I2CMasterDataPut (I2C0_BASE、0x02);// DATA 寄存器命令
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

while (I2CMasterBusy (I2C0_BASE));
I2CMasterDataPut (I2C0_BASE、0xAA);// DATA 寄存器数据
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

}

我刚刚尝试了 TivaWare 外设驱动程序库示例、其中添加了专门针对 TCA9555的代码。

我们将感谢您的帮助。

此致、

Ramesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     不能 为以下 API 使用 SysCtlClockGet ()。  SysCtlClockGet ()仅适用于 TM4C123 MCU、不适用于 TM4C129。 必须传递 TM4C129 MCU 的 SysCtlClockFreqSet ()返回值。  

    I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true);//400速度

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。  我已更新代码。  但仍有 LED 未显示。  更新了下面的代码

    void initiic1 (uint32_t sysclk)

    iicerr =0x0;
    //
    //启用 I2C0外设
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    //
    //等待 I2C0模块准备就绪。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0)

    }

    GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    GPIOPinConfigure (GPIO_PB3_I2C0SDA);
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
    I2CMasterEnable (I2C0_BASE);
    iicerr=1;
    //
    //初始化主设备和从设备
    //
    I2CMasterInitExpClk (I2C0_BASE、systclk、true);//400速度
    //
    //指定从机地址
    //
    while (I2CMasterBusy (I2C0_BASE));
    I2CMasterSlaveAddrSet (I2C0_BASE、0x27、false);//0x27是地址和只写
    //
    //将要发送的字符放入数据寄存器中
    //
    I2CMasterDataPut (I2C0_BASE、0x06);//configuration 寄存器命令
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

    while (I2CMasterBusy (I2C0_BASE));
    I2CMasterDataPut (I2C0_BASE、0x00);//配置寄存器写入位
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

    while (I2CMasterBusy (I2C0_BASE));
    I2CMasterSlaveAddrSet (I2C0_BASE、0x27、false);//0x27是地址和只写
    I2CMasterDataPut (I2C0_BASE、0x02);// DATA 寄存器命令
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

    while (I2CMasterBusy (I2C0_BASE));
    I2CMasterDataPut (I2C0_BASE、0xFF);// DATA 寄存器数据
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);


    iicerr= I2CMasterErr (I2C0_BASE);

    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

     我不熟悉 TCA9555。 通过读取 TCA9555数据表、可以看出您输出了从器件地址、寄存器地址、然后是要写入寄存器的数据。  

    您能否使用逻辑分析仪捕获 I2C 总线? 它与上述交易顺序有何区别?

    还有要检查的事项:

     -你是否在 SCL 和 SDA 总线上有一个上拉电阻器?

     - TCA9555是否以400kbps 的速率运行? 您的 I2C 配置为400K。 我建议您先从标准模式开始、速率为100kbps。 在改为400K 之前、确保一切正常。  

     - TCA9555是否配置为0x27作为从地址?