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/TM4C1230H6PM:从温度/湿度传感器 HTU21D (F)读取数据

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/581992/ccs-tm4c1230h6pm-reading-data-from-temp-humidity-sensor-htu21d-f

器件型号:TM4C1230H6PM
主题中讨论的其他器件:TM4C123

工具/软件:Code Composer Studio

大家好!  

现在、我正在进行一个研究项目、需要创建一个 if then 语句来根据温度读数控制伺服和风扇。 我使用的是 TM4C123和外部温度传感器 HTU21DF。 我知道伺服和电机控制工作正常、但我无法从温度传感器获得正确的读数。 目前、我获得的唯一值是 tempf =-52度。 即使温度传感器未连接到电路板、我也会获得该读数。 我不确定代码的 i2c 部分编码有什么问题、也不知道下一步该怎么做。 任何帮助都是极好的。  附件是我的 CCS 代码。  

卢卡斯  


#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"
#define PWM_FREQ 为55hz

#define RED_LED GPIO_PIN_1
#define BLED_LED GPIO_PIN_2
#define GREEN_LED GPIO_PIN_3

/******** 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 "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 read_temp (unsigned char * data);//读取温度传感器
void Slave_Setup();
void SysTick Init (void);
//unsigned char temp[2];//数据存储
浮点温度;


void main (void){

/******* 120MHz 时钟设置******** /

// ui32SysClkFreq = SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);

ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL)
| SYSCTL_CFG_VCO_480)、120000000);//将 clocl 设置为120MHz


//SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);


LED);
SysTK_Init();

配置 i2C0();

/******* I2C 从机设置********* /

volatile uint32_t ui32Load;
volatile uint32_t ui32PWMClock;
volatile uint8_t ui8Adcust;
ui8Adsit= 83;

SysCtlPWMClockSet (SYSCTL_PWMDIV_64);
SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypePWM (GPIO_PORTD_BASE、GPIO_PIN_0);
GPIOPinConfigure (GPIO_PD0_M1PWM0);
GPIODirModeSet (GPIO_PORTF_BASE、GPIO_PIN_4|GPIO_PIN_0、GPIO_DIR_MODE_IN);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4|GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
ui32PWMClock = SysCtlClockGet ()/64;
ui32Load =(ui32PWMClock/PWM_FREQUENCY)- 1;
PWMGenConfigure (PWM1_base、PWM_GEN_0、PWM_GEN_MODE_DOWN);
PWMGenPeriodSet (PWM1_base、PWM_GEN_0、ui32Load);
//PWMPulseWidthSet (PWM1_base、PWM_OUT_0、ui8Adust * ui32Load / 1000);
PWMOutputState (PWM1_base、PWM_OUT_0_bit、true);
PWMGenEnable (PWM1_base、PWM_GEN_0);


GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、RED_LED|blue_LED|GREEN_LED);
GPIOPinWrite (GPIO_PORTF_BASE、RED_LED|BLUE LED|GREEN _LED、RED_LED);

while (1){

//PWMPulseWidthSet (PWM1_base、PWM_OUT_0、ui8Adust * ui32Load / 1000);


//GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x40);


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_BURST_Receive_start);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (20000);
//while (I2CMasterBusy (I2C0_BASE)){GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x01);}
G_I2C0Data[0]= I2CMasterDataGet (I2C0_BASE);
SysCtlDelay (50000);


//主控方读取数据字节2并存储
//I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_Receive_CONT);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (50000);
//while (I2CMasterBusy (I2C0_BASE)){GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_4、0x01);}
G_I2C0Data[1]= I2CMasterDataGet (I2C0_BASE);
SysCtlDelay (50000);
//GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x01);//在 LED 到达此处时打开 LED 以显示它正在读取温度
//主控方读取数据字节3 (校验和)并存储
//I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_Receive_finish);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (50000);
//GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x00);
//while (I2CMasterBusy (I2C0_BASE)){GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_0、0x01);}
G_I2C0Data[2]= I2CMasterDataGet (I2C0_BASE);
SysCtlDelay (50000);
//GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x01);//在 LED 到达此处时打开 LED 以显示它正在读取温度

//转换为温度
uint32_t tempConvert =((uint32_t) g_I2C0Data[0]<< 8)|(uint32_t)(g_I2C0Data[1]);
SysCtlDelay (50000);
//GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x00);
浮点温度=(浮点)(tempConvert & 0xFFFC);//--- 当数字停止"temp"时、
SysCtlDelay (50000);
//GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x01);
temp =-46.85f + 175.72f *(temp / 65536.0f);
tempf = temp*(9.0f/5.0f)+32;

SysCtlDelay (50000);
//GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x00);

//if (temp > 28.00f){
if (tempf < 50.00f){
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0x02);

GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x40);

//GPIOPinWrite (GPIO_PORTF_BASE、RED_LED|BLUE LED|GREEN _LED、RED_LED);//打开板载 LED


PWMPulseWidthSet (PWM1_base、PWM_OUT_0、(ui8Adc公正/2)* ui32Load / 1000);//将伺服设置为关闭通风口


如果(tempf > 50.0000){
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0x00);
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x00);

//PWMPulseWidthSet (PWM1_base、PWM_OUT_0、ui8Adust * ui32Load / 1000);


//功能定义

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 通信
//Setup_I2C();

void LED (void){
//SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
//GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_2);

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;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅 TM4C1230H6PM 的额定频率最高可达80MHz。 您是否尝试以120MHz 运行它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我尝试以120MHz 运行它。 之前我在 tm4c1294xl 上运行此代码。 Howevwer、为了最大限度地减小空间、我需要使用 tm4c1230H6PM。 温度传感器将在 TM4C1294XL 上工作。 很快、我将更改时钟速度、以有望解决此问题。