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)条件 |
来源:https://blog.csdn.net/Wangguang_/article/details/102775382