您好,欢迎来到汇智旅游网。
搜索
您的当前位置:首页STM32学习100步之第四十九-五十一步——I²C总线协议及其应用

STM32学习100步之第四十九-五十一步——I²C总线协议及其应用

来源:汇智旅游网

I²C通信协议

I²C底层协议较为复杂,其特点是只有一个主机(单片机),它和其他的从设备可以相互通信,而从设备之间无法直接相互通信。作为初学者只需要掌握初始化和调用函数即可,该总线的作用是单片机和各个芯片之间进行通信,它们之间的通信有一种协议。
连接原理图如下:

void I2C_ Configuration(); //I2C初始化
void I2C_ SAND_ BUFFER(); //I2C发送数据串
void I2C_ SAND_ BYTE(); //I2C发送一个字节.
void I2C_ READ_ BUFFER(); //I2C读取数据串
u8  I2C_ READ_ BYTE(); //I2C读取一个字节
其中I2C_ Configuration()初始化函数中包含I2C接口初始化函数,不需要重新初始化接口。
I2C_READ_BYTE(u8 SlaveAddr,u8 readAddr)
I2C_SAND_BYTE(u8 SlaveAddr,u8 writeAddr,u8 pBuffer)
I2C_READ_BUFFER(u8 SlaveAddr,u8 readAddr,u8* pBuffer,u16 NumByteToRead)
I2C_SAND_BUFFER(u8 SlaveAddr,u8 WriteAddr,u8* pBuffer,u16 NumByteToWrite)

该函数和上面函数基本形参意义相同,不同的是,该函数为发送函数。

温度传感器IM75A

对于初学者应用,只需要掌握两个函数即可,即函数如下:

void LM75A_GetTemp(u8 *Tempbuffer);//读温度
void LM75A_POWERDOWN(void); //掉电模式

相应的寄存器功能如下:

其中,读取温度函数和设置掉电模式方式分别如下:

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+; }
	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;   
}

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

这里算法采用了技巧是利用&按位与操作,如果寄存器该位的值为1,则加上对应的权值,本质上是二进制数转十进制数的原理。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务