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.
工具/软件: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