资源简介
这个是HDC1080温湿度传感器的驱动代码,里面包含了一个.c文件和一个.h文件,此驱动方便移植只需少量修改就能应用到自己的工程里面。此驱动已经经过测试。https://blog.csdn.net/qq_27718231/article/details/107546132这个博客链接里面有我的测试结果。
代码片段和文件信息
#include “hdc1080.h“
#include “main.h“
#define HDC1080_MDELAY(n) LL_mDelay(n) /* 用户提供一个毫秒延时 */
#define HDC1080_UDELAY(n) Hdc1080_Udelay(n) /* 微秒延时默认使用内部不精确延时,可使用外部精确延时 */
#define SDA_IN() LL_GPIO_SetPinMode(GPIOE LL_GPIO_PIN_14 LL_GPIO_MODE_INPUT)
#define SDA_OUT() LL_GPIO_SetPinMode(GPIOE LL_GPIO_PIN_14 LL_GPIO_MODE_OUTPUT)
#define READ_SDA() LL_GPIO_IsInputPinSet(GPIOE LL_GPIO_PIN_14)
#define SDA_H LL_GPIO_SetOutputPin(GPIOE LL_GPIO_PIN_14)
#define SDA_L LL_GPIO_ResetOutputPin(GPIOE LL_GPIO_PIN_14)
#define SCL_H LL_GPIO_SetOutputPin(GPIOE LL_GPIO_PIN_15)
#define SCL_L LL_GPIO_ResetOutputPin(GPIOE LL_GPIO_PIN_15)
/*
* 函数名称: Hdc1080_LL_Init
* 函数说明: 对HDC1080硬件初始化(I2C初始化)
* 输入参数: 无
* 返回参数: 无
*/
static void Hdc1080_LL_Init(void)
{
LL_GPIO_InitTypeDef GPIO_InitStruct={0};
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE);
/* PE14->SDA PE15->SCL */
LL_GPIO_SetOutputPin(GPIOE LL_GPIO_PIN_14);
LL_GPIO_SetOutputPin(GPIOE LL_GPIO_PIN_15);
GPIO_InitStruct.Pin=LL_GPIO_PIN_14|LL_GPIO_PIN_15;
GPIO_InitStruct.Mode=LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Pull=LL_GPIO_PULL_NO;
GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType=LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOE &GPIO_InitStruct);
}
/*
* 函数名称: Hdc1080_Udelay
* 函数说明: 内部微秒延时(不精确)
* 输入参数: 无
* 返回参数: 无
*/
static void Hdc1080_Udelay(uint8_t us)
{
while(us--)
{
uint32_t n=16;
while(n--);
}
}
/*
* 函数名: I2C_Start
* 描述 : I2C起始信号
* 输入 : 无
* 返回 : 无
*/
static void I2C_Start(void)
{
SDA_H;
SCL_H;
HDC1080_UDELAY(10);
SDA_L;
HDC1080_UDELAY(10);
SCL_L;
HDC1080_UDELAY(10);
}
/*
* 函数名: I2C_Stop
* 描述 : I2C停止信号
* 输入 : 无
* 返回 : 无
*/
static void I2C_Stop(void)
{
SDA_OUT();
SDA_L;
SCL_H;
HDC1080_UDELAY(10);
SDA_H;
HDC1080_UDELAY(10);
SCL_L;
}
/*
* 函数名: I2C_Ack
* 描述 : 应答信号(主机发送)
* 输入 : 无
* 返回 : 无
*/
static void I2C_Ack(void)
{
SDA_L;
HDC1080_UDELAY(10);
SCL_H;
HDC1080_UDELAY(10);
SCL_L;
HDC1080_UDELAY(10);
}
/*
* 函数名: I2C_NoAck
* 描述 : 非应答信号(主机发送)
* 输入 : 无
* 返回 : 无
*/
static void I2C_NoAck(void)
{
SDA_H;
HDC1080_UDELAY(10);
SCL_H;
HDC1080_UDELAY(10);
SCL_L;
HDC1080_UDELAY(10);
}
/*
* 函数名: Wait_Ack
* 描述 : 规定时间内检测从机发来的Ack
* 输入 : 无
* 返回 : 0-收到,1-未收到
*/
static uint8_t Wait_Ack(void)
{
uint8_t tiemout=0;
SDA_H;
HDC1080_UDELAY(10);
SDA_IN();
SCL_H;
HDC1080_UDELAY(10);
while(READ_SDA())
{
tiemout++;
if(tiemout>250)
{
I2C_Stop();
return 1;
}
}
SCL_L;
SDA_OUT();
return 0;
}
/*
* 函数名: Send_Byte
* 描述 : 发送一字节数据到SDA信号线上
* 输入 : 无
* 返回 : 0-发送成功,1-发送失败
*/
static uint8_t Send_Byte(uint8_t data)
{
uint8_t i;
for(i=0; i<8; i++)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7950 2020-07-23 22:22 hdc1080.c
文件 187 2020-07-23 19:27 hdc1080.h
----------- --------- ---------- ----- ----
8137 2
评论
共有 条评论