第49回 AHT20大采温湿度 菜鸡初涉Ardunio

前期学习

I2C学习和了解

在AHT20的产品手册里面我们可以看到AHT20芯片数据的输出遵循的是I2C协议
在这里插入图片描述

资料来源:

I²C–百度百科
I²C- - - WIKI百科
I²C-----知乎
野火STM32F103教学视频–44
《I2C总线协议》文档

基本概念:

I²C(Inter-Integrated Circuit)字面上的意思是集成电路之间,它其实是I²C
Bus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦(Phiilps)公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。

I2C 总线支持任何 IC 生产过程 NMOS CMOS 双极性 两线――串行数据 SDA 和串行时钟 SCL
线在连接到总线的器件间传递信息 每个器件都有一个唯一的地址识别 无论是微控制器 LCD 驱动器 存储器或键盘接口而且都可以作为一个发送器或接收器 由器件的功能决定
很明显 LCD 驱动器只是一个接收器 而存储器则既可以接收又可以发送数据
除了发送器和接收器外 器件在执行数 据传输时也可以被看作是主机或从机 见表 1 主机是初始化总线的数据传输并产生允许传输的时钟信号 的器件
此时 任何被寻址的器件都被认为是从机

它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯 协议的外部收发设备
现在被广泛地使用在系统内多个集成电路(IC)间的通讯
e.g:
在开发板上,EEPROM是一个IC,STM32芯片是一个IC,两个IC之间通过I²C总线协议进行通讯
还有很多传感器都是用的I²C

I²C仅使用两个双向开漏线,串行数据线(SDA)和串行时钟线(SCL),上拉了电阻。使用的典型电压是+5 V或+3.3 V(虽然其他电压系统也是允许的)。

我们在AHT20的应用电路中也可以看到SCL和SDA,是典型的I²C硬件管脚
在这里插入图片描述

相关术语:

在这里插入图片描述
起始和停止信号一般由主机产生

物理层:

在这里插入图片描述
1.它是一个支持多设备的总线。“总线”指多个设备共用的信号线。 在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。最多可以有100+的从机。

这里在开发板上的主机就是STM32芯片

2.一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) , 一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

3.每个连接到总线的设备都有一个独立的地址,主机可以利用这个 地址进行不同设备之间的访问。类似计算机的MAC地址。

主机的寻址方式需要于从机的地址契合,不能主机使用7位地址从机使用10位地址,这样就找不到啦

4.总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当 所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。从机输出高阻态,即电阻变很高,可以理解为从机断开开路。

5.多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由 哪个设备占用总线。

协议层:

主机—从机
在这里插入图片描述
从机—主机
在这里插入图片描述
在这里插入图片描述

题外:关于EEPROM

EEPROM是开发板上面的一个非易失性存储器(掉电后数据不会丢失)
同样的非易失性还有FLASH,光盘,软盘,机械硬盘

RAM是易失性存储器(掉电后数据会丢失),现在已经成为了易失性的代名词,一般来说相对读写速度更快

学后思考:

解释什么是“软件I2C”和“硬件I2C”?

所谓硬件I²C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。

硬件I²C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。

模拟I²C 是通过GPIO,软件模拟寄存器的工作方式,通过CPU直接控制通讯引脚的电平,产出符合通讯协议标准的逻辑,而硬件(固件)I²C是直接调用内部寄存器进行配置。
如果要从具体硬件上来看,可以去看下芯片手册。因为固件I²C的端口是固定的,所以会有所区别。

Ardunio平台的了解和学习

Ardunio官网下载
在这里插入图片描述
这里建议使用科学的方式下载,不然会慢到你哭
在这里插入图片描述
下载好解压打开就可以了
在这里插入图片描述
配置首选项
http://dan.drown.org/stm32duino/package_STM32duino_index.json
复制上面的链接地址
文件—首选项
在这里插入图片描述
之后在工具----开发板-----开发板管理器里面就有了STM32F103系列
在这里插入图片描述

