创作本文目的:记录自己的学习历程
一、A7实现IIC总线下的温湿度传感器步骤
1.相关概念
IIC
IIC总线为两线制,只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL
IIC总线需要接两个上拉电阻,这两个上拉电阻作用在IIC总线为空闲状态时保持高电平
IIC硬件结构简单,接口连接方便,成本较低。
IIC总线传输速率
低速 100k
中速 400k
全速 3.4M
IIC总线支持多主机多从机模式,同一时刻,只能有一个主机和一个从机进行通信
挂接到每一个IIC总线上所有的设备,每一个从机都有自己唯一的七位从机地址
在总线上,发送数据的叫做发送器,接收数据的叫做接收器
主动发起数据通信的叫做主机,只能被动接收数据的叫做从机
时钟信号是由主机产生的,作用于从机,保证总线上传输数据同步
IIC时序
1.起始信号:在SCL为高电平期间,SDA从高电平到低电平的变化
2.停止信号:在SCL为高电平期间,SDA从低电平到高电平的变化
3.数据传输:在SCL高电平时,只允许读取数据,SDA必须保持稳定,在SCL低电平时,允许往SDA上写数据
4.应答/非应答信号:在8位数据位传输完毕后,必须在第9个时钟周期内返回一个应答/非应答信号
如果读到的是高电平,代表是非应答信号
如果读到的是低电平,代表是应答信号
5.寻址,由于需要确定从机地址,所以在起始信号产生后,必须传递一个7位从机地址
2.分析硬件
I2C1_SDA — PF15
I2C1_SCL — PF14
3.分析芯片手册
stm32mp157A
RCC
GPIO(通过GPIO来模拟IIC寄存器)
si7006芯片手册
1.si7006从机地址
2.找到采集温度湿度命令码
3.初始化si7006芯片,初始化的值,写到哪一个寄存器中
4.读取温湿度芯片IIC协议
5.采集温湿度数字量转换为模拟量公式
4.代码
iic.h
#ifndef __IIC_H__
#define __IIC_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "gpio.h"
/* 通过程序模拟实现I2C总线的时序和协议
* GPIOF ---> AHB4
* I2C1_SCL ---> PF14
* I2C1_SDA ---> PF15
*
* */
#define SET_SDA_OUT do{
GPIOF->MODER &= (~(0x3 << 30)); \
GPIOF->MODER |= (0x1 << 30);}while(0)
#define SET_SDA_IN do{
GPIOF->MODER &= (~(0x3 << 30));}while(0)
#define I2C_SCL_H do{
GPIOF->BSRR |= (0x1 << 14);}while(0)
#define I2C_SCL_L do{
GPIOF->BRR |= (0x1 << 14);}while(0)
#define I2C_SDA_H do{
GPIOF->BSRR |= (0x1 << 15);}while(0)
#define I2C_SDA_L do{
GPIOF->BRR |= (0x1 << 15);}while(0)
#define I2C_SDA_READ (GPIOF->IDR & (0x1 << 15))
void delay_us(void);
void i2c_init(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_write_byte(unsigned char dat);
unsigned char i2c_read_byte(unsigned char ack);
unsigned char i2c_wait_ack(void);
void i2c_ack