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/MSP430FR2155:I2C 上无启动条件

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/808766/ccs-msp430fr2155-no-starting-condition-on-i2c

器件型号:MSP430FR2155
主题中讨论的其他器件: MSP430FR2355TPS22860TPS780

工具/软件:Code Composer Studio

您好!

我们的电路板上的 I2C 总线有一个奇怪的问题。

 

我们在其他组件中使用:

MSP430FR2155

在 I2C 上:两个 EEPROM STM M24512、一个加速计 Kionix KX122-1037

 

上拉、4、7k Ω、上拉电阻提供给控制器、而不是直接从 Vcc、

在没有组件的 PCB 上测得的总线电容 SDA 接地4、1pf、SCL 接地4、0pF、SDA 接地3、5pf

导线长度小于40mm

 

我们生产50块电路板、在28块电路板上生产代码卡在第一个 I2C 通信中。 我们发现控制器没有将 SDA 下拉至 GND、没有释放起始条件。

在其中一些电路板上、我们移除加速计、然后代码运行。

 

然后、我们在其中一个故障电路板上刷写了 TI 的示例代码。 此外、使用此代码、没有释放起始条件。 SDA 和 SCL 都保持在3.3V。

在调试期间、我们注意到、当我们设置一些断点时、代码会起作用。 最后、我们包括一个延迟环路。 但由于延迟、它可以正常工作、而不是。

 

您有什么想法电路板上可能会出现什么问题吗?

 

TI 的示例代码经过细微修改、将 P2.4设置为高电平以提供上拉电阻、并从端口0更改为1

 

*--/版权--*/

//

// MSP430FR235x 演示- eUSCI_B0 I2C 主器件 TX 字节到多个从器件

//

//说明:此演示通过 I2C 总线连接两个 MSP430。

//主器件发送到4个不同的 I2C 从器件地址0x0A、0x0B、0x0C&0x0D。

//每个从地址在数组 TXData[]中都有一个特定的相关数据。

//在四个 I2C 事务结束时,从器件地址回滚并开始

//再次位于0x0A。

// ACLK = REFO = 32768Hz、MCLK = SMCLK =默认 DCO =~1MHz

//与 msp430fr235x_uscib0_i2c_16.c 一起使用

//

//                              /|\/|\

//              MSP430FR2355    10k MSP430FR2355     

//                  从        器件|  |      主器件

//            ------------   |  ||---   

//          |    P1.2/UCB0SDA|-|-|-|-||P1.2/UCB0SDA    |

//          |                ||      |                |

//          |                ||      |                |

//           |    P1.3/UCB.S.|-|-|--- |P1.3/UCB.S.    |

//          |                        ||                |

//

//  现金 Hao

//  Texas Instruments Inc.

//  2016年11月

//  使用 IAR Embedded Workbench v6.50.0和 Code Composer Studio v6.2.0构建

//

 

#include

 

unsigned char TXData[]={0xA1、0xB1、0xC1、0xD1};      //指向 TX 数据的指针

unsigned char SlaveAddress[]={0x0A、0x0B、0x0C、0x0D};

unsigned char TXByteCtr;

unsigned char SlaveFlag = 0;

 

int main (空)

  WDTCTL = WDTPW | WDTHOLD;                        //停止看门狗计时器

 

  //为 I2C 配置引脚

 

  P4SEL0 |= BIT7 | BIT6;                          // I2C 引脚

 

 

  P2SEL0 &=~BIT4;                          // I2C 电源引脚

  P2SEL1 &=~BIT4;                          // I2C 电源引脚

  P2DIR |= BIT4;                          // I2C 电源引脚

  P2OUT |= BIT4;                          // I2C 电源引脚

 

  //禁用 GPIO 上电默认高阻抗模式

  //激活先前配置的端口设置

  PM5CTL0 &=~LOCKLPM5;

 

 

  //将 USCI_B0配置为 I2C 模式

  UCB1CTLW0 |= UCSWRST;                            //将 eUSCI_B 置于复位状态

  _DELAY_CYCLES (50000);                            //附加延迟

 

  UCB1CTLW0 |= UCMODE_3 | UCMST;                  // I2C 主控模式、SMCLK

  UCB1BRW = 0x8;                                  //波特率= SMCLK / 8

  UCB1CTLW0 &=~ UCSWRST;                          //清除复位寄存器

  UCB1IE |= UCTXIE0 | UCNACKIE;                    //发送和 NACK 中断使能

 

  SlaveFlag =0;

 

  while (1)

  {

  __DELAY_CYCLES (1000);                            //传输之间的延迟

  UCB1I2CSA = SlaveAddress[SlaveFlag];            //配置从地址

  TXByteCtr = 1;                                  //加载 TX 字节计数器

  while (UCB1CTLW0和 UCTXSTP);                    //确保发送了 STOP 条件

  UCB1CTLW0 |= UCTR | UCTXSTT;                    // I2C TX,启动条件

 

  _bis_SR_register (LPM0_bits | GIE);              //输入 LPM0、带中断

                                                    //保持在 LPM0中直到所有数据

                                                    //是 TX

  //更改从机地址

  SlaveFlag++;

  if (SlaveFlag>3)                                //翻转从地址

    {

      SlaveFlag =0;

    }

  }

 

 

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

