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.

[参考译文] MSP430G2553:用于添加串行输出的 I2C USCI 示例代码

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/568941/msp430g2553-i2c-usci-example-code-to-add-serial-output

器件型号:MSP430G2553
主题中讨论的其他器件:EnergiaMSP430WARE

我使用 MSP-430G2553作为主器件从传感器读取值、并在 Energia 中进行编程。 我的示波器上的数据看起来不错、但我想将其输出到 Serial.println。  

当我添加 Serial.begin(9600时)、我收到以下错误。  "内核.a (USCI_ISR_handler.c.o):在函数`_ISR_6'中:"

有人能告诉我如何在本示例中实施串行监视器吗?

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

    尊敬的 Patrick:

    您是否使用以下示例代码"master_reader"?

    //线缆主读卡
    器// Nicholas Zambetti <http://www.zambetti.com> //
    
    演示了线缆库的使用
    //从 I2C/TWI 从器件读取数据
    //参考与此一起使用的“线缆从发送器”示例
    
    //创建于2006年3月29日
    
    //此示例代码位于公共域中。
    
    
    #include 
    
    void setup()
    {
    Wire.begin(); //加入 i2c 总线(主器件的可选地址)
    Serial.begin(9600);//开始串行输出
    }
    
    void loop()
    {
    Wire.requestFrom (2、6);//从从从器件#2请求6个字节
    
    while (Wire.available ())//从器件发送的数据可能小于请求
    的{
    char c = Wire.read();//接收一个作为字符的字节
    serial.print(c); //打印字符
    }
    
    延迟(500);
    } 

    此致、

    James

    MSP 客户应用

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

    您好!

    这也是我要引用的代码。 感谢您的帮助。

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *
    秘书长的报告
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是通常包含的低级程序
    *高度演示单个外设功能或器件功能
    *简明扼要。 为此、代码可能依赖于器件的加电默认值
    *寄存器值和设置、如时钟配置和注意
    *在组合多个示例中的代码时应采取这种方法、以避免潜在的问题
    *效果。 有关 GUI、另请参阅 www.ti.com/grace 和 www.ti.com/msp430ware
    *用于外设配置的 API 函数库方法。
    *
    *--/版权--*/
    //
    // MSP430G2xx3演示-来自 MSP430从器件的 USCI_B0 I2C 主器件 TX/RX 多个字节
    //在 TX 和 RX 操作之间重复启动。
    //
    //说明:此演示通过 I2C 总线连接两个 MSP430。 主器件
    //发送到从器件,然后生成重复起始,接着是
    //接收操作。 这是主代码。 此代码演示了如何操作
    //使用 USCI_B0 TX 实现一个带有 USCI 模块的 I2C 重复起始
    //中断。
    // ACLK = n/a、MCLK = SMCLK = BRCLK =默认 DCO =~1.2MHz
    //
    //***与 msp430x22x4_uscib0_i2c_13.c***一起使用
    //
    ///|\/|\
    // MSP430F24x 10k MSP430G2xx3
    //从器件||主器件
    //------------ |||---
    //-|XIN P3.1/UCB0SDA|-|--+-|P3.1/UCB0SDA XIN|-
    //|||||
    //-|XOUT ||| XOUT|-
    //| P3.2/UCB.S.|<---- |P3.2/UCB.S.|
    //||||
    //
    // D. Dang
    // Texas Instruments Inc.
    // 2011年2月
    //使用 CCS 版本4.2.0和 IAR Embedded Workbench 版本:5.10构建
    //
    #include

    #define NUM_bytes_TX 3 //有多少字节?
    #define NUM_bytes_RX 2.

    int RXByteCtr、RPT_Flag = 0;//启用重复启动(如果为1)
    volatile unsigned char RxBuffer[128];//分配128字节的 RAM
    unsigned char * PTxData;//指向 TX 数据的指针
    unsigned char * PRxData;//指向 RX 数据的指针
    无符号字符 TXByteCtr、RX = 0;
    unsigned char MSData = 0x00;

    void Setup_TX (void);
    void Setup_RX (void);
    void transmit (void);
    接收无效(无效);
    void Debug (void);
    int main (空)

    WDTCTL = WDTPW + WDTHOLD;//停止 WDT
    P1SEL |= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
    P1SEL2|= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0

    while (1){

    //传输过程
    Setup_TX();
    RPT_Flag = 1;
    Transmit ();
    while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件

    //接收过程
    Setup_RX();
    receive();

    while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件

    ///----------------------------------
    // USCI_B0数据 ISR 用于移动从 I2C 从设备接收到的数据
    //到 MSP430内存。 它的结构使其可用于接收
    //通过预加载 RXByteCtr 并进行字节计数,可获得任意2+个字节。
    ///----------------------------------
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = USCIAB0TX_vector
    _interrupt void USCIAB0TX_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((interrupt (USCIAB0TX_vector)) USCIAB0TX_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    if (RX = 1){//主机接收?
    RXByteCtr --;//递减 RX 字节计数器
    IF (RXByteCtr)

    * PRxData++= UCB0RXBUF;//将 RX 数据移动到地址 PRxData

    其他

    if (RPT_Flag = 0)
    UCB0CTL1 |= UCTXSTP;//无重复起始:停止条件
    if (RPT_Flag = 1){//如果重复起始:不执行任何操作
    RPT_Flag = 0;

    * PRxData = UCB0RXBUF;//将最终的 RX 数据移动到 PRxData
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

    else{//主机发送
    if (TXByteCtr)//检查 TX 字节计数器

    UCB0TXBUF = MSData++;//加载 TX 缓冲区
    TXByteCtr -;//减量 TX 字节计数器

    其他

    if (RPT_Flag = 1){
    RPT_Flag = 0;
    PTxData =&MSData;// TX 数组起始地址
    TXByteCtr = NUM_Bytes_TX;//加载 TX 字节计数器
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);

    否则{
    UCB0CTL1 |= UCTXSTP;// I2C 停止条件
    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0


    void Setup_TX (void){
    _disable_interrupt ();
    RX = 0;
    IE2 &=~UCB0RXIE;
    while (UCB0CTL1 & UCTXSTP);//确保发送停止条件//禁用 RX 中断
    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 复位,恢复运行
    IE2 |= UCB0TXIE;//启用 TX 中断

    void Setup_RX (void){
    _disable_interrupt ();
    RX = 1;
    IE2 &=~UCB0TXIE;
    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 复位,恢复运行
    IE2 |= UCB0RXIE;//启用 RX 中断

    void transmit (void){
    PTxData =&MSData;// TX 数组起始地址
    TXByteCtr = NUM_Bytes_TX;//加载 TX 字节计数器
    while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
    UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
    //_bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断

    void receive (void){
    PRxData =(unsigned char *) RxBuffer;// RX 缓冲区开始
    RXByteCtr = NUM_Bytes_RX-1;//加载 RX 字节计数器
    while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
    Debug();//启用 RX 中断
    UCB0CTL1 |= UCTXSTT;// I2C 启动条件
    //_bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断

    void Debug (void){
    _disable_interrupt ();
    //Serial.print (* PRxData);
    IE2 |= UCB0RXIE;