下载就可以了,同样的需要使用科学的方法下载
至此,使用Arduino IDE 开发stm32f103系列开发板准备工作完成

大概是受到Ardunio IDE的启发,网上有一个国人版的MCU集成开发平台, stduino IDE(http://www.stduino.com/pindex.php),请试玩之,然后谈一下体会,
比如:已经有了Keil、Ardunio,觉得是否还有必要“再造车轮”?

我觉得有必要,
一是可供选择的开发平台更多的话,学习环境也会变得多元化
二是这些平台都是国外开发的,国内也需要有一个更贴合国人习惯的一个开发环境

实验实现

温湿度传感器的实用

阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)

打开野火MINI手册,查看原理图,发现只有一组I²C接出口
找到对应I²C的SCL和SDA引脚为PA2和PA3
在引出IO口中找到PA2和PA3
在这里插入图片描述

在这里插入图片描述
根据对应的引脚连接AHT20和开发板,使用母对母的杜邦线
在这里插入图片描述

在这里插入图片描述

代码的实现

github上面有现成的代码,基于软件I2C编写的
基于I2C的温湿度采集模块
在这里插入图片描述
直接拿来烧录,SCL和SDA线是PB6和PB7
下面写的是硬件I2C的实现,可能很难实现,但是都是一点点学的,就当学I2C玩了

GPIO口的设置

static void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure; 
		/* 使能与 I2C 有关的时钟 */
	EEPROM_I2C_APBxClock_FUN ( EEPROM_I2C_CLK, ENABLE );
	EEPROM_I2C_GPIO_APBxClock_FUN ( EEPROM_I2C_GPIO_CLK, ENABLE );


    
  /* I2C_SCL、I2C_SDA*/
  GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SCL_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;	       // 开漏输出
  GPIO_Init(EEPROM_I2C_SCL_PORT, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SDA_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;	       // 开漏输出
  GPIO_Init(EEPROM_I2C_SDA_PORT, &GPIO_InitStructure);	
		
}

I2C_Init()

打开stm32的库函数手册,找到I2C
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里我们就能找到I2C的Init所需要的参数配置和相关的宏
以I2C_acknowledged_address为例
双击
在这里插入图片描述
“This parameter can be a value of I2C_acknowledged_address
再点击
在这里插入图片描述
这里就是I2C_acknowledged_address的值相关的宏了
直接复制I2C_AcknowledgedAddress_7bit 赋值
这样就配置好了I2C为7位寻址模式了

如法炮制,配置好我们想要的I2C的工作模式

/**
  * @brief  I2C 工作模式配置
  * @param  无
  * @retval 无
  */
static void I2C_Mode_Configu(void)
{
  I2C_InitTypeDef  I2C_InitStructure; 

  /* I2C 配置 */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	
	/* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
	
  I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7; 
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
	 
	/* I2C的寻址模式 */
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	
	/* 通信速率 */
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  
	/* I2C 初始化 */
  I2C_Init(EEPROM_I2Cx, &I2C_InitStructure);
  
	/* 使能 I2C */
  I2C_Cmd(EEPROM_I2Cx, ENABLE);   
}
/**
  * @brief  I2C/GPIO初始化
  * @param  无
  * @retval 无
  */
void I2C_AHT20_Init(void)
{
	I2C_GPIO_Config();
	I2C_Mode_Configu();
}

Ardunio的第一句Hello World!

安装 Ardunio IDE 和相关软件支持库,在Ardunio 完成STM32板子的串口通信程序:
1)持续向串口输出“Hello world!”;
2)当接收到“stop!”时,停止输出。

在Arduino中, 标准的程序入口main函数在内部被定义, 用户只需要关心以下两个函数:
setup()loop()

void setup() {
	Serial.begin(115200); // Ignored by Maple. But needed by boards using hardware serial via a USB to Serial adaptor
}

void loop() {
	 if (Serial.available() > 0) {
                // 读取传入的字节
            if(Serial.read()=“Stop”){
                // 指示你收到的数据
            Serial.println("Hello World!");
			delay(1000);
           }
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值