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.

[参考译文] MSP430F2471:MSP430F2471

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/653403/msp430f2471-msp430f2471

部件号:MSP430F2471

我通过浏览数据表,用户指南 和应用报告来连接湿度传感器。  我有一些与i2c相关的问题。

传感器未给出确认

问题

  1. 写入从机的开始,写入地址字节,停止后,传感器未给出确认。
  2. SCL的脉冲宽度是否正确?

我为生成时钟和数据所做的工作:

********

 UCB1BR0 = 12;                      // fSCL =SMCLK/12 =~100kHz

 UCB1BR1 = 0;

 UCB1I2CSA = 0x51;                  // 默认从属地址(0x28)在传感器数据表中给出

 ******* 从机启动,停止和写入地址的连续循环*****************

 同时(1)

UCB1CTL1 || UCTXSTT;            // I2C启动条件

UCB1CTL1 || UCTXSTP;            //生成I2C停止条件

}

除以上所述外,我还为USCI模块设置了必要的配置。

根据I2C协议和数据表,我的问题给出了Start序列,7位从属地址和写入位从属写入地址0x28的计算字节为0x51。

所以我设置 了UCB1I2CSA = 0x51。

因此,在发送开始后,从属写入地址必须在9时钟脉冲中通过使SDA线路低电平(这不会发生)从传感器发出确认。

生成的时钟脉冲类似于峰值。 正确吗? 时钟脉冲是否有任何问题。

