目录
- 一、学习任务
- 二、I2C总线协议
-
- 2.1 定义
- 2.2 区别
- 三、AHT20数据采集
- 四、硬件连接及其效果显示
- 五、总结
- 六、参考链接
一、学习任务
传感器数据,通过串口输出采集的温湿度值。具体任务: 1)解释什么是软件I2C”和“硬件I2C”? (阅读野火配套教材第23章I2C–读写EEPROM原则章节) 2)阅读AHT编程实现20数据手册一次温湿度数据,并通过串口发送到上位机(win10)。
二、I2C总线协议
2.1 定义
软件I2C一般是用GPIO管脚,用软件控制管脚状态以软件I2C通信波形。 硬件I2C对应芯片I2C外设,有相应的I2C驱动电路,它使用的I2C管脚也是专用的。
2.2 区别
硬件I2C软件的效率远高于软件I2C接口灵活,因为不受管脚限制。 软件I2C 是通过GPIO,软件模拟寄存器的工作模式,硬件(固件)I2C是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册。因为固件I2C端口是固定的,所以会有区别。
三、AHT20数据采集
主函数代码:
#include "delay.h" #include "usart.h" #include "bsp_i2c.h" int main(void) { delay_init(); uart_init(115200); //串口通信波特率1152 IIC_Init(); while(1) { printf("温湿度显示"); read_AHT20_once(); delay_ms(1500); } }
读取模块函数:
void read_AHT20_once(void) { delay_ms(10); reset_AHT20();//重置AHT20芯片 delay_ms(10); init_AHT()AHT20芯片 delay_ms(10); startMeasure_AHT()AHT20芯片 delay_ms(80); read_AHT20();//读取AHT收集到的数据 delay_ms(5); }
AHT读取和输出温湿度函数:
void read_AHT20(void) { uint8_t i; for(i=0; i<6; i ) { readByte[i]=0; } //------------- I2C_Start();//I2C启动 I2C_WriteByte(0x71);//I2C写数据 ack_status = Receive_ACK();///收到的响应信息 readByte[0]= I2C_ReadByte();//I2C读取数据 Send_ACK() readByte[1]= I2C_ReadByte(); Send_ACK(); readByte[2]= I2C_ReadByte(); Send_ACK(); readByte[3]= I2C_ReadByte(); Send_ACK(); readByte[4]= I2C_ReadByte(); Send_ACK(); readByte[5]= I2C_ReadByte(); SendNot_Ack(); //Send_ACK(); I2C_Stop();//I2C停止函数 ///判断读取的第一个字节是否为0x08,0x如果读取过程取过程中规定的,如果读取过程没有问题,相应地处理所读数据 if( (readByte[0] & 0x68) == 0x08 ) { H1 = readByte[1]; H1 = (H1<<8) | readByte[2]; H1 = (H1<<8) | readByte[3]; H1 = H1>>4; H1 = (H1*1000)/1024/1024; T1 = readByte[3]; T1 = T1 & 0x0000000F; T1 = (T1<<8) | readByte[4]; T1 = (T1<<8) | readByte[5]; T1 = (T1*2000)/1024/1024 - 500; AHT20_OutData[0] = (H1>>8) & 0x000000FF; AHT20_OutData[1] = H1 & 0x000000FF; AHT20_OutData[2] = (T1>>8) & 0x000000FF; AHT20_OutData[3] = T1 & 0x000000FF; } else { AHT20_OutData[0] = 0xFF; AHT20_OutData[1] = 0xFF; AHT20_OutData[2] = 0xFF; AHT20_OutData[3] = 0xFF; printf("读取失败"); } printf("\r\n"); //根据温度和湿度的计算公式,计算后输出结果,通过串口发送到上位机显示 printf("温度:%d%d.%d",T1/100,(T1/10),T1); printf("湿度:%d%d.%d",H1/100,(H1/10),H1); printf("\r\n"); }
四、硬件连接及其效果显示
USB的RXT连接PA9,TXT连接PA10,SCL连接PB6,SDA连接PB7。
五、总结
初步了解了I2C协议的基本用法通过完成实验加深了印象,完成实验也可以增强自信,让自己进一步研究。
六、参考链接
stm32通过I2C接口实现温湿度(AHT20)的采集 模拟IIC与硬件IIC的区别!