一、软件I2C和硬件I2C
• I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。
1.软件IIC
• 一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序。
2.硬件IIC
• 对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。硬件(固件)I2C是直接调用内部寄存器进行配置;而软件I2C是没有寄存器这个概念的。
3.区别
• 硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
• 可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
• 根据代码量判断,模拟的代码量肯定比固件的要大。
- 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
- 硬件IIC速度比模拟快,并且可以用DMA
- 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
• 软件i2c是程序员使用程序控制SCL,SDA线输出高低电平,模拟i2c协议的时序。一般较硬件i2c稳定,但是程序较为繁琐,但不难。
• 硬件i2c程序员只要调用i2c的控制函数即可,不用直接的去控制SCL,SDA高低电平的输出。但是有些单片机的硬件i2c不太稳定,调试问题较多。
二、基于I2C的AHT20温湿数据采集
1.下载所需文件
• 之前实验百度网盘的裸机工程。(我选用的是一个流水灯裸机文件)
• 在官网下载:AHT20的DEMO文件
• 也可使用如下:STM32的AHT20温湿度测量
• 可在上述网站下载文件目录下的HARDWAWRE和SYSTEM找到所需文件:
• 其中TEMHUM为AHT20文件。
注:以上文件在其他地方也可找到下载。
1.添加.c文件
• 打开一个裸机工程。
• 将上述添加的文件的.c文件添加在USER文件目录下:
myiic是IIC协议代码,temhum是AHT20读取代码
2.添加文件路径
• 打开目标选项选择C/C++配置路径,添加以下文件:
3.主函数代码
• 将主函数代码修改为如下:
#include "delay.h"
#include "temhum.h"
#include "sys.h"
#include "usart.h"
int main(void)
{
u32 CT_data[2]={0};
volatile float hum=0,tem=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
temphum_init(); //ATH20初始化
while(1)
{
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据
hum = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
tem = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
printf("湿度:%.1f%%\r\n",(hum/10));
printf("温度:%.1f度\r\n",(tem/10));
printf("\r\n");
delay_ms(1000);
delay_ms(1000);
}
}
该主函数在上述下载文件中有,修改即可。
4.管脚连线
• 将AHT20芯片连接在STM32指南者开发板上, SCL端接B6,SDA端接B7,VCC端接3V3,GND接地:
5.运行结果
• 之后在首先确保在目标选项下output栏create hex打勾。
• 点击编译->构建。
打开前面实验所用到过的烧录程序选择创建好的hex文件进行烧录:
• 打开串口助手,点击打开串口:
• 向芯片哈气升温:
• 实验完成。
• 参考资料:
《零死角玩转STM32—F103指南者》
硬件I2C与模拟I2C
硬件IIC和软件IIC区别