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:MSP430F5529 I2C 通信

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

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

器件型号:MSP430F5529

 我想使用 i2c 通信从 tmp007获取温度、您能用 c 语言的 CCS 编码指导我完成这一过程吗? 我使用的是一个 tmp007温度传感器、其 i2c 从器件地址为0x40。 您是否会向我提供如何继续此过程。

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

    您好!

    这里有一些 I2C 代码示例。 它应该会有所帮助。

    https://www.ti.com/lit/zip/slac300

    此致、

    现金 Hao

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

    #include

    字符 Data_in;
    /**
    * main.c
    *
    void main (void)
    {volatile int i;
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    UCB0CTL1 |= UCSWRST;
    UCB0CTL1 |= UCSSEL_3;
    UCB0BRW=10;
    UCB0CTLW0 |=UCMODE_3+UCSYNC;
    UCB0CTL0 |= UCMST;
    UCB0I2CSA = 0x40;
    UCB0TBCNT = 1;
    UCB0CTLW1 |=UCASTP_2;
    P3SEL |= 0x03;
    UCB0CTL1 &=~UCSWRST;
    UCB0IE |= UCTXIE;
    UCB0IE |= UCRXIE;
    _enable_interrupt ();
    while (1)

    UCB0CTLW0 |=UCTR;
    UCB0CTLW0 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;
    UCB0CTLW0 &=~UCTR;
    UCB0CTLW0 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;


    #pragma vector = USCI_B0_vector
    _interrupt void USCI_B0_ISR (void)

    switch (UCB0IV){
    情况0x16:
    DATA_IN=UCB0RXBUF;
    中断;
    情况0x18:
    UCB0TXBUF = 0x01;
    中断;
    默认值:
    中断;

    }     

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

    我生成了这样的代码、它显示  UCB0TBCNT 未定义

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

    F5529具有 USCI、而不是 eUSCI。 USCI 没有自动停止功能(UCASTTP 和 TBCNT)。 请确保阅读的是用户指南(SLAU208Q)第38章、而不是第41章。

    如果更方便、示例也位于 Resource Explorer 中、位于此处:

    https://dev.ti.com/tirex/explore/node?node=ACt.3NsUP.t3V3gtuC8DhQ__IOGqZri__LATEST

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

    大家好、我已经在第38章中探讨了寄存器 、我喜欢这样做  

    #include

    字符 Data_in;
    /**
    * main.c
    *
    void main (void)
    {volatile int i;
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    UCB0CTL1 |= UCSWRST;
    UCB0CTL1 |= UCSSEL_3;
    UCB0BRW=10;
    UCB0CTLW0 |=UCMODE_3;
    UCB0CTL0 |= UCMST;
    UCB0I2CSA = 0x40;
    P3SEL |= 0x03;
    UCB0CTL1 &=~UCSWRST;
    UCB0IE |= UCTXIE;
    UCB0IE |= UCRXIE;
    _enable_interrupt ();
    while (1)

    UCB0CTLW0 |=UCTR;
    UCB0CTLW0 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;
    UCB0CTLW0 &=~UCTR;
    UCB0CTLW0 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;


    #pragma vector = USCI_B0_vector
    _interrupt void USCI_B0_ISR (void)

    switch (UCB0IV){
    情况0x16:
    DATA_IN=UCB0RXBUF;
    中断;
    情况0x18:
    UCB0TXBUF = 0x01;
    中断;
    默认值:
    中断;

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

    但我仍然无法在示波器中查看输出

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

    我想从从从地址40和寄存器地址0x1h 读取数据

    尽管我在示波器中没有得到任何 o/p,但有任何特定的寄存器可直接查看数据。  

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

    #include

    字符 Data_in;
    /**
    * main.c
    *
    void main (void)
    {volatile int i;
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    UCB0CTL1 |= UCSWRST;
    UCB0CTL1 |= UCSSEL_2;
    UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
    UCB0BR1 = 0;
    UCB0CTLW0 |=UCMODE_3+ UCSYNC;
    UCB0CTL0 |= UCMST;
    UCB0I2CSA = 0x40;
    P3SEL |= 0x03;
    UCB0CTL1 &=~UCSWRST;
    UCB0IE |= UCTXIE;
    UCB0IE |= UCRXIE;
    _enable_interrupt ();
    while (1)

    UCB0CTLW0 |=UCTR;
    UCB0CTLW0 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;
    UCB0CTLW0 &=~UCTR;
    UCB0CTLW0 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;


    #pragma vector = USCI_B0_vector
    _interrupt void USCI_B0_ISR (void)

    switch (UCB0IV){
    情况0x02:
    DATA_IN=UCB0RXBUF;
    中断;
    情况0x04:
    UCB0TXBUF = 0x01;
    中断;
    默认值:
    中断;

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

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

    O/p 正像这个时钟那样正常

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

    1) 1) RXIFG/TXIFG 的 UCB0IV 值为0x0A/0x0C [参考用户指南(SLAU208Q)表38-14]。

    2) 2)我不确定示波器迹线显示的内容。 如果您没有时钟、请检查您的上拉电阻器。

    3) 3) TI 发布了 USCI 故障排除指南(SLAA734A)、可能值得一看:

    https://www.ti.com/lit/an/slaa734a/slaa734a.pdf

    4) 4)我建议您至少阅读上述 I2C 示例。 您选择的序列可能起作用、但我尚未尝试。

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

    #include
    字符 Data_in=0;
    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;
    _enable_interrupt ();
    while (1)

    UCB0CTL1 |=UCTR;
    UCB0CTL1 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;
    UCB0CTL1 &=~UCTR;
    UCB0CTL1 |=UCTXSTT;
    while (((UCB0IFG & UCSTPIFG)=0){}
    UCB0IFG &=~UCSTPIFG;


    #pragma vector = USCI_B0_vector
    _interrupt void USCI_B0_ISR (void)

    switch (UCB0IV){
    情况0x0A:
    DATA_IN=UCB0RXBUF;
    中断;
    情况0x0C:
    UCB0TXBUF = 0x03;
    中断;
    默认值:
    中断;

    这是我同时使用的代码、我更改了相同的代码、但 没有得到真正的所需代码。

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

    您好!

    图中的 D0、D1和总线1是什么? 您是否在测试代码时连接到 I2C 从设备?

    此致、

    现金 Hao

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

    是的、我已经分享了另一个论坛现金、这是我的当前状态、您可以查看它

    e2e.ti.com/.../3830782