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.

[参考译文] MSP430FR5994:I2C 简单主器件 TX IRQ

Guru**** 2589300 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/679740/msp430fr5994-i2c-simple-master-tx-irq

器件型号:MSP430FR5994
主题中讨论的其他器件: MSP430WARE

尊敬的 Sirs:

   发现我必须使用中断来发送一个从器件地址和一个数据字节。  因此、在我的简单示例中添加了中断。

程序会发送从地址、但从不发送数据=200dec。  如果我在中断例程的顶部放置一个断点、它也会发送  

一个停止条件、否则它只发送从器件地址。  在我看来、它符合手册中的示例、但仍然无法正常工作。

有什么想法吗?

谢谢、 John

代码:

#include


unsigned int TXByteCtr;
unsigned char *pTxData;
Int A;

typedef unsigned char uint8;

/*********
测试 I2C MSP430FR5994

使用中断的简单 I2C 发送器。 用于写入电子电位计。

将 I2C TxData 输出 P5.0和 P5.1

最初来自 Dang
秘书长的报告 /

int main (空)

int i;

WDTCTL = WDTPW + WDTHOLD;//停止 WDT

PM5CTL0 &=~LOCKLPM5;//默认情况下禁用 GPIO 电源

UCB1CTL1 |= UCSWRST;//启用 SW 复位

P5SEL0 |= BIT0;//UCB1SIMO
P5SEL0 |= BIT1;//UCB1SOMI
//P5SEL0 |= BIT3;//UCB1STE (从器件 TX 使能)

P5SEL1 &=~BIT0;//UCB1SIMO
P5SEL1 &=~BIT1;//UCB1SOMI
//P5SEL1 &=~BIT3;//UCB1STE (从器件 TX 启用)

//UCMODE_3设置 I2C 模式
UCB1CTLW0 |=(UCMST + UCMODE_3 + UCTR);// I2C 主设备、I2C、发送器
UCB1CTLW1 = UCASTP_2;//自动停止有效
UCB1BRW = 8;// fSCL = SMCLK/12 =~100kHz
UCB1TBCNT = 2;// 2字节数据
//UCB1BR1 = 0;
UCB1I2CSA = 0x1;//从器件地址为1AH
UCB1CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行

UCB1IE |= UCTXIE;//为 UCB1IE 启用 TX 中断
ENABLE_INTERRUPTS ();//全局 IE

TXByteCtr = 1;//加载 TX 字节计数器


UCB1TXBUF = 200;//使用 POT 值加载 TX 缓冲器
UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件此传输! UCTR 是 UCBxCTLW0的位4 (0x10)

while (1)

// while (UCB1CTL1 & UCTXSTP);//确保发送了 STOP 条件
// UCB1CTL1 |= UCTR + UCTXSTT;// I2C TX,启动条件
//__bis_SR_register (CPUOFF + GIE);//输入 LPM0并带有中断
//保持在 LPM0中直到所有数据
A=a+1;//是 TX
循环:
// UCB1TXBUF = TxData;//加载新的 TX 缓冲区!!
for (i=0;i<10000;i++)//发送时的延迟
A=a+1;


///----------------------------------
// USCIAB0TX_ISR 的结构使其可用于传输任何数据
//预加载带有字节计数的 TXByteCtr 的字节数。

//
///----------------------------------
//#pragma vector = USCI_B1_vector
//_INTERRUPT void ISR_USCI_B1 (void){
#pragma vector = USCI_B1_Vector
_interrupt void USCI_B1_ISR (void){
静态 int IFlags;

IFlags = UCB1IFG;

if (TXByteCtr)//检查 TX 字节计数器

UCB1TXBUF = 200;//加载 TX 缓冲器

TXByteCtr -;//减量 TX 字节计数器
IFlags = UCB1IFG;
UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件
UCB1IFG &=~UCTXIFG;//清除 USCI_B1 TX 内部标志


其他

UCB1CTL1 |= UCTXSTP;// I2C 停止条件
UCB1IFG &=~UCTXIFG;//清除 USCI_B1 TX 内部标志
//_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

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

    请参阅演示代码"msp430fr599x_euscib0_i2c_main_multislave.c"、使用 I2C 项目开发主器件 TX。

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

    我现在使用这个示例。 从设备没有为 SA 拉低。 这就是为什么它会持续发送从器件地址?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    您是说从器件不发送 ACK 信号? 您是否在示波器或逻辑分析仪上看到 SCL 和 SDA 的信号? 您可以首先查看一些要点:1.check SCL 和 SDA 都是上拉电阻。 2.从示波器中查看地址是否正确由主器件发送。
    此致
    Gary
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    加里:
    是的、这次有上拉电阻器。 地址看起来是正确的。 中断例程的向量是针对 UCNACKIFG 的、这将提供一个重新启动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    器件是否进入 UCNACKIFG 的 ISR? 是否在正确地址后看到从器件的 ACK? 如果主设备已完成工作、从设备可能没有问题。您可以更改其他从设备进行测试(例如、您可以使用其他 Launchpad 作为从设备)

    此致

    Gary

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

    加里,你在结束时给我药物:

       已在其他产品上运行示例代码、并且该代码工作正常。  修改了示例以向从器件发送两个字节(包括从器件 ADX 在内的总共3个字节)。

    这很好。  是一个波形。

    代码为:

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


    //发送3个字节来写入一个选定的 POT:从器件 ADX (0x4c)、命令字节(0)、数据字节
    //
    #include

    unsigned char TXData[]={0x0、0x80、0、0};//仅使用前两个
    //const unsigned char SlaveAddress[]={0x4c、0x0B、0x0C、0x0D};
    volatile unsigned char TXByteCtr;
    volatile unsigned char ByteCnt;
    volatile unsigned char SlaveFlag = 0;

    int main (空)

    WDTCTL = WDTPW | WDTHOLD;

    //配置 GPIO
    P5SEL0 |= BIT0 | BIT1;
    P5SEL1 &=~(BIT0 | BIT1);


    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;

    //将 USCI_B1配置为 I2C 模式
    UCB1CTLW0 = UCSWRST;//将 eUSCI_B 置于复位状态
    UCB1CTLW0 |= UCMODE_3 | UCMST | UCSSEL_SMCLK;// I2C 主控模式、SMCLK
    UCB1BRW = 0x8;//波特率= SMCLK / 8
    UCB1CTLW0 &=~UCSWRST;//清除复位寄存器
    UCB1IE |= UCTXIE0 | UCNACKIE;//发送和 NACK 中断使能

    SlaveFlag = 0;//初始化 SlaveFlag

    while (1)

    __DELAY_CYCLES (5000);//传输之间的延迟
    UCB1I2CSA = 0x01a;//配置从地址 MCSID BAT U3=0x1a
    TXByteCtr = 2;//加载 TX 字节计数器
    ByteCnt =0;针对 IRQ 的//inc 数据字节计数器
    while (UCB1CTLW0和 UCTXSTP);//确保发送了 STOP 条件

    UCB1CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件

    _bis_SR_register (LPM0_bits | GIE);//输入 LPM0、带中断
    //保持在 LPM0中直到所有数据
    //是 TX
    TXData[1]= TXData[1]+1;//包括用于测试的数据!!!

    //更改从机地址
    /*
    SlaveFlag++;
    if (SlaveFlag > 3)//翻转从地址

    SlaveFlag = 0;

    *

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = EUSCI_B1_Vector
    _interrupt void USCI_B1_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(EUSCI_B1_Vector)) USCI_B1_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    开关(__evo_in_range (UCB1IV、USCI_I2C_UCBIT9IFG))

    实例 USCI_NONE:break;//向量0:无中断
    案例 USCI_I2C_UCALIFG:中断;//矢量2:ALIFG
    案例 USCI_I2C_UCNACKIFG://向量4:NACKIFG
    UCB1CTLW0 |= UCTXSTT;//如果 NACK,则重新发送开始
    中断;
    案例 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
    案例 USCI_I2C_UCTXIFG0://向量24:TXIFG0
    if (TXByteCtr)//检查 TX 字节计数器

    UCB1TXBUF = TXData[ByteCnt];//加载 TX 缓冲区
    ByteCnt++;//inc 字节计数
    TXByteCtr -;//减量 TX 字节计数器

    其他

    UCB1CTLW0 |= UCTXSTP;// I2C 停止条件
    UCB1IFG &=~UCTXIFG;//清除 USCI_B1 TX 内部标志
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0

    中断;
    案例 USCI_I2C_UCBCNTIFG:break;//向量26:BCNTIFG
    案例 USCI_I2C_UCCLTOIFG:中断;//矢量28:时钟低电平超时
    案例 USCI_I2C_UCBIT9IFG:中断;//矢量30:第9位
    默认值:break;

    e2e.ti.com/.../i2c-Waveforms.pdf