主题中讨论的其他部件:MSP430F2122,
工具/软件:TI C/C++编译器
大家好,
我在一个有通信的项目上工作。
PCB上有两个芯片,分别是MSP430F2122 (I2C主)和MSP430F5632 (I2C从)
该项目的运作是:
2122将UART数据传输到芯片1 -> 2122从芯片1接收UART数据-> 2122将UART数据传输到芯片2 ->...(轮询到项目的所有芯片)-> 2122将I2C数据读写到5632 -> 2122将UART数据传输到芯片1 -> 2122从芯片1接收UART数据->...(重复)
重置整个系统后,每个操作都似乎正常。
UART可以以与我的设置相同的正确方式运行,并且在通信过程中不会丢失数据。
但是,当2122运行I2C通信数次时,2122就会一直处于重置状态。(当I2C卡住时,我清除WTDCTL以重置2122)
如何解决I2C通信错误的问题?
我想在2122或5632中有一些问题,但我不知道原因。
协议如下:
I2C操作频率:约100KHz
地址5633 (I2C从机):0x48
数据数达到5633:57字节
5633中的数据数:4字节
代码如下所示,
2122:
void I2C_Multiple_Read_Write (无符号字符长度,无符号短号读取)
{
无符号int I;
无符号短循环;
_DINT();
while (UCB0STAT和UCBUSY);//等待I2C模块具有
//已完成所有操作
//传输
UCB0CTL1 || UCTR;// UCTR = 1 =>传输模式
IFG2 &=~UCB0TXIFG;//禁用接收就绪中断
IE2 &=~UCB0RXIE;//启用传输就绪中断
IE2 |= UCB0TXIE;
UCB0CTL1|= UCTXSTT;//发送启动条件
while (UCB0CTL1和UCTXSTT)//确保发送了启动条件
{
IF(!(UCNACKIFG & UCB0STAT))//如果收到ACK,则中断
中断;
}
用于(loop=0;loop<Length;loop++)
{
while (!(IFG2 & UCB0TXIFG));//检查UCB0TXBUF=空
UCB0TXBUF = I2C_DATA[循环];
i=0;
同时(!(IFG2和UCB0TXIFG))
{
//如果i2c挂起,则忽略I2C数据
I++;
如果(i=9999)
//中断;
WDTCTL =0;//重置
}
}
// while (!(UCB0IFG & UCTXIFG));//检查UCB0TXBUF=空
//接收
UCB0CTL1 &=~UCTR;// UCTR = 0 =>接收模式
IFG2 &=~UCB0RXIFG;
IE2 &=~UCB0TXIE;//禁用传输就绪中断
IE2 |= UCB0RXIE;//启用接收就绪中断
UCB0CTL1 || UCTXSTT;//发送启动条件
i=0;
while (UCB0CTL1和UCTXSTT)//确保发送了启动条件
{
IF(!(UCNACKIFG & UCB0STAT))//如果收到ACK,则中断
中断;
}
对于(loop=0;loop<number_of_read;loop++)
{
while (!(UCB0RXIFG & IFG2));//重新接收数据
UART_DATA[LOU]=UCB0RXBUF;
}
UCB0CTL1 || UCTXSTP;//发送停止条件
while (UCB0CTL1和UCTXSTP);//确保已发送停止条件
__no_operation();
UCB0CTL1 |= UCSWRST;
UCB0CTL1 &=~UCSWRST;
_EINT();
}
5632:
#pragma vector = USI_B1_Vector
__interrupt void USI_B1_ISR(void)
{
SWITCH(__EIV_IN_RANGE(UCB1IV,12))
{
案例0://矢量0:无中断
中断;
案例2://矢量2:ALIFG
中断;
案例4://矢量4:NACKIFG
中断;
案例6://矢量6:STTIFG
UCB1IFG &=~UCSTIFG;
中断;
判例8://矢量8:STPIFG
UCB1IFG &=~UPSTPIIFG;
IF ((I2C_Stat & 0x40)=0x40)
{
I2C_Stat=0;
UCB1IE &=~UCTXIE;//禁用I2C的TX中断
}
中断;
案例10://矢量10:RXIFG
I2C_DATA[(I2C_Stat&0x3F)]= UCB1RXBUF;//将RXD字节输入缓冲区
I2C_Stat +;
IF ((I2C_Stat&0x3F)>56)
{
I2C_Stat |=0x80;
}
中断;
案例12://矢量12:TXIFG
UCB1TXBUF = I2C_DATA[I2C_TX_LOU+];
中断;
默认:
中断;
}
}
此致,
诺顿