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/MSP430F5529:Code Composer Studio™︎论坛

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/834120/ccs-msp430f5529-code-composer-studio-forum

器件型号:MSP430F5529
主题中讨论的其他器件: ADS1100

工具/软件:Code Composer Studio

  
这是初始化函数调用和函数

TI_USCI_I2C_receiveinit (0x48、0x12); 

void TI_USCI_I2C_receiveinit (unsigned char slave_address、
unsigned char 预分频){

P3SEL |= SDA_PIN + SCL_PIN; //将 I2C 引脚分配给 USCI_B0
UCB0CTL1 = UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0 =预分频; //设置预分频
器 UCB0BR1 = 0;
UCB0I2CSA = SLAVE_ADDRESS; //设置从地址
UCB0CTL1 &=~UCSWRST; //清除 SW 复位、恢复运行
UCB0IE = UCNACKIE;
UCB0IE = UCRXIE; //启用 RX 中断

} 

之后调用接收函数、这里是该函数的函数

TI_USCI_I2C_Receive (3、array2);

void TI_USCI_I2C_Receive (unsigned char byteCount、unsigned char * field){
TI_receive_field = field;
if (byteCount = 1){
byteCtr = 0;
_disable_interrupt ();
UCB0CTL1 |= UCTXSTT; // I2C 启动条件
while (UCB0CTL1 & UCTXSTT); //起始条件是否已发送?
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
__ENABLE_INTERRUPT();
}否则(byteCount >1){
byteCtr = byteCount -2;
UCB0CTL1 |= UCTXSTT; // I2C 起始条件
}否则
while (1); //非法参数
}

如果有人能帮助我解决 i2c 的问题,我会非常感激。以上是2张图片,可以帮助解释我的问题。收到第一个字节后,数据线就会保持高电平。 左侧是我使用 MSP430F5529获得的结果、右侧是我使用 Arduino 获得的结果、我使用一些示例代码进行了调试。 我认为这更像我应该得到的东西。有人知道我做了什么错误,还是有我应该尝试的示例代码? 如果您需要头文件或 c 文件、请告诉我。



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

    您好!

    我看到了这两个代码片段、但我没有看到您所指的其他图片。 通常、TI 在 TI Resource Explorer 中提供 I2C 示例 、以帮助客户正确初始化 I2C 模块并启动和运行 I2C 通信。 导入我刚才提供的一个 USCI I2C 代码示例、并浏览其中、了解需要修改代码示例的内容以满足您的特定需求、例如修改从器件地址。

    在尝试将一个 Launchpad 连接到 ADS1100之前、让示例与2个 Launchpad 一起运行可能是有益的。

    此致、

    Matt

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

    感谢您的回复。 我现在确实让它工作了… 我将添加我最终使用的代码和逻辑分析仪的图片、以显示我得到的结果。 我不知道我上次尝试添加的照片发生了什么。 我的下一个问题可能有点偏离主题、但您是否知道我如何将该结果转换为16位值?

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430F552x 演示- USCI_B0 I2C 主设备 RX 多个来自 MSP430从设备的字节
    //
    //说明:此演示通过 I2C 总线连接两个 MSP430。 从
    器件//发送到主器件。 这是主代码。 它持续
    //接收一组数据并演示如何使用
    USCI_B0 TX 中断实现接收多个字节的 I2C //主接收器。
    // ACLK = n/a、MCLK = SMCLK = BRCLK =默认 DCO =~1.045MHz
    //
    ***与"MSP430F55xx_uscib0_i2c_11.c"***一起使用
    
    /|\/|\
    // MSP430F5529 10k 10k MSP430F5529
    // 从器件 || 主器件
    // -------- |||---
    // -|XIN P3.0/UCB0SDA|-|-|-+->|P3.0/UCB0SDA XIN|-
    // | || | |
    // -|XOUT || | XOUT|-
    // | P3.1/UCB.S.|<---- >|P3.1/UCB.S. |
    // | | | |////
    
    Bhargavi Nisarga
    // Texas Instruments Inc.
    // 2009年4月
    //使用 CCSv4和 IAR Embedded Workbench 构建版本:4.21
    //*********
    
    #include 
    
    unsigned char * PRxData; //指向 RX 数据
    的指针 unsigned char RXByteCtr;
    volatile unsigned char RxBuffer[2]; //分配128字节的 RAM
    
    int main (void)
    {P6DIR |= 0x01;
    WDTCTL = WDTPW + WDTHOLD; //停止 WDT
    P3SEL |= 0x03; //将 I2C 引脚分配给 USCI_B0
    UCB0CTL1 |= UCSWRST; //启用 SW 复位
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
    UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位
    UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
    UCB0BR1 = 0;
    UCB0I2CSA = 0x48; //从器件地址为048h
    UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
    UCB0IE |= UCRXIE; //启用 RX 中断
    
    while (1)
    {
    PRxData =(unsigned char *) RxBuffer;// RX 缓冲区开始
    RXByteCtr = 2; //加载 RX 字节计数器
    while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
    UCB0CTL1 |= UCTXSTT; // I2C 启动条件
    
    _bis_SR_register (LPM0_bits + GIE); //输入 LPM0,启用中断
    //保持在 LPM0中直到所有数据
    //是 RX
    __no_operation(); //设置断点>>此处<<和
    } //读出 RxBuffer 缓冲区}--><!--kadov_tag{</spaces>}}-->
    
    
    
    // USCI_B0数据 ISR 用于将接收到的数据从 I2C 从器件//移动
    到 MSP430存储器。 它的结构使得它能够通过
    预先载入带有字节计数的 RXByteCtr 来被用来接收//任一2+数量的字节。
    ///----------------------------------
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
    #pragma vector = USCI_B0_vector
    __interrupt void USCI_B0_ISR (void)
    #Elif defined (__GNU__)
    void __attribute__(interrupt (USCI_B0_vector)#USCI_ISR vector (void
    
    )(void)#USCI_ISR vector 0!
    #endif
    {
    switch (__even_in_range (UCB0IV、12))
    {
    case 0:break; //向量0:无中断
    情况2:中断; //向量2:ALIFG
    情况4:中断; //向量4:NACKIFG
    情况6:中断; //向量6:STTIFG
    情况8:中断; //向量8:STPIFG
    情况10: //向量10:RXIFG
    RXByteCtr---; //递减 RX 字节计数器
    IF (RXByteCtr)
    {
    * PRxData++= UCB0RXBUF; //将 RX 数据移动到地址 PRxData
    IF (RXByteCtr = 1) //只剩下一个字节?
    UCB0CTL1 |= UCTXSTP; //生成 I2C 停止条件
    }
    其他
    {
    * PRxData = UCB0RXBUF; //将最终 RX 数据移动到 PRxData
    __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);//退出活动 CPU
    }
    中断;
    案例12:中断; //向量12:TXIFG
    默认值:break;
    }
    

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

    您好!

    为了将结果转换为16位值、必须声明"int"变量并将结果复制到该变量中。

    此致、

    Matt