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.

[参考译文] MSP430F5529 I2C 通信

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1035641/msp430f5529-i2c-communication

器件型号:MSP430F5529

我想 使用 MSP430F5529从 I2C 从机模块的特定0x03寄存器中读取数据、但我不能使用带应答的16位数据、而只能获取8位数据开关 NACK。我的代码

#include
字符 Data_in=0;
unsigned char RXByteCtr;
unsigned char * PRxData;
volatile unsigned char RxBuffer[128];
void main (void)

    volatile int i;
WDTCTL = WDTPW + WDTHOLD;                //停止 WDT                         // P1.0输出
 P3SEL |= 0x03;                           //将 I2C 引脚分配给 USCI_B0
 UCB0CTL1 |= UCSWRST;                     //启用 SW 复位
 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;    // I2C 主器件、同步模式
 UCB0CTL1 |= UCSSEL_2;           //使用 SMCLK
 UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
 UCB0BR1 = 0;
 UCB0I2CSA = 0x40;                        //从地址为048h
 UCB0CTL1 &=~UCSWRST;                    //清除 SW 复位,恢复运行
UCB0IE |= UCTXIE;
UCB0IE |= UCSTPIE + UCSTTIE + UCRXIE;
volatile int c=1;
_enable_interrupt ();
  while (1)
  {
   
RXByteCtr = 2;
UCB0CTL1 |= UCTR + UCTXSTT;
while (UCB0CTL1 & UCTXSTP);
UCB0CTL1 &=~UCTXSTP;
UCB0CTL1 &=~UCTR;
UCB0CTL1 |=UCTXSTT;
while (UCB0CTL1 & UCTXSTP);
UCB0CTL1 &=~UCTXSTP;
  }
    }

#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)

    switch (UCB0IV){
        情况0x0A:
            RXByteCtr --;                           //递减 RX 字节计数器
               IF (RXByteCtr)
               {
                 * PRxData++= UCB0RXBUF;              //将 RX 数据移动到地址 PRxData
                 如果(RXByteCtr = 1)                  //只剩下一个字节?
                   UCB0CTL1 |= UCTXSTP;               //生成 I2C 停止条件
               }
               其他
               {
                 * PRxData = UCB0RXBUF;                //将最终的 RX 数据移动到 PRxData
                 _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
               }
               中断;
        情况0x0C:
            UCB0TXBUF = 0x01;
            中断;
        默认值:
            中断;

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

    我可以从0x01或0x03读取所有的16位寄存器。我想从特定寄存器读取16位数据。

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

    您好、Makkapati、

    您可以参考 I2C 示例代码。 这将为您提供帮助。

    dev.ti.com/.../node

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

    您好、Allen 它接收已发送的信号、但我们必须在这里读取从器件的特定寄存器、我必须读取0x03寄存器

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

    您好、Makkapati、

    您需要查看其 I2C 读取协议的从器件数据表。 通常、读取协议就是这样的。

    发送写入命令以写入需要读取和重新启动的特殊寄存器命令、然后发送读取命令并等待从机传输数据。

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


    我必须读取2个字节、但在这里、我只能读取 MSB 8位数据

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

    > while (UCB0CTL1 & UCTXSTP);

    由于 TXSTP 最初不是高电平、因此等待 TXSTP 变为低电平不是等待完成的有效方式。 Tx 侧可能会意外工作、但您几乎肯定会过早地停止 Rx 侧。 请尝试用替换它

    > LPM0; //等待完成。

    您必须将其添加到"CASE 0x0C"中:

    >_BIC_SR_REGISTER_ON_EXIT   (LPM0_BITS);//退出活动 CPU

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

    大家好、Bruce、正如您所说的、我尝试过、但即使沟通尚未建立、也似乎是一个反应不灵敏的页面。

    #include
    int Data_in=0;
    unsigned int RXByteCtr;
    unsigned int Temperature;
    volatile unsigned int RxBuffer[128];
    void main (void)

    volatile int i;
    WDTCTL = WDTPW + WDTHOLD;//停止 WDT // P1.0输出
    P3SEL |= 0x03;//将 I2C 引脚分配给 USCI_B0
    UCB0CTL1 |= UCSWRST;//启用 SW 复位
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
    UCB0CTL1 |= UCSSEL_2;//使用 SMCLK
    UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
    UCB0BR1 = 0;
    UCB0I2CSA = 0x40;//从地址为048h
    UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
    //UCB0IE |= UCRXIE;
    UCB0IE |= UCTXIE;
    UCB0IE |= UCSTPIE + UCSTTIE + UCRXIE;
    volatile int c=1;
    _enable_interrupt ();
    while (1)

    //if (c%2=1)
    //{
    RXByteCtr = 2;
    UCB0CTL1 |= UCTR + UCTXSTT;
    //while (UCB0CTL1和 UCTXSTP);
    LPM0;
    UCB0CTL1 &=~UCTXSTP;
    UCB0CTL1 &=~UCTR;
    UCB0CTL1 |=UCTXSTT;
    //while (UCB0CTL1和 UCTXSTP);
    LPM0;
    UCB0CTL1 &=~UCTXSTP;
    //否则(c%2=0)
    //{
    // while (UCB0CTL1 & UCTXSTP);
    //UCB0CTL1 |= UCTR + UCTXSTT;
    //UCB0CTL1 &=~UCTXSTP;
    //UCB0CTL1 |=UCTXSTT;
    //UCB0CTL1 &=~UCTR;
    //while (UCB0CTL1和 UCTXSTP);
    //}
    //UCB0CTL1 &=~UCTXSTP;


    #pragma vector = USCI_B0_vector
    _interrupt void USCI_B0_ISR (void)

    switch (UCB0IV){
    情况0x0A:
    RXByteCtr --;//递减 RX 字节计数器
    IF (RXByteCtr)

    温度|= UCB0RXBUF;//将 RX 数据移动到地址 PRxData
    IF (RXByteCtr = 1)
    // MSB 温度
    温度|= UCB0RXBUF<< 8;
    温度|= UCB0RXBUF;
    UCB0CTL1 |= UCTXSTP;//只剩下一个字节?
    //生成 I2C 停止条件

    其他

    //将最终 RX 数据移动到 PRxData
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU

    中断;
    情况0x0C:
    UCB0TXBUF = 0x03;
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
    中断;
    默认值:
    中断;

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

    您好、Makkapati、

    [引用 userid="497383" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1035641/msp430f5529-i2c-communication/3832215 #3832215"]if (RXByteCtr)

    温度|= UCB0RXBUF;//将 RX 数据移动到地址 PRxData

    当第二次进入 ISR、即 RxByteCtr =时、新的 RXBUF 数据将取代加载了之前 RXBUF 数据的低8位温度。  

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

    是的、我如何发送它  

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

    也意味着如何存储 lsb 位

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

    您好 Makkapati,

    在继续之前先进行判断、这是逻辑问题。 使用设备是否有任何问题?

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

    逻辑问题、正如您告诉过它唯一通过 i2c 总线的 MSB 字节一样。

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

    您好、Makkapati、

    您是否解决了问题? 获取第一个8位数据并将其移动到"int"变体的高8位。  然后获取下一个8位数据、将其置于低位。

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

    我没有解决  

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

    我解决了我的问题、感谢大家的回应。