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.

[参考译文] MSP430F5659:I2C主启动而不发送从属地址

Guru**** 2534260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/571950/msp430f5659-i2c-master-start-without-sending-slave-address

部件号:MSP430F5659

您好,
我正在使用一个自制驱动程序在MSP430 (F5659)µC作为主芯片和另一个芯片之间进行I2C通信。
大多数情况下都很好,但在数据表无法解释的情况下,我感到很惊讶。

该错误发生在可能的CEM从测试台干扰到I2C线路之后,但一旦I2C periphal处于这种状态,我每次启动传输时都会重现它,并在每个环路上看到相同的东西(不会出现进一步的峰值)。

我处于主模式。 总线以正确的状态启动,SDA和SCLK均为高。 我的驱动程序尝试发送的操作如下:

-设置从属地址
-设置传输模式(UCTR = 1)
-发送开始(STT = 1)
-等待Tx标志

然后,剩下的是重复的开始和读取,但即使在这里有一个断点,我也已经感到奇怪了:

发送起始地址,但不按规定后跟从属地址,而是由MSP发送数据缓冲区TX缓冲器的内容

我想我在这个序列之前已经设法将I2C状态机设置为错误的状态,但我看不到总线上的启动没有后面跟着从属地址的任何情况。
是否有任何可能的情况?

如果MSP认为它只是发送另一个字节,它是否会通过降低SDA并使用高时钟来发送总线上的启动?

下面是我的示波器在运行序列时看到的内容。
06是TXBUFF的内容,当I2CSA中的从属地址为0x044时,调试器前后都已确认。
很明显,从属设备不能识别地址并且不能确认,所以我的驱动程序发送了一个停止。 然后我可以反复再现它。

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

    感谢您提供详细说明。 我以前从未见过此问题,如果没有看到生成此问题的代码,我就无法从您提供的示波器中获取大量信息。 能否提供USCI初始化和中断代码的片段?

    此外,您是在多个设备上看到这种情况,还是仅在经历CEM干扰的设备上看到这种情况。

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

    这是我的INIT代码。 正如您所看到的,我已经在外围设备上绘制了结构图,但这很好,我的驱动程序已经正常运行了几个月。 我保留了登记册的原始名称,以便您识别它们。

    //初始化引脚
    
    //将引脚设置为I2C模式
    McuGpio_G_P78Regs_S.Pxysel_U.Bit.13_UW_1bit = 0b1;// UART模式
    McuGpio_G_P78Regs_S.Pxysel_UX.14_2c_1bit = 0b1;// Ub_1ub_Ub_1uc1ub_Ub_1ub_Ub_1uc1ub_Ub_US_S.Pc_
    
    
    
    
    
    
    
    
    //选择SMCLK作为时钟源
    
    // SMCLK = 4MHz / 100 = 40kHz
    McuI2c_G_Ucb1Regs_S.Ucbxbr_uw = 100;//SMCLK /x
    
    McuI2c_G_Ucb1Regs_S.Ucbs_S.Ub_S.Ucmst_1b_1bbit_1Ub_0
    
    
    = Ub1cm_1b_1b_0;Ubcub_1b_0 = Ub_1b_1b_1b_1b_Ubcub_0 = Ubcub_1cub_0 = Ub_1cub_0
    // UCA10 = 0:7位寻址自
    
    McuI2c_G_Ucb1Regs_S.Ucbxctl1_S.Ucswrst_ub_1bit = 0b0;//释放reset以开始操作 

    驱动程序不是在中断上工作,而是直接在具有等待循环的阻塞序列中工作。
    在init和bug之间发生了几次传输,所有操作都很好:


    //设置从属地址
    McuI2c_G_Ucb1Regs_S.Ucbxi2Csa_S.I2CSax_UW_10bit =(G_UWord_t) P_SlaveAddress_ub;//只使用7位地址。
    
    //将方向设置为Tx
    McuI2c_G_Ucb1Regs_S.Ucbxctl1_S.Uctr_ub_1bit = 0b1;//发送
    
    启动
    McuI2c_g_Ucb1Regs_S.Ucbxctl1_S.Uctxstt_ub_1bit = 0b;//
    
    发送的Slave_E-要
    
    发送
    的地址,要在此处发送,要发送的地址是Tx_E (要发送)
    
    如果(L_errorstate_E == DRVI2C_P_NO_ERROR_E)
    {//
    数据地址字节1.
    
    //开始为ack计时,然后通过写入TxBuf发送字节
    McuI2c_G_Ucb1Regs_S.Ucbxtxbuf_UB = P_DataAddress_UB;
    //如果已收到ACK,则TxFlag应上升
    L_errorstate_E = DrvI2c_P_WaitTxNackFlag_E(); 
    ....

    DrvI2c_P_WaitTxNackFlag_E()函数在循环中等待Tx标志或nack标志:

    while ((McuI2c_G_Ucb1Regs_S.Ucbxifg_U.Bits.Uctxifg_Ub_1bit == 0)// TX标志
    &&(McuI2c_G_Ucb1Regs_S.Ucbxifg_U.Bits.Ucnackifg_Ub_1bit == 0)// nack标志
    &&(L_Timeout_UW < DRVI2C_P_timeout_UW)...
    

    我不能在多个主板上测试此功能,目前我只有一个主板。
    摄动是来自高电流线路上的一个通过倍硫化继电器的峰值,我在示波器上看到它,所以I2C线路可以看到它。但是,这是早在通信尝试开始之前。 该错误随机出现,然后我可以反复尝试启动,直到使用UCSWRST位重置外设。

    我看起来外围设备相信它正在传输中,只是我看不出它为什么在线路上发送正确的启动。
    现在,我会在驱动程序发生时重置驱动程序,但我想阻止它,我希望当我们了解它如何发生时,我也能做到这一点。

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

    您的代码似乎所有设置都正确,我同意设备似乎使用TXBUFF的内容作为从属地址。 我想看看I2C线路上的扰动的示波器,以了解该设备可能承受的应力类型。

    这不是一个常见的问题,干扰很可能违反了I2C标准,使I2C状态机处于某种未知状态。 我认为最好的解决方案是确保I2C线路看不到干扰。

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

    您好,Caleb,
    感谢您的回答。

    这是I2C线路的干扰(在示波器上被视为数字)。
    你可以看到脉搏在我所有的信号中随机地跳动。
    这显然不应该在实际条件下发生,我也不希望串行periph处理它。

    我只是希望我错过了一些东西和/或这种奇特的状态对你来说意味着什么,它会让我事先发现它或者以某种方式阻止它。

    我无法识别可提供相关指示的状态标志。

    我通过在出现错误时使用UCSWRST位重新发送外设来解决部分问题。
    管理失败的帧更复杂...

    至少它解决了我不知道如何在总线上测试我的健壮功能的问题:)

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

    您是否能够隔离I2C线路并防止干扰影响MSP430?

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

    您好,

    是的,我们用铝箔将线缆隔离开来,这样就能正常工作。

    我的测试台现在看起来如此闪亮 :o)

    我只是希望我不需要向客户展示...