有人能帮我分析这种情况吗? 我已经从CRO看到了这种反应。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UCB1I2CSA不包括R/W位,因此您应该将其设置为标称地址,即0x28。 R/W位是从UCTR生成的。 (在过去糟糕的日子里,有几个设备数据表包含R/W位;对于那些需要正确移动标称地址以获得正确I2CSA的设备数据表。 我最近没有见过这些。)

    SCL轨迹看起来不是很好,但可能足够了。 SDA看起来更干净,这有点奇怪。 如果您担心,您可以(a)加强上拉和/或(b)降低总线速度(br0)。

    我没有尝试在启动后立即停止I2C设备。 范围似乎说它可以,但也许值得在这两个时间之间进行延迟,只是为了减少变量的数量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请提供正在使用的确切湿度传感器,请记住,某些从属设备可以根据专用引脚上的逻辑级别对不同的从属设备地址作出响应。

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

    Ryan先生,该传感器是HYT271湿度和温度传感器。 但我只想读取湿度字节。 在这里,我要附上数据表。  

    我的从属地址(0x28), 写入地址(0x50)和读取地址(0x51)的默认地址。 我已经 设置 了I2CSA=0X28 (标称地址)   ,因为 TI给出的示例中没有

    显示时钟和数据。 然后,我将其设置为 写入地址(0x50),响应显示在CRO屏幕截图下方。  

    我已设置I2CSA=0x50

    (0x50 =101万的7位地址)


    配置是否正确? 以及

    •  为什么CRO中的8位高(1),但应该低(0)
    •  为什么没有来自从属设备(即SDA线路上的第9位)的确认信号应该为低电平

    如何获得确认。  请为从属设备的写入和读取推荐正确的配置寄存器。

     

     

    e2e.ti.com/.../hyt_2D00_manual.pdf

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

    UCB1I2CSA应等于0x28,并且UCTR应重置为接收器模式,这会导致高读/写位。 因此,前八位应该是101.0001万b,如果正确提供,HYT271将通过拉第九个时钟的低数据线来确认。 在实际收到来自湿度传感器的必要数据字节之前,不应生成停止条件,请参阅msp430x24x_uscib0_i2c_10.c示例。 另请注意,推荐的上拉电阻为2.2 kOhm。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    亲爱的Ryan,我最初尝试过设置I2CSA=0x28 (默认从属地址),但湿度模块在CRO上没有发现痕迹。

    正如你所说,根据代码示例,我已更改了我的代码
    ----------------------------------
    #include <MSP4S.h>

    unsigned char *PRxData; //指向RX数据的指针
    无符号的char RXByteCtr;
    volatile unsigned char RxBuffer[128]; //分配128字节的RAM

    内部主(无效)

    WDTCTL = WDTPW + WDTHOLD; //停止WDT
    P5SEL |= 0x06; //将I2C引脚分配给USI_B0
    UCB1CTL1 |= UCSWRST; //启用软件重置
    UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
    UCB1CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
    UCB1BR0 = 12; // fSCL = SMCLK/12 =~100kHz
    UCB1BR1 = 0;
    UCB1I2CSA = 0x28; //从属地址为028h
    UCB1CTL1 &=~UCSWRST; //清除软件重置,恢复操作
    UC1IE|= UCB0RXIE; //启用RX中断

    同时(1)

    PRxData =(unsigned char *)RxBuffer; // RX缓冲区开始
    RXByteCtr = 4; //加载RX字节计数器
    同时(UCB1CTL1和UCTXSTP); //确保停止条件已发送
    UCB1CTL1 || UCTXSTT; // I2C启动条件
    __bis_sr_register (CPUOFF + GIE); //输入带中断的LPM0
    //保留在LPM0中,直到所有数据
    //为RX
    __no_operation(); //设置断点>>此处<<和
    } //读取RxBuffer缓冲区
    }

    //------------------
    // USI_B0数据ISR用于移动从I2C从属设备接收的数据
    //至MSP430内存。 它的结构可以用于接收
    //通过预加载带字节计数的RXByteCtr,可获得任意2个以上的字节。
    //------------------
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector = USCIAB1TX_vector
    __interrupt void USCIAB1TX_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (USBIAB1TX_vector))) USBIAB1TX_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    RXByteCtr --; // Decrement RX字节计数器
    IF (RXByteCtr)

    *PRxData++= UCB1RXBUF; //将RX数据移动到PRxData地址
    IF (RXByteCtr == 1) //只剩下一个字节?
    UCB1CTL1 || UCTXSTP; //生成I2C停止条件
    }
    否则

    *PRxData = UCB1RXBUF; //将最终RX数据移至PRxData
    __BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出LPM0
    }
    }

    我的问题:
    1.在I2C1SA=0X28下未观察到任何迹线
    2.将字节(0x50)写入传感器并从传感器读取字节的配置
    3.如何在上述代码中使用UCTR


    请帮帮我。


    此致,
    斯瓦罗普。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道I2CSA的特定设置(本身)会导致I2C单元发送/不发送地址字节的机制。 我怀疑还有其他事情发生了。

    您使用的是哪种主板? (我不记得使用F2471的商品主板。) 传感器是否是I2C总线上唯一的(其他)单元? 您如何触发您的范围?

    您以前的程序可能是更好的测试案例。 您是否尝试过I2CSA=0x28?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的, 我在I2CSA=0X28上尝试过,传感器未在示波器上提供任何输出。

    我不能怀疑传感器,因为我已通过使用I/O线(位冲击)获得读数,并从传感器读取数据。

    主板是由我设计的定制主板,它正在处理位冲击。 我使用了3.32K的上拉电阻,该电阻在指定范围内。

    我已经触发了SCL和SDA线路的范围。 我已在上一封邮件(2018年1月3日下午5:38)中发布了屏幕截图,其中I2CSA=0x50,但未发布I2CSA=0X28。

    所以,请向我建议解决方案。

    谢谢,此致,

    斯瓦罗普。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一个快速说明,提供的代码示例使用UCB0RXIE而不是UCB1RXIE。 它们对应于相同的值,因此实际上不会影响您的操作。 和Bruce一样,我从未听说过USCI无法根据I2CSA的内容发送从属地址。 是否发送了启动条件? 请提供屏幕截图以供参考。 如果从总线断开传感器并对MSP430 I2C输出进行示波,会发生什么情况?

    此致,
    Ryan