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.

[参考译文] MSP430FR5969:MSP430FR5969 I2C 配置和测试

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/568428/msp430fr5969-msp430fr5969-i2c-configuration-and-testing

器件型号:MSP430FR5969

您好!

我目前正在尝试将 MSP430FR5969配置为从 Si1133读取。 通信将通过 I2C 完成。

我的困难在于此接口的正确配置顺序。 根据我所阅读的内容(通过其他讨论和数据表)、我应该能够使用 eusci_b_i2c 和 drivelib 软件包。

此线程中的用户 或多或少都在尝试完成相同的任务。

这就是我从主端看到该过程工作的方式:

  1. 初始化 GPIO 引脚(SDA、SCL)
  2. 初始化主控参数
  3. 初始化主设备
  4. 设置从机地址
  5. 设置模式(在本例中为传输)
  6. 启用 I2C 块
  7. 发送数据
  8. 停下

"传输数据"部分 是我要提问的内容。  

根据 Si1133数据表、简单的写入序列包含以下顺序的命令(来自主器件):

  1. 启动
  2. 发送从机地址
  3. 设置写入
  4. 接收 ACK
  5. 发送寄存器地址
  6. 接收 ACK
  7. 发送数据
  8. 接收 ACK
  9. 发送停止

现在、eusci_b_i2c 库提供的函数可在一个调用中发送开始、数据、然后发送停止。 但我不认为这是我在这里要做的事情。

作为起点、我只想发送从器件地址、然后读取 ACK。 ACK 确切发送在哪里? 我想这是一个旗帜,只是不确定是什么。
也许使用 getInterruptStatus 是一种检查方法?
此外、是否可以在调试期间检查是否收到 ACK?

请随时澄清。 在背景下、我是一名学生、试图学习裸机 C

谢谢你

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

    您好 Rudy、

    感谢您提供详细的帖子和背景信息。

    为了确定从器件是否未应答发送的地址、未应答中断标志 UCNACKIFG 被置位、可在调试期间进行检查。 主机必须以停止条件或重复起始条件做出反应。 在主接收器模式下使用 MSP430时、 请参阅用户指南中的第26.3.5.2.2节和图26-13、了解更多详细信息。

    对于 ACK 、您可以将其视为标志。 由于 I2C 是一个开漏协议、从器件将下拉 SDA 来提醒主器件它已经确认了地址或数据。

    对于裸机 C 代码示例、请查看 msp430fr59xx_euscib0_i2c_10.c 在 USCI_B0_ISR 中、您应该能够在"case USCI_I2C_UCNACKIFG"下的第124行上放置一个断点。 如果从未达到此断点、则从器件应正确确认。

    msp430fr59xx_euscib0_i2c_10.c

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430FR59xx 演示- eUSCI_B0 I2C 主设备 RX 来自 MSP430从设备的多个字节
    //
    说明:此演示通过 I2C 总线连接两个 MSP430。 主
    器件//从从器件读取5个字节。 这是主代码。 从器件
    //发送器的数据从0开始,并随每次传输递增。
    // USCI_B0 RX 中断被用来知道何时接收到新数据。
    // ACLK = n/a、MCLK = SMCLK = BRCLK = DCO = 1MHz
    //
    ***** 与"MSP430FR59xx_euscib0_i2c_11.c"**//
    
    /|\/|\
    // MSP430FR5969 10k 10k MSP430F5969
    // 从器件 || 主器件
    // -------- |||---
    // -|XIN P1.6/UCB0SDA|-|--+-|P1.6/UCB0SDA XIN|-
    // | || | | 32kHz
    // -|XOUT || | XOUT|-
    // | P1.7/UCB.S.|<!---- >|P1.7/UCB.S. |
    // | | | P1.0|->LED
    //
    P. Thanigai
    // Texas Instruments Inc.
    // 2012年2月
    //使用 CCS v5.5构建
    /*********
    #include 
    
    volatile unsigned char RXData;
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;
    
    //配置 GPIO
    P1OUT &=~BIT0; //清除 P1.0输出锁存
    器 P1DIR |= BIT0; //对于 LED
    P1SEL1 |= BIT6 | BIT7; // I2C 引脚
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    //为 I2C 模式配置 USCI_B0
    UCB0CTLW0 |= UCSWRST; //软件复位使能
    UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C 模式、主控模式、SYNC
    UCB0CTLW1 |= UCASTP_2; //生成自动停止
    //到达 UCB0TBCNT 后
    UCB0BRW = 0x0008; //波特率= SMCLK / 8
    UCB0TBCNT = 0x0005; //要接收的字节数
    UCB0I2CSA = 0x0048; //从器件地址
    UCB0CTL1 &=~UCSWRST;
    UCB0IE |= UCRXIE | UCNACKIE | UCBCNTIE;
    
    while (1)
    {
    _DELAY_CYCLES (2000);
    while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件
    UCB0CTL1 |= UCTXSTT; // I2C 启动条件
    
    _bis_SR_register (LPM0_bits | GIE); //输入带中断
    的 LPM0}
    
    
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = USCI_B0_Vector
    __interrupt void USCI_B0_ISR (void)
    #Elif defined (__GSCI__)
    支持的 void __attribute_(USCI_b0_bvector
    
    )(void)(nuc0_b0_isr)#blu_isc)(nu_b0_isc)(void Compiler)(void 0_isc)(void 0_
    #endif
    {
    switch (__even_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))
    }
    USCI_NONE 案例: 中断; //向量0:无中断
    USCI_I2C_UCALIFG 案例:中断; //向量2:ALIFG
    USCI_I2C_UCNACKIFG 案例: //向量4:NACKIFG
    UCB0CTL1 |= UCTXSTT; // I2C 启动条件
    中断;
    案例 USCI_I2C_UCSTTIFG:中断; //向量6:STTIFG
    案例 USCI_I2C_UCSTPIFG:中断; //向量8:STPIFG
    USCI_I2C_UCRXIFG3案例:中断; //向量10:RXIFG3
    USCI_I2C_UCTXIFG3案例:中断; //向量12:TXIFG3
    USCI_I2C_UCRXIFG2案例:中断; //向量14:RXIFG2
    USCI_I2C_UCTXIFG2案例:中断; //向量16:TXIFG2
    USCI_I2C_UCRXIFG1案例:中断; //向量18:RXIFG1
    USCI_I2C_UCTXIFG1案例:中断; //向量20:TXIFG1
    USCI_I2C_UCRXIFG0案例: //向量22:RXIFG0
    RXData = UCB0RXBUF; //获取 RX 数据
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
    中断;
    案例 USCI_I2C_UCTXIFG0:中断; //向量24:TXIFG0
    USCI_I2C_UCBCNTIFG 案例: //向量26:BCNTIFG
    P1OUT ^= BIT0; //在 P1.0上切换 LED
    中断;
    USCI_I2C_UCCLTOIFG 案例:中断; //向量28:时钟低电平超时
    USCI_I2C_UCBIT9IFG 案例:中断; //向量30:第9位
    默认值:中断;
    }
    }
    

    希望这对您有所帮助。

    此致、

    James

    MSP 客户应用