si7051高精度温度传感器驱动程序
本文的si7051高精度温度传感器驱动程序是基于nrf52832的蓝牙soc,读者可以根据自己的mcu类型进行移植
io驱动文件 i2c.h和i2c.c
i2c.h
#ifndef I2C_H__
#define I2C_H__
#include "nrf_delay.h"
#include "nrf_gpio.h"
#define IIC_OK 0
#define IIC_ERR 0
#define ACK 0
#define NACK 1
#define WaitAckTime 5000
//i2c端口定义
#define IIC_SDA_PIN 7
#define IIC_SCL_PIN 8
#define IIC_SDA_IN {nrf_gpio_cfg_input(IIC_SDA_PIN,NRF_GPIO_PIN_NOPULL);}
#define IIC_SDA_R nrf_gpio_pin_read(IIC_SDA_PIN)
#define IIC_SDA_H {nrf_gpio_cfg_output(IIC_SDA_PIN);nrf_gpio_pin_set(IIC_SDA_PIN);}
#define IIC_SDA_L {nrf_gpio_cfg_output(IIC_SDA_PIN);nrf_gpio_pin_clear(IIC_SDA_PIN);}
#define IIC_SCL_H {nrf_gpio_cfg_output(IIC_SCL_PIN);nrf_gpio_pin_set(IIC_SCL_PIN);}
#define IIC_SCL_L {nrf_gpio_cfg_output(IIC_SCL_PIN);nrf_gpio_pin_clear(IIC_SCL_PIN);}
typedef struct
{
unsigned short IIC_Speed;
} IIC_ControlDef;
extern IIC_ControlDef IIC_ControlStruct;
void IIC_SpeedCtl ( unsigned short Speed );
unsigned short IIC_Read_Speed ( void );
void IIC_Init ( void );
void IIC_Start ( void );
void IIC_Stop ( void );
void IIC_Ack ( void );
uint8_t IIC_WaitAck ( unsigned int TimeOut );
void IIC_NAck ( void );
uint8_t IIC_SendByte ( unsigned char Byte, uint8_t ack);
uint8_t I2C_RecvByte(void);
uint8_t IIC_RecvByte ( uint8_t Ack );
#endif
i2c.c
#include "stdint.h"
#include "i2c.h"
#include "nrf_gpio.h"
/* 变量定义 */
IIC_ControlDef IIC_ControlStruct; //IIC控制结构体
/* IIC速度控制 */
void IIC_SpeedCtl ( unsigned short Speed )
{
IIC_ControlStruct.IIC_Speed = Speed;
}
/* 读取IIC速度 */
unsigned short IIC_Read_Speed ( void )
{
return IIC_ControlStruct.IIC_Speed;
}
/* IIC的IO初始化 */
void IIC_Init ( void )
{
IIC_SpeedCtl ( 5 );
IIC_SDA_H;
IIC_SCL_H;
}
void IIC_Start ( void )
{
IIC_SDA_H
IIC_SCL_H
nrf_delay_us ( IIC_Read_Speed() );
IIC_SDA_L
nrf_delay_us ( IIC_Read_Speed() );
IIC_SCL_L
}
void IIC_Stop ( void )
{
IIC_SDA_L
IIC_SCL_L
nrf_delay_us ( IIC_Read_Speed() );
IIC_SCL_H
nrf_delay_us ( IIC_Read_Speed() );
IIC_SDA_H
}
void IIC_Ack ( void )
{
IIC_SCL_L
IIC_SDA_L
nrf_delay_us ( IIC_Read_Speed() );
IIC_SCL_H
nrf_delay_us ( IIC_Read_Speed() );
IIC_SCL_L
IIC_SDA_H
}
uint8_t IIC_WaitAck ( unsigned int TimeOut )
{
IIC_SDA_H
nrf_delay_us ( IIC_Read_Speed() );
IIC_SCL_H
nrf_delay_us ( IIC_Read_Speed() );
IIC_SDA_IN
while ( IIC_SDA_R )