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.

[参考译文] TM4C1230D5PM:ROM_UpdateI2C 在调用时锁定

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1085278/tm4c1230d5pm-rom_updatei2c-locks-up-when-i-call-it

部件号:TM4C1230D5PM

调用 ROM_UpdateI2C 的代码

//禁用看门狗计时器
HWREG (sysctl_RCGCWD)= 0;

//关闭计时器中断
TimerIntDisable (TIMER5_BASE,TIMER-TIM_TIMEOUT);
IntMasterDisable();
//除了已启用的从属设备之外,还启用 i2c0主设备
HWREG (I2C0_BASE + I2C_O_MCR)|= I2C_MCR_MFE;

ROM_UpdateI2Ic();

我发送的 I2C 线路上的  

0x20 0x03 0x20 0x20 (I2C 从地址为0x10)

阅读0x00返回

在下一次尝试写入芯片时,两条 I2C 线路都被拉低。  时钟线 SCL 持续200毫秒。  在重置芯片之前,SDA 线不会释放

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

    你好,杰弗里,

    因此,ROM_UpdateI2C 函数要求已经正确配置 I2C 总线-我看到您在那里启用了 I2C 总线,但要使其运行,您还需要启用主时钟/设置从地址 。 我也看不出您是如何配置从端的。

    我强烈怀疑问题是 I2C 外围设备中的某些设备未完全配置。

    以下是我们的用户指南中的准确描述,以明确说明:

    此函数假定 I2C0接口已配置且当前可运行。 I2C0从属设备用于数据传输,I2C0主设备用于监控总线繁忙状态(因此,必须启用两者)。

    此致,

    拉尔夫·雅各比

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

    该应用程序以前将 I2C0作为从属设备启用,并在调用 ROM_UpdateI2C 之前成功通信。

    作为进一步的实验,我在启用后将设置线路设定为时钟。  这没有效果。

           //除了已启用的从属设备之外,还启用 i2c0主设备
           HWREG (I2C0_BASE + I2C_O_MCR)|= I2C_MCR_MFE;
           HWREG (I2C0_BASE + I2C_O_MTPR)= 0x09;

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

    使用 i2c.c 中的函数

    void setup_i2c_ez_Slave (无效)

       //将时钟连接到 i2c0
           //
       //必须先启用设备,然后再执行其他操作。
       //第一个设置时钟
       SysPeripheralEnable (sysctl_Periph_I2C0);

       //在端口 B2和 B3上配置 I2C0功能的插针互锁。
       //如果您的零件不支持销钉粘接,则不必执行此步骤。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinConfigure (GPIO _PB2_I2C0SCL);
       GPIOPinConfigure (GPIO _PB3_I2C0SDA);

       //
       //为这些引脚选择 I2C 函数。  此功能也会
       //为 I2C 操作配置 GPIO 引脚,将其设置为
       //漏极开路操作,拉拔较弱。  请参阅数据表
       //查看每个引脚分配的函数。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinTypeI2CSCL (GPIO _PORTB_BASE,GPIO _PIN_2);
       GPIOPinTypeI2C (GPIO _PORTB_BASE,GPIO _PIN_3);

       //
       //在处理器(NVIC)上启用 I2C0中断。
       //
       //IntEnable(INT_I2C0);
       I2CIntRegister (I2C0_base,I2C0SlaveIntHandler);

       //
       //配置并打开 I2C0从中断。  I2CSlaveIntEnableEx()
       //使您能够仅启用特定中断。  在这种情况下
       //我们只是在从属设备接收数据或请求数据时中断。
       //
       I2CSlaveIntEnableEx (I2C0_base,I2C_SLAVE_INT_DATA);

       //
        //启用 I2C0从模块。
        //
       I2CSlaveEnable(I2C0_base);

       //
       //将从属地址设置为从属地址
       //
       I2CSlaveInit (I2C0_base,0x10);

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

    你好,杰弗里,

    [引用 userid="506832" url="~ë/support/icros/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1085278/tm4c1230d5pm -rom_update2c-lock-up-when i-call-it"]

    我发送的 I2C 线路上的  

    0x20 0x03 0x20 0x20 (I2C 从地址为0x10)

    阅读0x00返回

    [/引用]

    当我再次查看您的帖子时,我必须更多地考虑这一点,我不确定您是否正在将数据正确发送到引导加载程序。

    有一种特定的数据包格式,需要用于所有串行引导加载器(UART/I2C/SPI)。

    我们的《引导加载程序用户指南》第5.1节明确涵盖了这一点: https://www.ti.com/lit/pdf/spmu301

    请仔细阅读,如果您认为此处适用,请告诉我。 我并不完全确定如何对数据包解码,但我认为它没有数据长度或校验和。

    此致,

    拉尔夫·雅各比

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

    从在 boot_loader 中检查源,现在可以清楚地看到我需要读回2个字节,而不是1个字节。

    读回2个字节后,一切都很好