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.

[参考译文] 编译器/MSP430F5632:为什么I2C连接时出现未知错误

Guru**** 2589300 points
Other Parts Discussed in Thread: MSP430F2122, MSP430F5632

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/634031/compiler-msp430f5632-why-is-there-an-unknown-error-while-i2c-connection

部件号:MSP430F5632
主题中讨论的其他部件: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+];
中断;
默认:
中断;
}
}

此致,

诺顿

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

    首先不要启用IE位,因为您没有在MSP430F2122上使用中断。 如果要在序列结束时将USCI置入复位,则等待下一个序列开始时,将其从复位中释放出来。 挂断前通常完成多少个序列? 您不必在每个环路中多次检查UCB0TXIFG。 您是否可以调试代码以找出逻辑卡滞的原因? 应在倒数第二次接收后发送停止位,如msp430x21x2_uscib0_i2c_10.c示例所示。 您是否能够为您的通信提供任何示波器或逻辑分析仪屏幕截图? 您的上拉阻力值是多少?

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

    您好,Norton:

    这是正在重置的MSP430F2122,对吗?

    首先,我建议您通读 MSP430 MCU 应用报告中常见eUSCI和USCI串行通信问题解决方案的常规和I2C部分。 接下来,您可以使用示波器或逻辑分析器探测I2C总线,以记录发生的事务。 然后,您是否可以将这些屏幕截图发布到论坛供我查看。 最后,您能否为MSP430F2122中使用的I2C设置提供代码?

    此致,

    Caleb Overbay

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

    您好,Ryan和Caleb,

    在Ryan的建议下,我更改 了我的I2C通信代码的某些部分。
    但是,如果我不检查TXD的缓冲区是否为空,要传输的数据将不会成功。
    现在,我取消了I2C通信的重置部分。
    我将粘贴下面的代码 ,void I2C_Multiple_Read_Write (unsigned char Length,unsigned short number_of_read)

    如下图所示,它们是示波器的屏幕截图。
    我已经在这些数字上写下了这些含义。

    每次失败操作发生时,它都发生在传输的部分。
    我尚未完成数据传输并被卡住,因此我认为错误发生在我的I2C从属设备正确的芯片MSP430F5632中?

    因为以下代码是,
    主零件,
    1. MSP430F2122 (主)中的I2C设置操作,请使用InitI2C (unsigned char i2c_address)进行检查。
    2. MSP430F2122 (主)的I2C通信,使用 I2C_MULTIPLE_READ_Write (void)进行检查。
    从属零件,
    3. MSP430F5632 (从属)中的I2C设置操作,请使用 Set_I2C_Slave (void)检查。
    4.MSP430F5632 (从属)中的I2C USI_B0中断服务例程,使用 __interrupt void USI_B1_ISR(void)进行检查
    完成接收后,我执行数据分配操作,然后启用TXIE以发回数据。
    5.使用 I2C_RX_DATA_OPEX(void)进行检查

     e2e.ti.com/.../6254.code.txt

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

    接收结束时的"未知信号"是因为您发送停止命令太晚,正如我前面提到的那样。 您的MSP430F5632是否不确认导致通信故障的最后一个字节,并且在相同的序列计数中是否始终是相同的57字节? 这可能是一个逻辑问题,此时您应该调试从属设备。 将nack处理添加到主代码中也有助于避免锁定状态。

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

    您好,Ryan:

    感谢您的友好建议。 也许我应该检查我的通信代码。
    正确地,我不会在从属部件中发回ACK/NACK。
    我在示例代码中没有看到ACK/Nack的任何操作。
    也许我会检查错误的样本。
    我将再次检查其他示例代码并对我的代码进行更正。
    之后,我将粘贴并告诉您解决方案。
    如果有任何建议或解决办法,请告诉我。

    此致,
    诺顿