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.

[参考译文] MSP430F5659:I2C 发送接收问题

Guru**** 2538930 points
Other Parts Discussed in Thread: MSP430F5659

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/610329/msp430f5659-i2c-transmit-receive-problem

器件型号:MSP430F5659

您好!

我正在使用 msp430f5659并尝试将 RTC DS1307与 I2C 协议连接。 我无法使用 I2C 发送和接收数据。 我只能传输一次命令。 我已经修改了 msp430f5系列的 ti 示例代码。我的代码在这里:

void i2c_send (unsigned char byte_to_send、unsigned char TXByteCtr)

          TXData = BYTE_TO_SEND;                           //保存 TX 数据
          while (UCB2CTL1 & UCTXSTP);            //确保发送了 STOP 条件
          UCB2CTL1 |= UCTR | UCTXSTT;            // I2C TX,启动条件
          _bis_SR_register (LPM0_bits | GIE);    //输入 LPM0、带中断

void i2c_receive (unsigned char * PRxData)

   RXByteCtr = 0;                         //清除 RX 字节计数
   UCB2CTL1 &=~Ω UCTR | UCTXSTT;            // I2C RX、START 条件
   _bis_SR_register (LPM0_bits | GIE);    //输入 LPM0、带中断


// USCI_B1数据 ISR
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B2_vector
_interrupt void USCI_B2_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B2_vector)) USCI_B2_ISR (void)
其他
错误编译器不受支持!
#endif

 switch (__evo_in_range (UCB2IV、12))
 {
 情况 0:中断;                          //向量 0:无中断
 情况 2:中断;                          //向量 2:ALIFG
 情况 4:中断;                          //向量 4:NACKIFG
 情况 6:中断;                          //向量 6:STTIFG
 案例 8:
         UCB0IFG &=~UCSTPIFG;
          if (RXByteCtr)                         //检查 RX 字节计数器
           _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
         中断;                          //向量 8:STPIFG

 情况10:                                 //向量10:RXIFG
         * PRxData++= UCB0RXBUF;                //将 RXd 字节放入缓冲区
          RXByteCtr +;
          中断;
 情况12:
         if (TXByteCtr)                         //检查 TX 字节计数器
          {
                  UCB2TXBUF = TXData;                  //加载 TX 缓冲区
                  TXByteCtr -;                         //减量 TX 字节计数器
           }
          其他
          {
                  UCB2CTL1 |= UCTXSTP;                 // I2C 停止条件
                  UCB2IFG &=~UCTXIFG;                 //清除 USCI_B0 TX 内部标志
                 _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
           }
           中断;
                             //向量12:TXIFG
 默认值:break;
 }

在此代码中、我将发送命令

 I2C_SEND (0xD0、1);

 I2C_SEND (0x07、1);

它正在传输第1条命令、而不是第2条命令。 我已经检查了所有标记、尝试单独清除它们、但问题未得到解决。 请帮帮我。

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

    我注意到您正在从 msp430f665x_uscib0_i2c_07.c 示例中对代码进行采样。 TXByteCtr 应为全局变量、而不是仅提供给 i2c_send 函数的值。 请调试您的项目、并对 USCIB2 ISR 的行为以及代码在何处卡住进行评论。 您如何知道第一个字节被正确发送? 请提供 I2C 通信线路的逻辑分析仪或示波器快照。

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

    您好!

    我使用的是德州仪器 i2c msp430f665x_uscib0_i2c_07.c 的示例代码 我已经使用 LCD 显示屏检查了代码是否未卡在任何位置、但在 SCL SDA 线路上、我无法看到任何类型的脉冲。 请帮助我找出问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在 P9SEL 寄存器中选择了正确的 UCB2引脚功能(P9.5/SDA 和 P9.6/SCL)? 是否安装了适当的上拉电阻(4.7/10千欧)? 请提供所有可能的调试信息。

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

    我的代码如下:

    void i2c_configuration()

       SET_CURSOR_pos (0、0);
       显示(" i2c 条目");
       P9SEL |= SCL+SDA;    //分别将引脚9.5和9.6定义为 SDA 和 SCL 引脚
       P9DIR |= SCL+SDA;    //将输出方向分配给 sdz 和 SCL 引脚
       UCB2CTL1 |=UCSWRST;
       UCB2CTL0 = UCMST | UCMODE_3 | UCSYNC;    // I2C 主设备、I2C 模式、 同步模式
       UCB2CTL1 = UCSSEL_2 | UCSWRST;          //使用 SMCLK、保持软件复位
       UCB2BR0 = 40;                            // fSCL = SMCLK/40 = 4MHz/40=~100kHz
       UCB2BR1 = 0;
       UCB2I2CSA = 0x48;                        //从器件地址为048h
       UCB2CTL1 &=~ UCSWRST;
       UCB2IE |= UCTXIE;//+ UCRXIE + UCSTPIE;                        //启用 TX 中断

    在十六进制文件中、我定义了以下引脚。

    #define SDA     BIT5
    #define SCL     BIT6

    该代码中是否存在任何错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不会注意到所提供代码的任何特定错误。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我正在尝试调试我的代码、但我停留在 while (UCB2CTL1 & UCTXSTP)中; //确保停止条件已发送此语句。 我正在使用示波器观察 SDA 线上的单个脉冲。 请提出一些问题仍然存在的建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是第一次尝试发送字节吗? 如果您甚至无法发送起始条件、则物理 I2C 线路上可能会出现问题、您需要检查连接以及从器件的操作建议。

    此致、
    Ryan