LM75A温度传感器驱动程序

独自空忆成欢 提交于 2019-12-02 14:35:58

LM75A的接口定义图

 

接口说明

 

从地址表(多个LM75A芯片连接到I2C的逻辑地址)

LM75A 在 I2C 总线的从地址的一部分由应用到器件地址管脚 A2、A1 和 A0 的逻辑来定义

通过改变A0、A1、A2的值,可在I2C总线上最多连接8个LM75A芯片而不发生地址冲突

 

寄存器列表

除了指针寄存器外,LM75A还包括四个数据寄存器

 

温度寄存器Temp

Temp 寄存器存放着每次 A/D 转换测得的或监控到的数字结果。它是一个只读寄存器

 

 

LM75A驱动包含了两个函数

 

LM75A_POWERDOWN( )函数如下

//LM75进入掉电模式,再次调用LM75A_GetTemp();即可正常工作
//建议只在需要低功耗情况下使用
void LM75A_POWERDOWN(void){//
    I2C_SAND_BYTE(LM75A_ADD,0x01,1); //
}

 

LM75A_GetTemp( )函数如下

void LM75A_GetTemp(u8 *Tempbuffer){   
    u8 buf[2]; //温度值储存   
    u8 t=0,a=0;   
    I2C_READ_BUFFER(LM75A_ADD,0x00,buf,2); //读出温度值(器件地址,子地址,数据储存器,字节数)
	t = buf[0]; //处理温度整数部分,0~125度
	*Tempbuffer = 0; //温度值为正值
	if(t & 0x80){ //判断温度是否是负(MSB表示温度符号)
		*Tempbuffer = 1; //温度值为负值
		t = ~t; t++; //计算补码(原码取反后加1)
	}
	if(t & 0x01){ a=a+1; } //从高到低按位加入温度积加值(0~125)
	if(t & 0x02){ a=a+2; }
	if(t & 0x04){ a=a+4; }
	if(t & 0x08){ a=a+8; }
	if(t & 0x10){ a=a+16; }
	if(t & 0x20){ a=a+32; }
	if(t & 0x40){ a=a+64; }
	Tempbuffer++;
	*Tempbuffer = a;
	a = 0;
	t = buf[1]; //处理小数部分,取0.125精度的前2位(12、25、37、50、62、75、87)
	if(t & 0x20){ a=a+12; }
	if(t & 0x40){ a=a+25; }
	if(t & 0x80){ a=a+50; }
	Tempbuffer++;
	*Tempbuffer = a;   
}

 

通过程序可知,在该函数中,通过调用I2C_READ_BUFFER( )函数读出温度值,然后将温度值存放到Tempbuffer中

 

查看i2c.c文件得到I2C_READ_BUFFER( )详细函数说明如下

void I2C_READ_BUFFER(u8 SlaveAddr,u8 readAddr,u8* pBuffer,u16 NumByteToRead){ //I2C读取数据串(器件地址,寄存器,内部地址,数量)
	while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
	I2C_GenerateSTART(I2C1,ENABLE);//开启信号
	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));	//清除 EV5
	I2C_Send7bitAddress(I2C1,SlaveAddr, I2C_Direction_Transmitter); //写入器件地址
	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//清除 EV6
	I2C_Cmd(I2C1,ENABLE);
	I2C_SendData(I2C1,readAddr); //发送读的地址
	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //清除 EV8
	I2C_GenerateSTART(I2C1,ENABLE); //开启信号
	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //清除 EV5
	I2C_Send7bitAddress(I2C1,SlaveAddr,I2C_Direction_Receiver); //将器件地址传出,主机为读
	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //清除EV6
	while(NumByteToRead){
		if(NumByteToRead == 1){ //只剩下最后一个数据时进入 if 语句
			I2C_AcknowledgeConfig(I2C1,DISABLE); //最后有一个数据时关闭应答位
			I2C_GenerateSTOP(I2C1,ENABLE);	//最后一个数据时使能停止位
		}
		if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)){ //读取数据
			*pBuffer = I2C_ReceiveData(I2C1);//调用库函数将数据取出到 pBuffer
			pBuffer++; //指针移位
			NumByteToRead--; //字节数减 1 
		}
	}
	I2C_AcknowledgeConfig(I2C1,ENABLE);
}

 

此函数中出现的I2C相关固件函数详细函数说明可见固件函数库

I2C_GetFlagsStatus()

检查指定的I2C标志位设置与否

I2C_GenerateSTART()

产生发送I2C*传输的开始(start)条件

I2C_CheckEvent()

检查最近一次I2C事件是否是输入的事件

I2C_Cmd()

使能或失能I2C外设

I2C_SendData()

通过外设I2C发送一个数据

I2C_AcknowledgeConfig

使能或失能指定I2C的应答功能

I2C_GenerateSTOP

产生发送I2C*传输的结束(stop)条件

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!