一.实验任务:
1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:
1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)
2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
二.I2C介绍
软件I2C读写芯片和硬件I2C读写芯片是两种不同的方法来实现与I2C设备进行通信。
硬件I2C读写芯片是指使用专门]的硬件电路来实现I2C通信协议。这种方法利用微控制器或其他支持l2C的芯片上的硬件模块来处理I2C通信,包括时序控制、数据传输和应答等。硬件I2C读写芯片通过硬件电路实现,具有高速、可靠性好的特点,适用于对时序要求较高的应用。
软件I2C读写芯片是指通过软件方式来模拟实现I2C通信协议。这种方法利用通用I0口(如GPI0) 通过编程的方式来模拟I2C通信,包括产生时钟信号、发送和接收数据以及处理应答等。软件I2C读写芯片通过软件模拟实现,相对于硬件I2C来说,速度较慢且可能存在一-些时序不稳定性,但它具有灵活性高、成本低的特点,适用于一-些对速度要求不高的应用场景。
区别:
1.实现方式:硬件I2C通过专门]的硬件电路实现,而软件I2C是通过编程的方式来模拟实现。
2.性能:硬件I2C具有高速和可靠性好的特点,而软件I2C的速度相对较慢且可能存在一-些时序不稳定性。3.灵活性和成本:软件I2C具有灵活性高、成本低的特点,适用于一些对速度要求不高的应用场景。
三 采集数据
1.新建工程步骤如下
设置RCC
3 设置SYS
4 设置USART1
5 GPIO口设置
6 I2C设置
在DMA setting add两个端口
7 NVIC设置
8 时钟设置
修改AHT20.H
#ifndef _AHT20_DEMO_
#define _AHT20_DEMO_
#include "main.h"
void Delay_N10us(uint32_t t);//延时函数
void SensorDelay_us(uint32_t t);//延时函数
void Delay_4us(void); //延时函数
void Delay_5us(void); //延时函数
void Delay_1ms(uint32_t t);
void AHT20_Clock_Init(void); //延时函数
void SDA_Pin_Output_High(void) ; //将PB7配置为输出 , 并设置为高电平, PB7作为I2C的SDA
void SDA_Pin_Output_Low(void); //将P7配置为输出 并设置为低电平
void SDA_Pin_IN_FLOATING(void); //SDA配置为浮空输入
void SCL_Pin_Output_High(void); //SCL输出高电平,P6作为I2C的SCL
void SCL_Pin_Output_Low(void); //SCL输出低电平
void Init_I2C_Sensor_Port(void); //初始化I2C接口,输出为高电平
void I2C_Start(void); //I2C主机发送START信号
void AHT20_WR_Byte(uint8_t Byte); //往AHT20写一个字节
uint8_t AHT20_RD_Byte(void);//从AHT20读取一个字节
uint8_t Receive_ACK(void); //看AHT20是否有回复ACK
void Send_ACK(void) ; //主机回复ACK信号
void Send_NOT_ACK(void); //主机不回复ACK
void Stop_I2C(void); //一条协议结束
uint8_t AHT20_Read_Status(void);//读取AHT20的状态寄存器
uint8_t AHT20_Read_Cal_Enable(void); //查询cal enable位有没有使能
void AHT20_SendAC(void); //向AHT20发送AC命令
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num);
void AHT20_Read_CTdata(uint32_t *ct); //没有CRC校验,直接读取AHT20的温度和湿度数据
void AHT20_Read_CTdata_crc(uint32_t *ct); //CRC校验后,读取AHT20的温度和湿度数据
void AHT20_Init(void); //初始化AHT20
void JH_Reset_REG(uint8_t addr);///重置寄存器
void AHT20_Start_Init(void);///上电初始化进入正常测量状态
#endif
修改AHT20.C
#include "main.h"
#include "AHT20-21_DEMO_V1_3.h"
#include "gpio.h"
#include "i2c.h"
void Delay_N1