📄 tsensor.c
字号:
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name : tsensor.c
* Author : MCD Application Team
* Version : V1.0
* Date : 10/08/2007
* Description : TSensor driver source file.
* Pin assignment:
* ------------------------------------------
* | STM32F10x | STLM75 Pin |
* ------------------------------------------
* | PB7/ SDA | SDA 1 |
* | PB6/ SCL | SCL 2 |
* | PB5/ | OS/INT 3 |
* | . | GND 4 (0V) |
* | . | GND 5 (0V) |
* | . | GND 6 (0V) |
* | . | GND 7 (0V) |
* | . | VDD 8 (5V) |
* ------------------------------------------
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "tsensor.h"
#include "stm32f10x_i2c.h"
#include "stm32f10x_map.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stdio.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define LM75_Addr 0x90 /* LM75 address */
#define LM75_SD_Set 0x01 /* Set SD bit in the configuration register */
#define LM75_SD_Reset 0xFE /* Reset SD bit in the configuration register */
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
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;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : I2C_LM75_Init
* Description : Initializes the I2C1.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C_LM75_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/* GPIOB Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
/* I2C1 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure PB.5 as Input pull-up, used as TemperatureSensor_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 Init */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 200000;
I2C_Init(I2C1, &I2C_InitStructure);
/* I2C1 Init */
I2C_Cmd(I2C1, ENABLE);
}
/*******************************************************************************
* Function Name : I2C_LM75_Status
* Description : Checks the LM75 status.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
ErrorStatus I2C_LM75_Status(void)
{
u32 I2C_TimeOut = 0x3FFFF;
/* Clear the I2C1 AF flag */
I2C_ClearFlag(I2C1, I2C_FLAG_AF);
/* Enable I2C1 acknowledgement if it is already disabled by other function */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/*----- Transmission Phase -----*/
/* Send I2C1 START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on I2C1 EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* Send STLM75 slave address for write */
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;
}
}
/*******************************************************************************
* Function Name : I2C_LM75_Reg_Read
* Description : Read the specified register from the LM75.
* Input : RegValue: this member specifies the register to read:
* - LM75_TEMP_Reg: temperature register
* - LM75_TOS_Reg: Over-limit temperature register
* - LM75_THYS_Reg: Hysteresis temperature register
* Output : None
* Return : None
*******************************************************************************/
u16 I2C_LM75_Reg_Read(u8 RegName)
{
u32 RegValue=0;
/* Enable I2C1 acknowledgement if it is already disabled by other function */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/*----- Transmission Phase -----*/
/* Send I2C1 START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on I2C1 EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* Send STLM75 slave address for write */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* Test on I2C1 EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* Send the specified register data pointer */
I2C_SendData(I2C1, RegName);
/* Test on I2C1 EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/*----- Reception Phase -----*/
/* Send Re-STRAT condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* Send STLM75 slave address for read */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Receiver);
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) /* EV6 */
{
}
/* Test on EV7 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
{
}
/* Store I2C1 received data */
RegValue = (u16)(I2C_ReceiveData(I2C1) << 8);
/* Disable I2C1 acknowledgement */
I2C_AcknowledgeConfig(I2C1, DISABLE);
/* Send I2C1 STOP Condition */
I2C_GenerateSTOP(I2C1, ENABLE);
/* Test on EV7 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
{
}
/* Store I2C1 received data */
RegValue |= I2C_ReceiveData(I2C1);
/* Return register value */
return (RegValue >> 7);
}
/*******************************************************************************
* Function Name : I2C_LM75_Reg_Write
* Description : Write to the specified register of the LM75.
* Input : RegValue: this member specifies the register to read:
* - LM75_TEMP_Reg: temperature register
* - LM75_TOS_Reg: Over-limit temperature register
* - LM75_THYS_Reg: Hysteresis temperature register
* Output : None
* Return : None
*******************************************************************************/
void I2C_LM75_Reg_Write(u8 RegName, u16 RegValue)
{
/* Shift left register value */
RegValue = RegValue << 7;
/*----- Transmission Phase -----*/
/* Send I2C1 START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on I2C1 EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* Send STLM75 slave address for write */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* Test on I2C1 EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* Send the specified register data pointer */
I2C_SendData(I2C1, RegName);
/* Test on I2C1 EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* Send I2C1 data */
I2C_SendData(I2C1, (u8)(RegValue >> 8));
/* Test on I2C1 EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* Send I2C1 data */
I2C_SendData(I2C1, (u8)RegValue);
/* Test on I2C1 EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/* Send I2C1 STOP Condition */
I2C_GenerateSTOP(I2C1, ENABLE);
}
/*******************************************************************************
* Function Name : I2C_LM75_Temp_Read
* Description : Read Temperature register of LM75: double temperature value.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
u16 I2C_LM75_Temp_Read(void)
{
u32 RegValue = 0;
/* Enable I2C1 acknowledgement if it is already disabled by other function */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/*----- Transmission Phase -----*/
/* Send I2C1 START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on I2C1 EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) /* EV5 */
{
}
/* Send STLM75 slave address for write */
I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
/* Test on I2C1 EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
{
}
/* Send the temperature register data pointer */
I2C_SendData(I2C1, LM75_TEMP_Reg);
/* Test on I2C1 EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
{
}
/*----- Reception Phase -----*/
/* Send Re-STRAT condition */
I2C_GenerateSTART(I2C1, ENABLE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -