STM32HAL TMP75驱动

#include "i2c.h"
#include "tim.h"
#include "usart.h"
#include <string.h>
#include "temp.h"

//入口参数 器件地址 从机的寄存器的地址 要写入的数据
void TMP75_Write_Register(uint8_t Address, uint8_t Pointer_Register, uint8_t Configuration_Byte)
{
	//iic句柄, 从机写地址0x96, 要写入从机的寄存器的地址  ,  从机寄存器地址长度,发送数据的起始地址,发送数据的大小(byte),操作时间
	HAL_I2C_Mem_Write(&hi2c2, Address, Pointer_Register, 1, &Configuration_Byte, 1, 0x10);//Mem用于给eeprom之类的储存器通信,因此多了个寄存器地址
}
//入口参数 器件地址 要发送的数据 接收数据的储存区
void TMP75_Read_Register(uint8_t Address, uint8_t Pointer_Register, uint8_t* pData)
{
	//iic句柄,从机地址,指向要发送的数据缓冲区的指针,要发送的数据字节数,传输超时时间
	HAL_I2C_Master_Transmit(&hi2c2, Address, &Pointer_Register, 1, 0x10);//iic读数据时要先写入器件地址 然后再读 参考tmp的数据手册
  HAL_I2C_Master_Receive(&hi2c2, Address, pData , 2, 0x10);
}

// A2 A1 A0 分别为 011 由数据手册 从机的写器件地址是10010110(0x96) 从机的读器件地址是 10010111(0x97)
void TMP75_Init(void) 
{
	//初始化步骤 
	uint8_t Check1[2];
	uint8_t Check2[2];
	uint8_t Check3[2];
	uint8_t Check4[2];//二字节check是因为 read函数读温度和检查是通用的,读温度是2byte数据,为了函数通用,因此用2byte的check
	/*思路:如tmp数据手册所示 首先,向tmp写入写器件地址0x96,之后 写入指针寄存器地址0000 0001(0x01) 指向配置寄存器(CR)
	之后 向配置寄存器写入0110 0000(0x60) 配置tmp的工作模式 这个类似于eeprom的写入,
	需要带一个字节的寄存器指针 因此用Mem 而不是Transmit*/
	TMP75_Write_Register(0x92, 0x01, 0x60);
	TMP75_Write_Register(0x94, 0x01, 0x60);
	TMP75_Write_Register(0x96, 0x01, 0x60);
	TMP75_Write_Register(0x98, 0x01, 0x60);
	
	/* 配置好tmp后,检查tmp是否准备就绪,原理是 刚才写入CR的数据是0x60,如果配置成功的话,此时CR寄存器应该是0x60,
	因此,read一下CR寄存器,若是0x60,说明配置完成准备就绪*/
  TMP75_Read_Register(0x93, 0x01, Check1);
	TMP75_Read_Register(0x95, 0x01, Check2);
	TMP75_Read_Register(0x97, 0x01, Check3);
	TMP75_Read_Register(0x99, 0x01, Check4);//读出来的数据存入check0
	//检测初始化成功?
//  if(Check1[0] == 0x60)//就绪
//		{
//     HAL_UART_Transmit(&huart1,"TEMP1 OK\r\n",strlen("TEMP1 OK\r\n"),0xFFFF);
//		}
//		else//否则
//			{
//       HAL_UART_Transmit(&huart1,"TEMP1 ERROR\r\n",strlen("TEMP1 ERROR\r\n"),0xFFFF);
//			}
//		if(Check2[0] == 0x60)//就绪
//		{
//     HAL_UART_Transmit(&huart1,"TEMP2 OK\r\n",strlen("TEMP2 OK\r\n"),0xFFFF);
//		}
//		else//否则
//			{
//       HAL_UART_Transmit(&huart1,"TEMP2 ERROR\r\n",strlen("TEMP2 ERROR\r\n"),0xFFFF);
//			}
//		if(Check3[0] == 0x60)//就绪
//		{
//     HAL_UART_Transmit(&huart1,"TEMP3 OK\r\n",strlen("TEMP3 OK\r\n"),0xFFFF);
//		}
//		else//否则
//			{
//       HAL_UART_Transmit(&huart1,"TEMP3 ERROR\r\n",strlen("TEMP3 ERROR\r\n"),0xFFFF);
//			} 
//		if(Check4[0] == 0x60)//就绪
//		{
//     HAL_UART_Transmit(&huart1,"TEMP4 OK\r\n",strlen("TEMP4 OK\r\n"),0xFFFF);
//		}
//		else//否则
//			{
//       HAL_UART_Transmit(&huart1,"TEMP4 ERROR\r\n",strlen("TEMP4 ERROR\r\n"),0xFFFF);
//			}			
}

uint16_t TMP75_Get12bit_Temperature(uint8_t address) 
{
    uint8_t TMP75[2] = {0};
    uint16_t Temperature = 0;

    // 指针寄存器地址0000 0000 表示读2byte的温度寄存器
    TMP75_Read_Register(address, 0x00, TMP75);

    // 字节1左移四位 或上字节2右移四位
    // 12位温度数据的前11位是温度数据的绝对值 最后一位表示正负 
    Temperature = ((uint16_t)TMP75[0] << 4) | ((uint16_t)TMP75[1] >> 4);

    if (TMP75[0] > 0x7f) {
        Temperature = ~Temperature + 1; // 最后一位如果是1 表示负温度
    }

    return Temperature;
}

//float TMP75_Get_Temperature(uint8_t address)//0x93 0x95 0x97 0x99
//{
//uint8_t TMP75[2]={0};
//uint16_t Temperature = {0};
指针寄存器地址0000 0000 表示读2byte的温度寄存器
//TMP75_Read_Register(address, 0x00, TMP75);
字节1左移四位 或上字节2右移四位 (如数据手册)
12位温度数据的前11位是温度数据的绝对值 最后一位表示正负 
//Temperature =((uint16_t)TMP75[0] << 4 ) | ((uint16_t)TMP75[1] >> 4 );
// if(TMP75[0] > 0x7f)
//	 {
//		 Temperature = ~ Temperature + 1; //最后一位如果是1 表示负温度
//	 }
//	 
//	 //分辨率为 0.0625因此将温度数据乘以0.0625得到当前温度数据
//	 //数制转换没弄明白 0.0625 小数部分printf总被削。。。。乘以6.25 变成整数
//  Temperature = (float)Temperature * 6.25; 
//  
//   return Temperature;
// }

 

 

 这段代码 是四个tmp75做从机的代码 初始化也是四个tmp75一起 最后得到温度数据的函数 入口参数是tmp的地址 就是 引脚A2 A1 A0,比如说 A2 A1 A0(011)那么 写地址就是1001 0111 0x97

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值