#pragma vector = USCI_B1_Vector

_interrupt void USCIB1_ISR (void)

#Elif defined (_GNU_)

void __attribute__((中断(USCI_B1_vector)) USCIB1_ISR (void)

其他

错误编译器不受支持!

#endif

开关(__evo_in_range (UCB1IV、USCI_I2C_UCBIT9IFG))

      案例 USCI_NONE:break;                      //向量0:无中断中断;

      USCI_I2C_UCALIFG 案例中断

      USCI_I2C_UCNACKIFG 案例

          UCB1CTL1 |= UCTXSTT;                    //如果 NACK,则重新发送开始

        中断;                                    //向量4:NACKIFG 中断;

      case USCI_I2C_UCSTTIFG:break;              //向量6:STTIFG break;

      案例 USCI_I2C_UCSTPIFG:中断;              //矢量8:STPIFG 中断;

      案例 USCI_I2C_UCRXIFG3:中断;              //向量10:RXIFG3中断;

      案例 USCI_I2C_UCTXIFG3:中断;              //向量14:TXIFG3中断;

      案例 USCI_I2C_UCRXIFG2:中断;              //向量16:RXIFG2中断;

      案例 USCI_I2C_UCTXIFG2:中断;              //向量18:TXIFG2中断;

      案例 USCI_I2C_UCRXIFG1:中断;              //向量20:RXIFG1中断;

      案例 USCI_I2C_UCTXIFG1:中断;              //向量22:TXIFG1中断;

      案例 USCI_I2C_UCRXIFG0:中断;              //向量24:RXIFG0中断;

      USCI_I2C_UCTXIFG0案例

      if (TXByteCtr)                              //检查 TX 字节计数器

          {

          UCB1TXBUF = TXData[SlaveFlag];          //加载 TX 缓冲区

          TXByteCtr -;                            //减量 TX 字节计数器

         }

      其他

          {

          UCB1CTLW0 |= UCTXSTP;                    // I2C 停止条件

          UCB1IFG &=~UCTXIFG;                    //清除 USCI_B0 TX 内部标志

          _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);    //退出 LPM0

          }

        中断;                                    //向量26:TXIFG0中断;

      案例 USCI_I2C_UCBCNTIFG:break;              //向量28:BCNTIFG

      案例 USCI_I2C_UCCLTOIFG:中断;              //矢量30:时钟低电平超时

      案例 USCI_I2C_UCBIT9IFG:中断;              //向量32:第9位

      默认值:break

 

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

    您好!

    感谢您与我们联系、我们将开始研究这个问题。

    祝你一切顺利、

    Colin Adema

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

    您好!

    如果可能、您能否发送示波器屏幕截图、说明尝试在工作板和非工作板上获取启动条件?

    祝你一切顺利、

    Colin Adema

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

    您好、Collin、

    您可以在工作板上找到一个屏幕截图。 SDA 是黄色线、SCL 是蓝色线。

    在非工作电路板上、我们没有测量、因为线路上没有变化。

    同时、我们发现在非工作板上、在初始化期间、BUSY 位 UCBBUSY 被设定为高电平= BUSY。

    例如、当我们逐步浏览代码时

     

    01  //步骤1设置软件复位

    02  UCB1CTLW0 |= UCSWRST;

    03  //步骤2初始化 UCSWRST = 1的所有 eUSCI_B 寄存器(包括 UCxCTL1)。

    04  UCB1CTLW0 |= UCMST + UCMODE_3;//+ UCSYNC;    // I2C 主机,同步模式

    05  UCB1CTLW0 |= UCSSEL_2 | UCTR;    //使用 SMCLK、TX 模式、保持软件复位

     

    在第04行之后、该位被置位。

    这就是控制器不产生启动条件的原因。

    到目前为止、在 I2C 上没有找到任何信号、例如可以设置该位的起始条件。

     

    不清楚为什么 UCBBUSY 位被置位。

     此致 Andreas

    此外、我们观察端口4的中断标志6和7在仲裁中的变化

     

    该电路板为电池电源(3节碱性 AA 电池)、电压由 TPS780调节、我们仅使用3.3V。 第一个电芯连接到 ADC、TPS22860负载开关的 OFF 引脚连接到 µC Ω 的输出引脚

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

    您好!

    您能否再次检查是否已附加屏幕截图? 我不相信我看到了它们。

    祝你一切顺利、

    Colin Adema

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

    您好!

    执行一些测试后、我发现在启动时对 I2C 进行初始化时将 SCL 或 SDA 短路会导致在发送任何数据之前设置 BUSY 标志。 在将 I2C 引脚拉至 Vcc 之前、您的电路板是否可以在启动时短暂地将线路短接至接地?

     您能否在启动期间发送电路板的示波器屏幕截图?

    祝你一切顺利、

    Colin Adema

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

    尊敬的 Colin:

    感谢你的答复。

     实际上、我们在加速计的芯片上电序列期间发现了一些意外的高-低变化。 在初始化 I2C 之前、我们通过打开加速计来消除这种情况。 然而、我们仍然有问题、UCBBUSY 位被置位。

    我们已经在总线上测量了一些尖峰。 其中一个示例如下图所示。 到目前为止、我们无法确定代码中的哪个语句或总线上的哪个组件会导致这些尖峰。 因为带和不带调试器的电路的行为不同。 当我们使用调试器分步执行代码时、一切都正常、并且没有设置 UCBBUSY 位。 当我们运行该程序时、我们只能测量此类尖峰、但不会与可能的"源"相关联。

    如果您需要进一步测量、请告诉我。

    您是否有任何建议可通过快速解决方法防止 μ µC 设置该位、您是否知道我们如何找出导致这些尖峰的原因(如果这些尖峰是设置 UCBBUSY 的原因)

     谢谢你

    Andreas

    峰值:

     

    启动条件

    通信扩大

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

    您好!

    您为什么从微控制器而不是直接从 LDO 输出端为 I2C 供电? I2C 上的开关噪声可能会导致电源引脚上出现一些问题。

    祝你一切顺利、

    Colin Adema

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

    您好、Colin、
    非常感谢您的回答。
    原因实际上是省电、因为不应经常使用 I2C。

    我们已经将上拉电阻器直接连接到 LDO、但没有任何改进。 我们将重复此操作并断开引脚与 μ μC 的连接。

    但是、我不知道总线的开关噪声为什么会对 μ μC 产生追溯效应、尤其是在 eUSCI_xx 模块上。 或者我是否误解了这一点?

    此致

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

    您好!

    如果代码在单步执行代码时有效、而不是在代码未进行调试的情况下运行时有效、 然后、您可以尝试在初始化中的每一行代码之后放置 delay 语句、以模拟代码步进、并尝试缩小导致尖峰的代码(如果有)。

    关于开关噪声、I2C 上的开关可能会通过引脚串扰导致分配给电源的引脚上产生较小的电压纹波。但是、 该差异应大约为毫伏、因此不应影响您记录的尖峰的顺序上的引脚。 这可能不是问题、但值得检查、以防它在上拉电阻器接收电源的方式中导致不同的错误。

    祝你一切顺利、

    Colin Adema

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

    您好!

    问题是什么? 是否已解决?

    祝你一切顺利、

    Colin Adema

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

    您好、Collin、
    感谢您的回答。
    到目前为止、我们还无法找到尖峰的原因或来源。

    我们将测试 BUSY 位是否已设置、如果已设置、我们将重新初始化接口。 这不是很好、但我们不知道更好的解决方案。

    我们考虑重新设计电路板。
    您能否推荐另一个没有错误解释起始条件的 μC Ω 电阻器?
    更节能的 I2C 或 SPI 有哪些? 我们可以使用加速计和 EEPROMS 切换到 SPI。

    此致

    Andreas

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

    您好!

    I2C 外设是 USCI 和 eUSCI 接口的一部分、这是我们所有微控制器的标准接口。 因此、在同一电路板上使用不同的微控制器可能会对 I2C 产生相同的问题。

    就 功耗而言、由于缺少上拉电阻器、SPI 平均功耗更低、因此切换到这种情况是安全的选择。

    如果您有任何疑问、请告诉我。

    祝你一切顺利、

    Colin Adema