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.
工具/软件: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);
}
}
感谢您的参与和支持。