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.

[参考译文] LAUNCHXL-F28379D:I2C:第二次传输不能#39;t START

Guru**** 2524460 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027442/launchxl-f28379d-i2c-second-transfer-doesn-t-start

器件型号:LAUNCHXL-F28379D

我正在尝试学习如何在28379D 处理器上使用 I2C、并遇到一些问题。 问题是数据的第二部分传输不会开始。

此处显示代码:

    //点 a:代码开始   

       I2C_setDataCount (I2C_base、2);
       I2C_sendStopCondition (I2C_base);
       I2C_sendStartCondition (I2C_base);       
                                               
       I2C_putData (I2C_base、0xAC);            
       while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base);    //等待字节传输完成并读回它(请参阅下面的注释)
       I2C_putData (I2C_base、0x02);                                                        
       while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base);

       //等待 I2CMDR.STP 被清除
       while (I2C_getStopConditionStatus (I2C_base));

       //等待清除总线忙位
       while (I2C_isBusy (I2C_base));

       //点 B:数据的第一部分被传输

       //尝试发送第二部分数据

       I2C_setDataCount (I2C_base、1);
       I2C_sendStopCondition (I2C_base);
       I2C_sendStartCondition (I2C_base);
       I2C_putData (I2C_base、0xEE);            

       //点 C:代码结束
       while (1);

注释。 我不使用 FIFO 和中断、由于实际 I2C 从设备的潜逃、我使用数字回送模式。 因此、我将 RRDY 位监控为字节传输完成的标志。

在代码开始(A 点)之前、I2C-B 寄存器如下所示:

I2cbRegs   I2C 寄存器    
   I2COAR   0x0048   I2C 自有地址 [存储器映射]    
   I2CIER   0x0000   I2C 中断使能 [存储器映射]    
   I2CSTR   0x0410   I2C 状态[存储器映射]    
   I2CCLKL   0x002D   I2C 时钟低电平时间分频 器[存储器映射]    
   I2CCLKH   0x002D   I2C 时钟高电平时间分频 器[存储器映射]    
   I2CCNT   0x0000   I2C 数据计数[存储器映射]    
   I2CDRR   0x0000   I2C 数据接收[存储器映射]    
   I2CSAR   0x0048   I2C 从器件地址[存储器映射]    
   I2CDXR   0x0000   I2C 数据发送 [存储器映射]    
   I2CMDR   0x4660   I2C 模式 [存储器映射]    
   I2CISRC   0x0000   I2C 中断源[存储器映射]    
   I2CEMDR   0x0001   I2C 扩展模式 [存储器映射]    
   I2CPSC   0x0013   I2C 预分频 器[存储器映射]    
   I2CFFTX   0x0000   I2C FIFO 发送 [存储器映射]    
   I2CFFRX   0x0000   I2C FIFO 接收 [存储器映射]    

在数据的第一部分被传输后、我会在逻辑分析仪上看到它的序列

                 START、0x90、0xAC、0x02、STOP

现在一切都正常。

此时 i2c-regs 的值:

I2cbRegs   I2C 寄存器    
   I2COAR   0x0048   I2C 自有地址 [存储器映射]    
   I2CIER   0x0000   I2C 中断使能 [存储器映射]    
   I2CSTR   0x0430   I2C 状态[存储器映射]    
   I2CCLKL   0x002D   I2C 时钟低电平时间分频 器[存储器映射]    
   I2CCLKH   0x002D   I2C 时钟高电平时间分频 器[存储器映射]    
   I2CCNT   0x0002   I2C 数据计数[存储器映射]    
   I2CDRR   0x0002   I2C 数据接收[存储器映射]    
   I2CSAR   0x0048   I2C 从器件地址[存储器映射]    
   I2CDXR   0x0002   I2C 数据发送 [存储器映射]    
   I2CMDR   0x4260   I2C 模式 [存储器映射]    
   I2CISRC   0x0000   I2C 中断源[存储器映射]    
   I2CEMDR   0x0001   I2C 扩展模式 [存储器映射]    
   I2CPSC   0x0013   I2C 预分频 器[存储器映射]    
   I2CFFTX   0x0000   I2C FIFO 发送 [存储器映射]    
   I2CFFRX   0x0000   I2C FIFO 接收 [存储器映射]    

但在第二次调用 I2C_sendStartCondition (I2C_base)时不会发生任何情况;- SCL 或 SDA 线路上没有任何脉冲。

在 C i2c-regs 看起来是:

