主题中讨论的其他器件: 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 侧读取数据时、我缺少一些数据、如图所示。
感谢你能抽出时间!