工具/软件:Code Composer Studio
你好!
我正在尝试从温度/湿度传感器 HTU21D-F 读取温度、但我没有收到任何数据。 我一直在想解决这个问题的重点。 任何提示/帮助都是极好的。 当我运行代码时、无论温度传感器是否已连接、我都会得到-52.3299作为"tempf"、1.0842E-19作为"temp"。
谢谢、
卢卡斯
这是我的代码
/******** SHT21的温度代码 /
/*库*/
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "inc/hw_i2c.h"
#include "driverlib/i2c.h"
#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"
#include "driverlib/timer.h"
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/debug.h"
#include "driverlib/pwm.h"
#include "driverlib/pin_map.h"
#include "inc/hw_gpio.h"
#include "driverlib/rom.h"
/********* 温度传感器驱动程序库********* /
#include "sensorlib/hw_shtml21.h"
#include "sensorlib/i2cm_drv.h"
#include "sensorlib/sht21.h"
#include "inc/hw_ints.h"
#include "driverlib/debug.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
/ /
#define SHT21_I2C_ADDRESS 0x40 //温度传感器地址
#define SHT21_TEMP_NOBLOCK 0xF3 //发送值以从传感器读取温度
#define ST_CTRL_R (*(volatile unsigned long *) 0xE000E010)
#define ST_RELOAD_R (*(volatile unsigned long *) 0xE000E014)
#define ST_CURRENT_R (*(volatile unsigned long *) 0xE000E018)
uint32_t ui32SysClkFreq;//时钟的全局变量
静态 uint32_t g_I2C0Data[3];//从 I2C3主器件收集的数据字节
void Configurei2C0();//用于 I2C 设置的函数
void LED();
void Slave_Setup();
void SysTick Init (void);
浮点温度;
浮点温度;
void main (void){
SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);
ui32SysClkFreq = SysCtlClockGet ();
LED);
SysTK_Init();
配置 i2C0();
/******* I2C 从机设置********* /
while (1){
SysCtlDelay (20000);
I2CMasterInitExpClk (I2C0_BASE、ui32SysClkFreq、false);// False 将控制器设置为100kHz 通信
//Setup_I2C();
I2CMasterSlaveAddrSet (I2C0_BASE、SHT21_I2C_ADDRESS、false);//设置从器件和发送温度地址
SysCtlDelay (20000);
I2CMasterDataPut (I2C0_BASE、0xFE);//软复位
SysCtlDelay (20000);
I2CMasterDataPut (I2C0_BASE、SHT21_TEMP_NOBLOCK);//发送温度读取信息
SysCtlDelay (20000);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);//设置 I2C 主设备进行单次发送
SysCtlDelay (20000);
//设置要读取的地址
I2CMasterSlaveAddrSet (I2C0_BASE、SHT21_I2C_ADDRESS、TRUE);
SysCtlDelay (50000);
//主控方读取数据字节1并存储
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (20000);
G_I2C0Data[0]= I2CMasterDataGet (I2C0_BASE);
SysCtlDelay (50000);
//主控方读取数据字节2并存储
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (50000);
G_I2C0Data[1]= I2CMasterDataGet (I2C0_BASE);
SysCtlDelay (50000);
//主控方读取数据字节3 (校验和)并存储
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (50000);
//转换为温度
uint32_t tempConvert =((uint32_t) g_I2C0Data[0]<< 8)|(uint32_t)(g_I2C0Data[1]);
SysCtlDelay (50000);
浮点温度=(浮点)(tempConvert & 0xFFFC);//--- 当数字停止"temp"时、
SysCtlDelay (50000);
temp =-46.85f + 175.72f *(temp / 65536.0f);
tempf = temp*(9.0f/5.0f)+32;
SysCtlDelay (50000);
如果(温度< 50.00f){
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x40);
}
否则、如果(temp > 50.0000){
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x00);
}
}
}
//功能定义
void Configurei2C0 (void){
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);//启用 I2C 硬件
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//使能引脚硬件
GPIOPinConfigure (GPIO_PB3_I2C0SDA);//为 I2C 数据线路配置 GPIO 引脚
GPIOPinConfigure (GPIO_PB2_I2C0SCL);//为 I2C 时钟线配置 GPIO 引脚
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3);//设置引脚类型
GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_2、GPIO_Strength _2mA、
GPIO_PIN_TYPE_STD);// SDA 必须为 STD
GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_Strength _2mA、
GPIO_PIN_TYPE_STD);
I2CMasterInitExpClk (I2C0_BASE、ui32SysClkFreq、false);// False 将控制器设置为100kHz 通信
}
void LED (void){
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_6);
}
void SysTick Init (void)//初始化在总线时钟下运行的 SysTick。
{
ST_CTRL_R = 0;//在设置期间禁用 SysTick
ST_RELOAD_R = 0x00FFFF;//设置最大重载值
ST_CURRENT_R = 0;//对当前的任何写入都会将其清除
//启用 SysTick (向位0写入1)、关闭中断(0到位1)、使用内核时钟(1到位2)
ST_CTRL_R = 0x05;
}