I2cbRegs   I2C 寄存器    
   I2COAR   0x0048   I2C 自有地址 [存储器映射]    
   I2CIER   0x0000   I2C 中断使能 [存储器映射]    
   I2CSTR   0x0420   I2C 状态[存储器映射]    
   I2CCLKL   0x002D   I2C 时钟低电平时间分频 器[存储器映射]    
   I2CCLKH   0x002D   I2C 时钟高电平时间分频 器[存储器映射]    
   I2CCNT   0x0001   I2C 数据计数[存储器映射]    
   I2CDRR   0x0002   I2C 数据接收[存储器映射]    
   I2CSAR   0x0048   I2C 从器件地址[存储器映射]    
   I2CDXR   0x00EE   I2C 数据发送 [存储器映射]    
   I2CMDR   0x6A60   I2C 模式 [存储器映射]    
   I2CISRC   0x0000   I2C 中断源[存储器映射]    
   I2CEMDR   0x0001   I2C 扩展模式 [存储器映射]    
   I2CPSC   0x0013   I2C 预分频 器[存储器映射]    
   I2CFFTX   0x0000   I2C FIFO 发送 [存储器映射]    
   I2CFFRX   0x0000   I2C FIFO 接收 [存储器映射]    

您可以看到 MDR.STT 已启用、但没有任何数据传输。

我尝试使用中断、但仍然没有成功。

我弄错了什么?

此致、
Alex

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

    我们正在研究这一问题,我们希望专家能在一天内回来。 谢谢。

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

    在生成停止条件后、一切似乎都停止了。 我更改了一个位代码:禁用停止的自动生成、使用 ARDY 位作为传输完成的标志并生成第二个开始:

           I2C_setDataCount (I2C_base、2);
    //       I2C_sendStopCondition (I2C_base);
           I2C_sendStartCondition (I2C_base);
           I2C_putData (I2C_base、0xAC);            

           while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base);
           I2C_putData (I2C_base、0x02);
           while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base);

           while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_REG_ACCESS_RDY)= 0);

           I2C_setDataCount (I2C_base、1);
           I2C_sendStartCondition (I2C_base);
           I2C_putData (I2C_base、0xEE);            

           while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base);

           while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_REG_ACCESS_RDY)= 0);

           I2C_sendStopCondition (I2C_base);


           //等待清除总线忙位
           while (I2C_isBusy (I2C_base));
           I2C_sendStartCondition (I2C_base);       
           I2C_putData (I2C_base、0x44);            


           while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base);    //<---  D 点、while 循环未完成

           while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_REG_ACCESS_RDY)= 0);

           I2C_sendStopCondition (I2C_base);

           while (1);

    代码在 D 点挂起。在逻辑分析仪上、我看到了

         START、0x90、0xAC、0x02、Start、 0x90、0xEE、停止

    就这些。 在我期待看到的停止之后

         START、0x90、0x44、STOP

    但我在第一次停止后看不到任何脉冲。

    D 点处的 I2C-B 寄存器(代码挂起的地方)为:

    I2cbRegs   I2C 寄存器    
       I2COAR   0x0048   I2C 自有地址 [存储器映射]    
       I2CIER   0x0000   I2C 中断使能 [存储器映射]    
       I2CSTR   0x0420   I2C 状态[存储器映射]    
       I2CCLKL   0x002D   I2C 时钟低电平时间分频 器[存储器映射]    
       I2CCLKH   0x002D   I2C 时钟高电平时间分频 器[存储器映射]    
       I2CCNT   0x0001   I2C 数据计数[存储器映射]    
       I2CDRR   0x00EE   I2C 数据接收[存储器映射]    
       I2CSAR   0x0048   I2C 从器件地址[存储器映射]    
       I2CDXR   0x0044   I2C 数据发送 [存储器映射]    
       I2CMDR   0x6260   I2C 模式 [存储器映射]    
          NACKMOD   0   NACK 模式位    
          免费   1   调试操作    
          STT   1   起始条件位    
          STP   0   停止条件    
          MST   0   主控模式    
          TRx   1   发送器模式    
          XA   0   扩展地址模式    
          RM   0   重复模式    
          DLB   1   数字环回模式    
          IRS   1   I2C 模块复位    
          STB   0   起始字节模式    
          FDF   0   自由数据格式    
          BC   000   位计数位。    
       I2CISRC   0x0000   I2C 中断源[存储器映射]    
       I2CEMDR   0x0001   I2C 扩展模式 [存储器映射]    
       I2CPSC   0x0013   I2C 预分频 器[存储器映射]    
       I2CFFTX   0x0000   I2C FIFO 发送 [存储器映射]    
       I2CFFRX   0x0000   I2C FIFO 接收 [存储器映射]    

    MDR.STT 激活、但没有传输。

    此致、
    Alex

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

    以下是逻辑分析仪的屏幕截图:

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

    看起来 MDR.MST 位是0。 当一个停止条件被生成时、它被自动清零。 我怀疑您需要再次设置它以启动下一个传输。

    惠特尼

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

    Whitney、

    你绝对是对的。 非常感谢!

    此致、
    Alex