I2C 协议下使用 AHT20 温湿度传感器采集数据


前言

本文主要介绍了I2C温湿度传感器采集数据的基础内容


一、I2C是什么?

1.I2C简介

I2C总线(Inter Integrated-Circuit)是由PHILIPS公司在上世纪80年代发明的一种电路板级串行总线标准,通过两根信号线——时钟线SCL和数据线SDA——即可完成主从机的单工通信。总线硬件连接极其简单,不同I2C设备挂接在总线上,只需在信号线安装上拉电阻即可完成硬件线路的搭建。另外,I2C总线采用器件地址的硬件设置方法,通过软件寻址方式完全避免了片选寻址的弊端,从而使硬件系统扩展更为灵活。

由于简单有效,I2C在业界得到广泛应用。基于I2C衍生出来的标准有SMBus、PMBus、IPMI、DDC和ATCA等。常见集成I2C硬件接口的设备有微控制器、温度传感器、LED控制器、EEPROM、ADC/DAC、RTC、时钟振荡器和I/O控制器等。

2.I2C特点

I2C总线最主要的优点是其简单性和有效性,其次I2C支持多主机(Multi-Mastering),任何能够进行发送和接收的设备都可以成为主机。主机控制数据的传输和时钟的频率。在任何时间点只能有一个主机。因为只有两条线,在处理地址和应答时,I2C存在一定的开销,效率不如设备直接相连的SPI总线。

I2C只有两根信号线:串行数据线SDA和串行时钟线SCL;
I2C总线上所有器件的SDA、SCL引脚输出驱动都为漏极开路结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的“线与”逻辑关系;
总线上的所有设备通过软件寻址且具有唯一的地址(7位或10位)。7位“从机专用地址码”,其高4位为设备类型地址(由生产厂家制定),低3位为器件引脚定义地址(由使用者定义);10位地址不常见;
任何时刻都只存在简单的主/从关系,按数据传输的方向,主机可以是主发送器或主接收器;
支持多主机。在总线上存在多个主机时,通过冲突检测和仲裁机制防止多个主机同时发起数据传输时存在的冲突;
I2C总线上所有器件都具有“自动应答”功能,保证数据传输的正确性;
主机和从机的区别在于对SCL的发送权,只有主机才能发送SCL;
I2C总线不仅广泛应用于电路板级的内部通信,还可以通过I2C总线驱动器进行不同系统间的通信;
支持传输速率包括标准模式(Standard Mode)100kb/s、快速模式(Fast Mode)400kb/s、增强快速模式(Fast Mode Plus)1Mb/s和高速模式(High Speed Mode)3.4Mb/s;极速模式(Ultra-Fast Mode),单向数据传输速率可达5Mb/s;
I2C总线允许挂载最多的设备数量取决于总线上最大电容值,一般为400pf(Hs模式100pf)
参考博客:https://blog.csdn.net/qq_41006901/article/details/104882391

3.硬件 I2C 和 软件 I2C

硬件(固件) I2C 对应芯片上的 I2C 外设,有相应 I2C 驱动电路,其所使用的 I2C 管脚也是专用的
软件(模拟) I2C 一般是用 GPIO 管脚,用软件控制管脚状态以模拟 I2C 通信波形
区别:
硬件 I2C 的效率要远高于软件的;软件 I2C 由于不受管脚限制,接口比较灵活
硬件 I2C 是直接调用内部寄存器进行配置;软件 I2C 是通过 GPIO ,软件模拟寄存器的工作方式
硬件 I2C 配置了 IO 口的功能(I2C 功能);软件 I2C 没有配置 IO 口的功能
硬件 I2C 的 I2C 写函数,有调用现成的函数或者给某个寄存器赋值;软件 I2C 传输数据的方式是一个 bit 一个 bit 模拟发生送的,肯定用到了循环
根据代码量判断,硬件 I2C 的代码量肯定比软件 I2C 的代码量小
硬件 I2C 用法比较复杂,软件 I2C 的流程更清楚一些
硬件 I2C 的速度比软件 I2C 的速度快,并且硬件 I2C 可以用 DMA
硬件 I2C 只能在固定管脚上;模拟 I2C 可以在任何管脚上
软件 I2C 是程序员使用程序控制 SCL、SDA 线输出高低电平,模拟 I2C 协议的时序,一般较硬件 I2C 稳定,但是程序较为繁琐,但不难
硬件 I2C 程序员只要调用 I2C 的控制函数即可,不用直接的去控制SCL、SDA 高低电平的输出,但是有些单片机的硬件 I2C 不太稳定,调试问题较多
参考博客:https://blog.csdn.net/ssj925319/article/details/111461000?spm=1001.2014.3001.5502

二、使用步骤

1.实验准备

野火 stm32 指南者开发板
ST-LINK V2 STM8/STM32仿真器编程器
AHT21B_V1.0 温湿度传感器
杜邦线——母对母
Keil5 MDK
野火串口调试助手
具体硬件安装请参考博客:https://blog.csdn.net/ssj925319/article/details/111461000?spm=1001.2014.3001.5502

2.程序代码

首先先下载工程文件
链接:https://pan.baidu.com/s/1_9a809N5EZrmR9gaJ9Ijfw
提取码:sstc
在这里插入图片描述

main.c的代码如下:

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "bsp_i2c.h"


int main(void)
{
   	
	//延时初始化
	delay_init();
	//串口初始化
	uart_init(115200);
	//
	IIC_Init();
	
	while(1)
	{
   
		read_AHT20_once();
		delay_ms(1500);
  }
}
/*********************************************END OF FILE**********************/

bsp_i2c.h的代码如下:

#ifndef __BSP_I2C_H
#define __BSP_I2C_H

#include "sys.h"
#include "delay.h"
#include "usart.h"

 
#define SDA_IN()  {
     GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
//CRL = 0000 1111 1111 1111 1111 1111 1111 1111
//8<<28 = 1000 1111 1111 1111 1111 1111 1111 1111
//CRL = 1000 1111 1111 1111 1111 1111 1111 1111 = 0x8fffffff 表示 SDA 输入
#define SDA_OUT() {
     GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
//CRL = 0x3fffffff 表示 SDA 输出


#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA	 
#define READ_SDA   PBin(7)  //SDA 数据读取 7 管脚


void IIC_Init(void);
void  read_AHT20_once(void);
void  reset_AHT20(void);
void  init_AHT20(void);	
void  startMeasure_AHT20(void);
void  read_AHT20(void);
uint8_t  Receive_ACK(void);
void  Send_ACK(void);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值