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.

[参考译文] MSP430FR2475:I2C 主机 TX 中断未触发

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP430FR2475, MSP430FR2676

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/892540/msp430fr2475-i2c-master-tx-interrupt-not-triggering

器件型号:MSP430FR2475
主题中讨论的其他器件: MSP430WAREMSP430FR2676

您好!

我正在尝试让 i2c 的示例代码在 MSP430FR2475上通过引脚 P4.5和 P4.6上的 UCB0工作、我也遇到了使用 P1.2和 P1.3的问题。 我在 USCIB0_ISR 开关案例的开头放置了一个断点。 我能够闪存并单步执行代码、但当我到达_ _ bis_SR_register 行(LPM0_bits | GIE)时、代码会挂起、并且中断似乎永远不会触发。 我已将我的从器件连接并使用10k 电阻器上拉。 遗憾的是、我无法访问示波器或逻辑分析仪。 此示例代码中的哪一行应触发中断? 如果从器件地址、拉电阻器等存在问题、这是否会导致中断不触发?

谢谢、

Alex

/*-版权所有-、BSD_EX
 *版权所有(c) 2018、德州仪器(TI)公司
 *保留所有权利。
 *
 *以源代码和二进制形式重新分发和使用、有无
 *如果满足以下条件、则允许进行修改
 符合*:
 *
 ** 源代码的重新分发必须保留上述版权
 *  注意、此条件列表和以下免责声明。
 *
 * *二进制形式的再发行必须复制上述版权
 *  请注意、中的此条件列表和以下免责声明
 *  随分发提供的文档和/或其他材料。
 *
 * *德州仪器公司的名称和名称均不相同
 *  其贡献者可用于认可或推广衍生产品
 *  未经特定的事先书面许可。
 *
 *本软件由版权所有者和贡献者"按原样"提供
 *以及任何明示或暗示的保证、包括但不限于:
 *特定适销性和适用性的隐含保证
 *不承认目的。 在任何情况下、版权所有者不得或
 *派遣国应对任何直接、间接、偶然、特殊、
 *典型或必然的损害(包括但不限于
 *采购替代货物或服务;丧失使用、数据或利润;
 *或业务中断)、无论原因是什么以及任何责任理论、
 *无论是合同、严格责任还是侵权行为(包括疏忽或)
 *否则)因使用本软件而以任何方式产生、
 *即使被告知可能会发生此类损坏。
 *
 秘书长的报告
 *
 *             MSP430代码示例免责声明
 *
 * MSP430代码示例是通常包含的低级程序
 *高度演示单个外设功能或器件功能
 *简明扼要。 为此、代码可能依赖于器件的加电默认值
 *寄存器值和设置、如时钟配置和注意
 *在组合多个示例中的代码时应采取这种方法、以避免潜在的问题
 *效果。 有关 GUI、另请参阅 www.ti.com/grace 和 www.ti.com/msp430ware
 *用于外设配置的 API 函数库方法。
 *
 *--/版权--*/
