📄 tsensor.c
字号:
/*******************************************************************************
* 文件名 : tsensor.c
* 功能描述 : 温度传感器STLM75读/写程序.
* 该程序包括I2C总线协议及读写STLM75所有的功能函数及摄氏度华氏度温度显示
*******************************************************************************/
/* 头文件 ------------------------------------------------------------------*/
#include "tsensor.h"
#include "stm32f10x_i2c.h"
#include "stm32f10x_map.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stdio.h"
#define LM75_Addr 0x90 /* 定义LM75地址 */
#define LM75_SD_Set 0x01 /* 设置STLM75的配置寄存器SD位 */
#define LM75_SD_Reset 0xFE /* STLM75的配置寄存器SD位复位 */
/* 变量定义 ---------------------------------------------------------*/
static u8 TempCelsius_Display[] = " +abc.def C "; /*用于温度值显示*/
static u8 TempFahrenheit_Display[] = " +abc.def F ";
u32 Temp_Decimal = 0, TempCelsius_Value = 0, Temp_Value_Fahrenheit = 0;
/*******************************************************************************
* 函数名 : I2C_LM75_Init
* 描述 : I2C1初始化.
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void I2C_LM75_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/* GPIOB 外设时钟使能 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
/* I2C1 外设时钟使能 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* 配置SDA,SCL引脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;/*PB7-SDA,PB6-SCL*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*50MHz*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;/*开漏复用功能*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 配置PB5输入上拉, 用于连接STLM75的OS/INT引脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_DeInit(I2C1); /*先禁止*/
/* I2C1 初始化 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;/*设置I2C模式1*/
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;/*I2C快速模式Tlow / Thigh = 2*/
I2C_InitStructure.I2C_OwnAddress1 = 0x00;/*自身地址*/
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;/*使能应答(ACK)*/
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;/*应答7位地址*/
I2C_InitStructure.I2C_ClockSpeed = 200000;/*200K速度*/
I2C_Init(I2C1, &I2C_InitStructure);
/* I2C1 使能 */
I2C_Cmd(I2C1, ENABLE);
}
/*******************************************************************************
* 函数名 : I2C_LM75_Status
* 描述 : 确认STLM75状态
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
ErrorStatus I2C_LM75_Status(void)
{
u32 I2C_TimeOut = 0x3FFFF;
/* 清除I2C1 AF位 */
I2C_ClearFlag(I2C1, I2C_FLAG_AF);
/* 使能ACK配置 */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* 发送I2C1起始条件状态位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 测试I2C1 EV5事件并清除*/
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5事件 */
{
}
/* 发送STLM75从器件地址字节(写)*/
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
while((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && I2C_TimeOut)/* EV6 */
{
I2C_TimeOut--;
}
if(I2C_GetFlagStatus(I2C1, I2C_FLAG_AF) != 0x0)
{
return ERROR;
}
else
{
return SUCCESS;
}
}
/*******************************************************************************
* 函数名 : I2C_LM75_Reg_Read
* 描述 : 读STLM75寄存器
* 输入 : 读从器件如下寄存器
- LM75_TEMP_Reg: 温度寄存器
- LM75_TOS_Reg: 超阀值关断寄存器
- LM75_THYS_Reg: 滞后寄存器
* 输出 : 无
* 返回 : 无
*******************************************************************************/
u16 I2C_LM75_Reg_Read(u8 RegName)
{
u32 RegValue=0;
/* 使能I2C1应答 */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* 发送I2C1起始条件(写) */
I2C_GenerateSTART(I2C1, ENABLE);
/* 测试I2C1 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/*发送STLM75地址(写) */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* 测试I2C1 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* 发送指针寄存器数据(写) */
I2C_SendData(I2C1, RegName);
/* 检测I2C1 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/*----- 接收部分 -----*/
/* 发送重新开始起始位条件 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 检测 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 发送STLM75从地址(读) */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Receiver);
/* 检测 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) /* EV6 */
{
}
/* 检测 EV7事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
{
}
/* 存储I2C1 接收的数据 */
RegValue = (u16)(I2C_ReceiveData(I2C1) << 8);
/* 最后一位接收完成后要关闭应答 */
I2C_AcknowledgeConfig(I2C1, DISABLE);
/* 发送I2C1停止条件位 */
I2C_GenerateSTOP(I2C1, ENABLE);
/* 检测 EV7事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
{
}
/* 存储 I2C1 接收的数据 */
RegValue |= I2C_ReceiveData(I2C1);
/* 返回寄存器值 */
return (RegValue >> 7);
}
/*******************************************************************************
* 函数名 : I2C_LM75_Reg_Write
* 描述 : 读STLM75寄存器
* 输入 : 写从器件如下寄存器
- LM75_TEMP_Reg: 温度寄存器
- LM75_TOS_Reg: 超阀值关断寄存器
- LM75_THYS_Reg: 滞后寄存器
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void I2C_LM75_Reg_Write(u8 RegName, u16 RegValue)
{
/* 左移寄存器值 */
RegValue = RegValue << 7;
/*----- 传送过程 -----*/
/* 发送I2C1起始状态位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 检测 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 发送STLM75从地址(写)*/
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* 检测 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* 发送指针寄存器数值 */
I2C_SendData(I2C1, RegName);
/* 检测 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* 发送I2C1 数据 */
I2C_SendData(I2C1, (u8)(RegValue >> 8));
/* 检测 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* 发送I2C1 数据 */
I2C_SendData(I2C1, (u8)RegValue);
/* 检测 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* 发送I2C1 停止状态位 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
/*******************************************************************************
* 函数名 : I2C_LM75_Temp_Read
* 描述 : 读STLM75寄存器
* 输入 : 读取STLM75温度寄存器值2字节
* 输出 : 无
* 返回 : 无
*******************************************************************************/
u16 I2C_LM75_Temp_Read(void)
{
u32 RegValue = 0;
/* 使能应答 */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/*----- 传送过程 -----*/
/* 发送I2C1 起始状态位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 检测 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 发送STLM75从地址(写) */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* 检测 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* 发送温度寄存器数据 */
I2C_SendData(I2C1, LM75_TEMP_Reg);
/* 检测 EV8事件并清除*/
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/*----- 接收过程 -----*/
/* 发送启动起始状态位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 检测 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 发送STLM75从地址(读) */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Receiver);
/* 检测 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) /* EV6 */
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -