?? tsensor.c
字號:
/*******************************************************************************
* 文件名 : tsensor.c
* 功能描述 : 溫度傳感器STLM75讀/寫程序.
* 該程序包括I2C總線協(xié)議及讀寫STLM75所有的功能函數(shù)及攝氏度華氏度溫度顯示
*******************************************************************************/
/* 頭文件 ------------------------------------------------------------------*/
#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 /* 設(shè)置STLM75的配置寄存器SD位 */
#define LM75_SD_Reset 0xFE /* STLM75的配置寄存器SD位復(fù)位 */
/* 變量定義 ---------------------------------------------------------*/
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;
/*******************************************************************************
* 函數(shù)名 : I2C_LM75_Init
* 描述 : I2C1初始化.
* 輸入 : 無
* 輸出 : 無
* 返回 : 無
*******************************************************************************/
void I2C_LM75_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/* GPIOB 外設(shè)時鐘使能 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
/* I2C1 外設(shè)時鐘使能 */
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;/*開漏復(fù)用功能*/
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;/*設(shè)置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;/*使能應(yīng)答(ACK)*/
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;/*應(yīng)答7位地址*/
I2C_InitStructure.I2C_ClockSpeed = 200000;/*200K速度*/
I2C_Init(I2C1, &I2C_InitStructure);
/* I2C1 使能 */
I2C_Cmd(I2C1, ENABLE);
}
/*******************************************************************************
* 函數(shù)名 : I2C_LM75_Status
* 描述 : 確認(rèn)STLM75狀態(tài)
* 輸入 : 無
* 輸出 : 無
* 返回 : 無
*******************************************************************************/
ErrorStatus I2C_LM75_Status(void)
{
u32 I2C_TimeOut = 0x3FFFF;
/* 清除I2C1 AF位 */
I2C_ClearFlag(I2C1, I2C_FLAG_AF);
/* 使能ACK配置 */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* 發(fā)送I2C1起始條件狀態(tài)位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 測試I2C1 EV5事件并清除*/
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5事件 */
{
}
/* 發(fā)送STLM75從器件地址字節(jié)(寫)*/
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;
}
}
/*******************************************************************************
* 函數(shù)名 : I2C_LM75_Reg_Read
* 描述 : 讀STLM75寄存器
* 輸入 : 讀從器件如下寄存器
- LM75_TEMP_Reg: 溫度寄存器
- LM75_TOS_Reg: 超閥值關(guān)斷寄存器
- LM75_THYS_Reg: 滯后寄存器
* 輸出 : 無
* 返回 : 無
*******************************************************************************/
u16 I2C_LM75_Reg_Read(u8 RegName)
{
u32 RegValue=0;
/* 使能I2C1應(yīng)答 */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* 發(fā)送I2C1起始條件(寫) */
I2C_GenerateSTART(I2C1, ENABLE);
/* 測試I2C1 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/*發(fā)送STLM75地址(寫) */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* 測試I2C1 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* 發(fā)送指針寄存器數(shù)據(jù)(寫) */
I2C_SendData(I2C1, RegName);
/* 檢測I2C1 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/*----- 接收部分 -----*/
/* 發(fā)送重新開始起始位條件 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 檢測 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 發(fā)送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 接收的數(shù)據(jù) */
RegValue = (u16)(I2C_ReceiveData(I2C1) << 8);
/* 最后一位接收完成后要關(guān)閉應(yīng)答 */
I2C_AcknowledgeConfig(I2C1, DISABLE);
/* 發(fā)送I2C1停止條件位 */
I2C_GenerateSTOP(I2C1, ENABLE);
/* 檢測 EV7事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
{
}
/* 存儲 I2C1 接收的數(shù)據(jù) */
RegValue |= I2C_ReceiveData(I2C1);
/* 返回寄存器值 */
return (RegValue >> 7);
}
/*******************************************************************************
* 函數(shù)名 : I2C_LM75_Reg_Write
* 描述 : 讀STLM75寄存器
* 輸入 : 寫從器件如下寄存器
- LM75_TEMP_Reg: 溫度寄存器
- LM75_TOS_Reg: 超閥值關(guān)斷寄存器
- LM75_THYS_Reg: 滯后寄存器
* 輸出 : 無
* 返回 : 無
*******************************************************************************/
void I2C_LM75_Reg_Write(u8 RegName, u16 RegValue)
{
/* 左移寄存器值 */
RegValue = RegValue << 7;
/*----- 傳送過程 -----*/
/* 發(fā)送I2C1起始狀態(tài)位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 檢測 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 發(fā)送STLM75從地址(寫)*/
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* 檢測 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* 發(fā)送指針寄存器數(shù)值 */
I2C_SendData(I2C1, RegName);
/* 檢測 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* 發(fā)送I2C1 數(shù)據(jù) */
I2C_SendData(I2C1, (u8)(RegValue >> 8));
/* 檢測 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* 發(fā)送I2C1 數(shù)據(jù) */
I2C_SendData(I2C1, (u8)RegValue);
/* 檢測 EV8事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* 發(fā)送I2C1 停止?fàn)顟B(tài)位 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
/*******************************************************************************
* 函數(shù)名 : I2C_LM75_Temp_Read
* 描述 : 讀STLM75寄存器
* 輸入 : 讀取STLM75溫度寄存器值2字節(jié)
* 輸出 : 無
* 返回 : 無
*******************************************************************************/
u16 I2C_LM75_Temp_Read(void)
{
u32 RegValue = 0;
/* 使能應(yīng)答 */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/*----- 傳送過程 -----*/
/* 發(fā)送I2C1 起始狀態(tài)位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 檢測 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 發(fā)送STLM75從地址(寫) */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* 檢測 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* 發(fā)送溫度寄存器數(shù)據(jù) */
I2C_SendData(I2C1, LM75_TEMP_Reg);
/* 檢測 EV8事件并清除*/
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/*----- 接收過程 -----*/
/* 發(fā)送啟動起始狀態(tài)位 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 檢測 EV5事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* 發(fā)送STLM75從地址(讀) */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Receiver);
/* 檢測 EV6事件并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) /* EV6 */
{
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -