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.

[参考译文] CCS/TM4C129ENCPDT:从 MSP430到 TM4C -缺失 I2C 数据

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/939962/ccs-tm4c129encpdt-from-msp430-to-tm4c---misses-i2c-data

器件型号:TM4C129ENCPDT
主题中讨论的其他器件: MSP430FR2522

工具/软件:Code Composer Studio

您好!

我们正在开发一款 TM4C129ENCPDT (I2C 主设备)与多个 MSP430FR2522IPW16 (I2C 从设备)通信 的产品。  

我已获取为 MSP430的 i2c 提供的 i2c 示例代码、并将其修改为用作轮询方法。

为了检查目的并理解 I2C 主从概念、我连接了 TM4C 和一个 MSP430 IC、并从 TM4C I 请求连续数据、然后从 MSP430响应从1、2、3开始的请求... 255.

TM4C 代码(I2C 主设备):

while (1)

UARTprintf ("从器件1的数据(0x0A):\n");
UARTFlushTx (false);

I2CMasterSlaveAddrSet (I2C1_base、0x0A、true);
SysCtlDelay (40000*10);

for (i=0;i<5;i++)

I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_Receive);

//等待 MCU 完成事务
//while (I2CMasterBusy (I2C1_base));

SysCtlDelay (40000);
// while (!(I2CMasterBusy (I2C1_base)));//等待事务结束
while (I2CMasterBusy (I2C1_base));//等待事务结束
SysCtlDelay (40000);

//返回从指定寄存器提取的数据
RX_DATA = I2CMasterDataGet (I2C1_base);

UARTprintf ("rx_data=%d\n"、rx_data);
UARTFlushTx (false);

MSP430代码(I2C 从设备):

//将 USCI_B0配置为 I2C 模式
UCB0CTLW0 = UCSWRST;//软件复位被使能
UCB0CTLW0 |= UCMODE_3 | UCSYNC;// I2C 模式、同步模式
UCB0I2COA0 = 0x0A | UCOAEN;//自身地址为0x48 +使能
UCB0CTLW0 &=~UCSWRST;//清除复位寄存器

unsigned char i=0;

volatile unsigned char TXData = 1;
while (1)

IF (UCB0IFG 和 UCTXIFG0)

UCB0IFG &=~UCTXIFG0;//清除 Tx 条件 int 标志
UCB0TXBUF = TXData++;
P2OUT |= BIT2;__DELAY_CYCLES (100000);P2OUT ^= BIT2;__DELAY_CYCLES (100000); //一些 LED 指示数据请求已发出

P1OUT ^= BIT0;__DELAY_CYCLES (100000);//一些 LED 指示代码在无限时间内仍在运行

从 TM4C 侧读取数据时、我缺少一些数据、如图所示。

感谢你能抽出时间!

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

    您好!

     在调用 I2CMasterControl()后,是否可以像下面那样尝试添加以下两行?

    I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_Receive);

    while (!(I2CMasterBusy (I2C1_base)));//首先添加此内容

    while (I2CMasterBusy (I2C1_base));//添加此第二个

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

    感谢您的快速回复。

    我试过它。 但它不起作用。

    我想问题是 MSP430方面。

    因为。 我使用 DSO 进行了检查、时序图与我获得的数据相匹配。

    MSP430 TX 缓冲区在传输之前是否有可能被更新? 这种情况发生在一个看起来像是 Tiva 未命中数据的准确的定时间隔内。

    感谢你能抽出时间。

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

    您好!

     让我们确保问题确实出在 MSP430方面。 您能否在发现问题的地方展示逻辑分析仪或示波器捕获。 我提出的原因是、我只能在 Tiva 方面提供帮助、因为该论坛的专业知识主要是在 TM4C MCU 上。 如果问题出在 MSP430方面、我将需要您在 MSP 论坛组中打开一个新主题、或者我可以将此帖子移到这里。  

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

    谢谢 Charles。

    我将很快上传 DSO 捕获。

    我怀疑 MSP430的原因是、每当我从 TM4C MCU 收到传入数据请求时、连接到 MSP430 GPIO P2.2的 LED 都会闪烁。 (有关闪烁部件、请参阅以下行)

    P2OUT |= BIT2;__DELAY_CYCLES (100000);P2OUT ^= BIT2;__DELAY_CYCLES (100000); //一些 LED 指示数据请求已发出

     

    在 TM4C 端、我请求五个字节的数据、即我请求五个字节的数据、然后等待2秒的延迟、再次请求五个字节的数据、最后等待2秒的延迟。  

    如果一切正常、LED 应每2秒闪烁5次。 但它闪烁6次。  

    第6次闪烁的 LED 可确保即使我仅从 TM4C 请求5个字节的数据、"IF 条件"  MSP430也会在一个额外的时间内变为真、这是没有实际数据传输发生的地方、但 Tx 数据存储器会增加1。

    我用来检查 MSP430中是否有传入请求的 IF 条件是

    IF (UCB0IFG 和 UCTXIFG0)  

    希望上述情况得到纠正、问题就会得到解决。

    如果您将此帖子移至包含上述所有对话主题的 MSP430论坛、那将会非常有帮助。  

    感谢您的参与和支持!

     

     

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

    好的、我会将您的帖子转至 MSP430以获得进一步的指导。  

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

    您好!  

    TM4C 中的 I2C 速度设置是什么? I2C 信号的上拉电阻是多少? 是否可以降低 I2C 速度并重试?  

    谢谢、  

    Lixin

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

    您可以尝试调试 MSP430FR2522、以检查 TXData=6时是否发送了 I2C 数据。 如果是、您可以检查 TM4C 是否已收到它。  

    还建议使用示波器探测 I2C 信号、以检查 是否从 MSP430发送 TXData=6。  

    谢谢、  

    Lixin  

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

    您好!

    很抱歉、我无法更新您。  

    问题已解决。 在 MSP430代码中、 我没有只检查来自 TM4C 端的数据请求的 UCTXIFG0标志、而是检查 了 UCTXIFG0和 UCSTTIFG  标志。 通过试用和错误方法发现了这一点。

    不知道它是否正确。 但满足了我的要求。  

    int count =0;
    字符 c;
    while (1)

     // UCB0TXBUF ='Z';
     if (((UCB0IFG & UCTXIFG0)&&(UCB0IFG & UCSTTIFG))
     {  
     UCB0TXBUF = CHIP_DATA[COUNT++];
     UCB0IFG &=~UCSTTIFG;//清除启动条件 int 标志
     UCB0IFG &=~UCTXIFG0;//清除 Tx 条件 int 标志
     // UCB0TXBUF = TXData0[count++];
     _delay_cycles (10000);
     if (count = size){break;}
     //D5_on __delay_cycles (150000);D5_off __delay_cycles (150000);
     }

    感谢您的参与和支持。