//
// MSP430FR267x 演示- eUSCI_B0 I2C 主器件 TX 字节到多个从器件
//
// 说明:此演示通过 I2C 总线连接两个 MSP430。
// 主器件发送到4个不同的 I2C 从器件地址0x0A、0x0B、0x0C&0x0D。
// 每个从地址在数组 TXData[]中都有一个特定的相关数据。
// 在四个 I2C 事务结束时,从器件地址回滚并开始
// 再次位于0x0A。
// ACLK = REFO = 32768Hz、MCLK = SMCLK =默认 DCO =~1MHz
// 与 msp430fr267x_eUSCI_04.c 一起使用
//
//                 /|\ /|\
//         MSP430FR2676   10k 10k   MSP430FR2676
//           从器件      |  |     主器件
//        --------   |  ||---   
//       |   P1.2/UCB0SDA|-|-|-|-||P1.2/UCB0SDA   |
//       |          | |    ||          |
//       |          | |    ||          |
//       |   P1.3/UCB.S.|<-|--- |P1.3/UCB.S.   |
//       |          |      |        P1.0|--> LED
//
//  方龙宇
//  Texas Instruments Inc.
//  2018年8月
//  使用 IAR Embedded Workbench v7.12.1和 Code Composer Studio v8.1.0构建
//
#include
unsigned char TXData= 0x21;     //指向 TX 数据的指针
unsigned char SlaveAddress= 0x70;
unsigned char TXByteCtr;
int main (空)
  WDTCTL = WDTPW | WDTHOLD;              //停止看门狗计时器
  //为 I2C 配置引脚
  P4SEL0 |= BIT5 | BIT6;               // I2C 引脚
  //禁用 GPIO 上电默认高阻抗模式
  //激活先前配置的端口设置
  PM5CTL0 &=~LOCKLPM5;
  //将 USCI_B0配置为 I2C 模式
  UCB0CTLW0 |= UCSWRST;                //将 eUSCI_B 置于复位状态
  UCB0CTLW0 |= UCMODE_3 | UCMST;           // I2C 主控模式、SMCLK
  UCB0BRW = 0x8;                   //波特率= SMCLK /8
  UCB0CTLW0 &=~ UCSWRST;               //清除复位寄存器
  UCB0IE |= UCTXIE0 | UCNACKIE;            //发送和 NACK 中断使能
  while (1)
  {
  _DELAY_CYCLES (1000);                //传输之间的延迟
  UCB0I2CSA =从地址;        //配置从地址
  TXByteCtr = 1;                   //加载 TX 字节计数器
  while (UCB0CTLW0和 UCTXSTP);            //确保发送了停止条件
  UCB0CTLW0 |= UCTR | UCTXSTT;            // I2C TX、启动条件
  _bis_SR_register (LPM0_bits | GIE);         //输入带中断的 LPM0
                           //保持在 LPM0中直到所有数据
                           //是 TX
  }
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B0_vector
_interrupt void USCIB0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCIB0_ISR (void)
其他
错误编译器不受支持!
#endif
 开关(__evo_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))
 {
    USCI_NONE 案例:中断;             //向量0:无中断中断;
    USCI_I2C_UCALIFG 案例:中断;
    USCI_I2C_UCNACKIFG 案例:
      UCB0CTL1 |= UCTXSTT;            //重新发送启动(如果 NACK)
     中断;                    //向量4:NACKIFG 中断;
    案例 USCI_I2C_UCSTTIFG:中断;         //向量6:STTIFG 中断;
    案例 USCI_I2C_UCSTPIFG:中断;         //向量8:STPIFG 中断;
    USCI_I2C_UCRXIFG3案例:中断;         //向量10:RXIFG3中断;
    USCI_I2C_UCTXIFG3案例:中断;         //向量14:TXIFG3中断;
    USCI_I2C_UCRXIFG2案例:中断;         //向量16:RXIFG2 break;
    USCI_I2C_UCTXIFG2案例:中断;         //向量18:TXIFG2中断;
    USCI_I2C_UCRXIFG1案例:中断;         //向量20:RXIFG1 break;
    USCI_I2C_UCTXIFG1案例:中断;         //向量22:TXIFG1中断;
    案例 USCI_I2C_UCRXIFG0:中断;         //向量24:RXIFG0中断;
    USCI_I2C_UCTXIFG0案例:
    IF (TXByteCtr)                 //检查 TX 字节计数器
      {
      UCB0TXBUF = TXData;       //加载 TX 缓冲区
      TXByteCtr --;                //测量 TX 字节计数器
      }
    其他
      {
      UCB0CTLW0 |= UCTXSTP;            // I2C 停止条件
      UCB0IFG &=~UCTXIFG;            //清除 USCI_B0 TX int 标志
      _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;
 }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    断点恰好在哪里? 在 switch()或 TXIFG 情况下?

    我的第一个猜测是断点在 TXIFG 情况下、您将得到一个 NACK (IFG)。 总线上是否有从器件、还是为空?

    在设置 UCTXSTT 之后、对 ISR 的第一次调用应该是一个 I2C 时钟周期(8us、相当瞬时)。

    [编辑:此外、要使用 P4.5/6、请添加:

    >SYSCFG2 |= USCIB0RMP; // P4.5-6、而非 P1.2-3

    [参考用户指南(SLAU445I)表1-31和数据表(SLASEO7B)表6-11]]  

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

    感谢您的响应-我已经在整个 ISR 中尝试了许多不同的断点、包括切换情况之前和之后以及 NACK 情况中的断点、但都没有结果。 我也在您提到的行中添加了-谢谢您的提示。  

    无论从器件是否已连接、NACK 是否应触发? 根据我的了解、我确实已将从设备正确连接

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

    有趣的是、我拔下了从器件、触发了 ISR、现在它在插入从器件时偶尔工作。 我认为、使用外部而不是编程器为电路板供电可能会对此有所帮助。 再次感谢您在额外的产品系列方面的帮助。

    谢谢、

    Alex