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.

[参考译文] CCS/MSP430F5529:Msp430f5529和 Hdc2010 I2C 接口

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/867469/ccs-msp430f5529-msp430f5529-and-hdc2010-i2c-interfacing

器件型号:MSP430F5529
主题中讨论的其他器件: HDC2010

工具/软件:Code Composer Studio

大家好、我无法在终端中从 HDC2010到 Msp430f5529读取温度和湿度数据。 请帮助我完成此操作,并告诉我硬件连接。 我在下面发布了我的代码、我在代码库中找到了代码。

#include
#include
#include

/*
使用 MSP430F5529 Launchpad 持续读取和显示来自 TI HDC2010的温度和湿度数据的演示代码。
MCU 在按需模式下定期轮询器件。 中没有温度或湿度阈值
地形。
使用寄存器、中断和 MCU LPM0模式的低级 I2C 通信。 在终端程序上显示数据。
温度分辨率:14位、显示为4个重要数字。
湿度分辨率:显示11位、有3个重要数字。 将 ADR 引脚接地以将从器件地址设置为0x40。
传感器在启动/复位时短暂加热;加热器在3.3V 时消耗90mA 电流
主循环使用来自 LPM3和 VLO 时钟的定时中断运行。 I2C 时钟100kHz;UART 9600波特。
支持 CCS 6.1.3和 nofloat printf 的 IDE。

 具有10k 上拉电阻的 P3.0 SDA
P3.1 SCL、10k 上拉电阻
P3.3 TXD
P3.4 RXD

2018年9月
 *
#定义周期10000 //采样周期。 10000计数约为1秒;最大值为65535
#定义加热器20000 //重置时的脉冲加热器。 20000计数大约为2秒

void SetTimer (void);
void SetVLO (void);
void SetPins (void);
void SetUART (void);
void SetI2C (void);
无效措施(无效);
空 GetData (空);
空加热器(空);

// I2C 通信的变量
volatile uint8_t * PTxData;  //指向 TX 数据的指针
volatile uint8_t TXByteCtr;
volatile uint8_t * PRxData; //指向 RX 数据的指针
volatile uint8_t RXByteCtr;
volatile uint8_t RxBuffer[4];  //为数据分配4个字节的 RAM

//用于 UART 终端显示的变量
字符 str[80];
volatile uint32_t T、TC、H、HC;
volatile uint8_t i、count;

void main (void){

   WDTCTL = WDTPW | WDTHOLD;   //停止看门狗计时器

   SetPins();
   SetVLO();
   SetTimer();
   SetUART();
   SetI2C();

   _BIS_SR (GIE);//启用全局中断
   Heater();//注释此行以防止重置后发热

   while (1)
   {
      TA0CCR0 =周期;//具有 VLO 的循环周期
      LPM3;      //在低功耗模式中等待
      P4OUT |= BIT7;//超时。 打开 Launchpad 上的绿色 LED

      UCB0IE |= UCTXIE + UCRXIE;//启用 TX 和 RX I2C 中断
      measure();//initiate measurement (测量)。
   /*在 LPM3中等待数据变为可用。  更长的延迟时间
   以获得更高的分辨率。 两次14位测量需要~1.2ms。
   请参阅数据表。 也可以将 MSP430置于 LPM4和 WAKEUP 模式
   将 DRDY 置于单独的引脚上*/
      TA0CCR0 = 10;//10 = 1ms
      LPM3;
      //超时,提取数据
      Getdata();
   UCB0IE &=~(UCRXIE + UCTXIE);//禁用 I2C 中断

      //处理16位原始温度数据
        t =((uint16_t)(*(PRxData+2))<< 8)|(uint16_t)*(PRxData+3);
        //转换温度数据
       TC =((((T<<14)+(T<8)-(T<7)-(T<<3)-(T<<2)>> 16)- 0xFA0;//无小数点

      //处理16位原始湿度数据
       h =(uint16_t)(* PRxData << 8)|(uint16_t)*(PRxData+1);
       //转换温度数据
       Hc =((H<<10)-(H<4)-(H<<3)>> 16;//无小数点

       sprintf (str、"%s %lu.%2lu%s %lu、%1.1lu%s"、"温度:"、(int32_t)(tC/100)、(int32_t)(tc%100)、"C Rel 湿度:"、
             (int32_t)(hc/10)、(int32_t)(hc%10)、"%\r\n");
      count = sizeof str;
      对于(i=0;i < count;i++)
         {
             while (!(UCA0IFG & UCTXIFG));//轮询串行:USCI_A0 TX 缓冲器就绪?
             UCA0TXBUF = str[i];//一次发送1个字节的数据
             }
      P4OUT &=~BIT4;//关闭绿色 LED
      }


#pragma vector=TIMER0_A0_VECTOR
 _interrupt void timerfoo (void)

   LPM3_EXIT;


#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)

   switch (__evo_in_range (UCB0IV、12))
    {
    情况 0:中断;                          //向量 0:无中断
    情况 2:中断;                          //向量 2:ALIFG
    情况 4:中断;                          //向量 4:NACKIFG
    情况 6:中断;                          //向量 6:STTIFG
    案例 8:中断;                          //向量 8:STPIF
    案例10:                //向量 10:RXIFG
       RXByteCtr --;                           //递减 RX 字节计数器
       IF (RXByteCtr)
       {
         *(PRxData + RXByteCtr)= UCB0RXBUF;//将 RX 数据移动到地址 PRxData
         如果(RXByteCtr = 1)                //只剩下一个字节?
         UCB0CTL1 |= UCTXSTP;               //生成 I2C 停止条件
       }
       其他
       {
         * PRxData = UCB0RXBUF;               //将最终 RX 数据移动到 PRxData (0)
         LPM0_EXIT;                   
       }
       中断;
    情况12:                                 //向量12:TXIFG
         if (TXByteCtr)                         //检查 TX 字节计数器
         {
              UCB0TXBUF =* PTxData++;              //加载 TX 缓冲区
              TXByteCtr -;                         //减量 TX 字节计数器
         }
         其他
         {
              UCB0CTL1 |= UCTXSTP;                 // I2C 停止条件
              UCB0IFG &=~UCTXIFG;                 //清除 USCI_B0 TX 内部标志
              LPM0_EXIT;          
         }
         中断;
     默认值:break;
    }


 void SetPins (void)(空)
 {
    /*端口1
    P1.0红色 LED
    *
    P1DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT4 + BIT4 + BIT6 + BIT7;
    P1OUT &=~BIT0;//LED 关闭

    /*端口2
     Launchpad 上的 P2.1按钮
    *
    P2DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT4 + BIT4 + BIT6 + BIT7;

   /*端口3
   P3.0 SDA
    P3.1 SCL
   P3.3 TXD
    P3.4 RXD
    *
    P3SEL |= BIT0 + BIT1 + BIT3 + BIT4;//设置 I2C 和 UART 线路
    P3DIR |= BIT2 + BIT5 + BIT6 + BIT7;

    /*端口4
    P4.1 -- 4.6未使用
    P4.7绿色 LED
    *
    P4DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT4 + BIT4 + BIT6 + BIT7;
    P4OUT &=~BIT4;//绿色 LED 关闭

    /*端口5
    P5.0未使用
    P5.1未使用
    P5.2-P5.5根据规格表接地或断开
    *
    P5DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT4 + BIT4 + BIT6 + BIT7;

   /*端口6
    P6.0--6.7未使用
    *
    P6DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT4 + BIT4 + BIT6 + BIT7;
 }

 void SetVLO (void)
   {//默认频率~ 10kHz
   UCSCTL4 |= SELA_1; //将 ACLK 设定为 VLO
   }

 空 SetTimer (空)
    {
    TA0CCTL0 |= CCIE; //启用定时器中断
    TA0CTL = tassel_1 | MC_1; //将计时器 A 设置为 ACLK;MC_1向上计数到 TA0CCR0。
    }

 void SetUART (void)//执行简单轮询而不是中断
 {
    UCA0CTL1 |= UCSWRST;                     //**将状态机置于复位状态**
    UCA0CTL1 |= UCSSEL_2;                    // SMCLK
    UCA0BR0 = 6;                             // 1MHz 9600
    UCA0BR1 = 0;                             // 1MHz 9600
    UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16;  //模块化 UCBRSx=0、UCBRFx=0、
    UCA0CTL1 &=~UCSWRST;                    //**初始化 USCI 状态机**
 }

 void SetI2C (void)
  {
    //将 USCI B0模块配置为 I2C 的100kHz 频率
   UCB0CTL1 |= UCSWRST;
    UCB0CTL0 |= UCMST + UCSYNC + UCMODE_3;//设置为主器件、同步、I2C 的 UCMODE_3
    UCB0CTL1 = UCSSEL_2 + UCSWRST; //选择 SMCLK
    UCB0BR0 = 12;   //接下来的2行将 SMCLK 设置为100kHz
    UCB0BR1 = 0;
    UCB0I2CSA = 0x40;// HDC2010地址;ADR 接地
    UCB0CTL1 &=~UCSWRST;//清除复位
  }

 空加热器(空)
  {
   UCB0IE |= UCTXIE;//启用 I2C TX 中断
   const uint8_t HT[]={0x0E、0x08};//加热器激活命令
    UCB0CTL1 |= UCTR;
    PTxData =(uint8_t *) HT;
    TXByteCtr = 2;
    UCB0CTL1 |= UCTXSTT;
    LPM0;                  // MCU 保持在 LPM0中直到发送所有数据
    P1OUT |= BIT0;//加热器打开。 打开 Launchpad 上的红色 LED
    TA0CCR0 =加热器;//加热器接通时间。
    LPM3;      //MCU 在低功耗模式下等待

    const uint8_t HO []={0x0E、0x00};//加热器停用
    UCB0CTL1 |= UCTR;
    PTxData =(uint8_t *) HO;
    TXByteCtr = 2;
    UCB0CTL1 |= UCTXSTT;
    LPM0;
    UCB0IE &=~UCTXIE;//禁用 I2C TX 中断
    P1OUT &=~BIT0;//关闭红色 LED
  }

 空度量(空)
 {
   //分别以14位和11位分辨率启动温度潮湿测量
    const uint8_t MS[]={0x0F、0x11};
    UCB0CTL1 |= UCTR; //设置为发送器
    PTxData =(uint8_t *) ms;     // TX 数组起始地址
    TXByteCtr = 2;             //加载 TX 字节计数器
    UCB0CTL1 |= UCTXSTT;  //开始条件
    LPM0;                  //保持在 LPM0中直到所有数据被发送
 }


 空 GetData (空)
 {
   const uint8_t ReadData[]={0x00、0x01、0x02、0x03};// 4个数据字节的起始地址;寄存器地址自动递增
   UCB0CTL1 |= UCTR; //设置为发送器
   PTxData =(uint8_t *) ReadData;    
   TXByteCtr = 4;             //加载 TX 字节计数器
   UCB0CTL1 |= UCTXSTT;
   LPM0;                 
   while (UCB0CTL1 & UCTXSTP); //确保发送了 STOP 条件
   //接收4个数据字节
   UCB0CTL1 &=~UCTR;//设置为接收器
   PRxData =(uint8_t *) RxBuffer;   
   RXByteCtr = 4;
   UCB0CTL1 |= UCTXSTT;
   LPM0;
 }


此致、

Vishak

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

    您好、Vishak、

    HDC2010的 I2C 连接如下图:所示

    还有一些有关 HDC2010的编程数据可能对您有所帮助:

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

    您可以参阅我们有关 MCU I2C 的示例代码:

    http://dev.ti.com/tirex/explore/node?node=AJKALytCbSfa80dHYM7qVQ__IOGqZri__LATEST

    此致

    Johnson

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

    谢谢 Johnson。

    请告诉我上述代码是否有任何问题。

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

    嗨,Johnson,我能不能获得任何其它用于 hdc2010和 MSP430 I2C 的完整代码??

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

    您好、Vishak、

    我们没有 适用于 hdc2010 和 MSP430的完整代码,只提供一些示例 I2C 示例代码。

    我‘m hdc2010芯片,因此无法测试您的代码。

    您可以上传您的硬件连接图、以便我们可以查看硬件连接是否正常。

    对于您的代码、您可以使用 CCS 的单步调试函数来查找问题。

    此致

    Johnson