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/EK-TM4C123GXL:无法从外部温度传感器读取数据

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/582697/ccs-ek-tm4c123gxl-trouble-reading-data-from-external-temp-sensor

器件型号:EK-TM4C123GXL

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



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我建议您比较 HTU21D 和 SHT21温度传感器。 它们看起来非常相似。 如果是这种情况、您可以尝试使用传感器库中的示例。 在第18.3节的 TivaWare 传感器库用户指南中有一个程序示例。

    我还建议您查看有关在主模式下使用 TM4C I2C 的应用手册。 www.ti.com/.../spma073.pdf

    您还应确保在 SCL 和 SDA 总线上具有适当的上拉电阻器。 还请使用示波器检查总线活动。