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.

[参考译文] TM4C1290NCPDT:突发模式 I2C 运行不一致

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1356462/tm4c1290ncpdt-burst-mode-i2c-not-operating-consistently

器件型号:TM4C1290NCPDT

我有一个主突发模式功能、该功能有时工作正常、但更常见的情况是不发送第一个数据字节。  代码如下:

void InitI2C (void){

   //--地址为0x38的背光灯,地址为0xf8的蜂鸣器--//

   I2CMasterInitExpClk (I2C2_base、GetClkSpeed ()、I2C_100K);  //主器件、100Kbps。

   //--地址为0xD0的实时时钟----//

   I2CMasterInitExpClk (I2C0_BASE、GetClkSpeed ()、I2C_100K);  //主器件,100Kbps。

void RtcWrite (u8寄存器、u8数据){

   while (I2CMasterBusy (I2C0_BASE){}                            //等待完成。
   I2CMasterSlaveAddrSet (I2C0_BASE、rtcAddr、I2CWrite);          //这会将 addr 向左移动1。
   I2CMasterDataPut (I2C0_BASE、寄存器);                        //
   I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START); //寄存器。
   while (I2CMasterBusy (I2C0_BASE){}                            //等待完成。
   I2CMasterDataPut (I2C0_BASE、Data);                            //
   I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);// Data。

"寄存器"为0x02、"数据"为0x01。  有时它运行正常:

但更常见的情况是、不发送寄存器值:

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

    尊敬的 Doug:

     您是否可以替换代码中的任意位置:

    发件人:

      while (I2CMasterBusy (I2C0_BASE)){}                

    至:

       while (! I2CMasterBusy (I2C0_base){}                            // 添加此行

       while (I2CMasterBusy (I2C0_BASE){}                            // 保留该原始行

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

    尊敬的 Charles:

    虽然没有解决这个问题、但它确实以不同的方式工作。  与昨天不同的一点是、我发现要复位 IC、我需要设置复位位位位位位、但将其设置回零、所以我第二次调用 RtcWrite()、Register = 2和 Data = 0。  现在第一次传输是不同的、它不是发送寄存器编号而不是数据、现在不是发送寄存器、而是发送数据。  第二次传输是将 Data 设置回0、似乎始终工作正常。

    谢谢、Doug

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

    等等,还有更多!

    我添加了:

    while (! I2CMasterBusy (I2C0_base){}                            // 添加此行

    while (I2CMasterBusy (I2C0_BASE){}                            // 保留该原始行

    直到我的代码结束,所以它不返回之前一切完成,现在它工作正常,虽然第一次 RtcWrite()被称为它可能不-将不得不改变我的测试一点检查。

    道格

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

    好的、第一个呼叫工作正常。  我将要摆弄更多的东西、启用 FIFO、中断驱动等、但现在我们把它叫做解决问题。

    谢谢 Charles。