⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsensor.c

📁 ARM_CORTEX-M3应用实例开发详解光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
* 文件名          : 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 + -