带你了解STM32:I2C通信(第二部分)

目录

0.I2通信两部分学习

1.I2C外设简介(先学习一主多从、7位地址的I2C,才能深入的看手册学习)

2.I2C框图

3.I2C基本结构

4.主机发送

5.主机接收

6.软件/硬件波形对比

7.硬件I2C读写MPU6050代码

第一步:按图接线到面包板

第二步:复制软件I2C读写MPU6050代码

第三步:将MyI2C模块移除工程

第四步:在MPU6050.c中配置I2C外设

I2C相关库函数

第五步:在MPU6050.c中封装一个事件等待函数

第六步:在MPU6050.c中配置指定地址写一个字节的时序

第七步:在MPU6050.c中配置指定地址读一个字节的时序

第八步:头文件声明

硬件I2C读写MPU6050完整代码

8. I2C相关库函数


0.I2通信两部分学习

第一部分:介绍协议规则,然后用软件模拟的形式来实现协议

第二部分:介绍STM32的I2C外设,然后用硬件来实现协议


1.I2C外设简介(先学习一主多从、7位地址的I2C,才能深入的看手册学习)

STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担

支持多主机模型

有两种:1.固定多主机。有两个及以上的主机,连接I2C总线控制从机,当主机之间有信号冲突时,会总线仲裁让那个主机先使用;2.可变多主机(STM32的I2C就这种)。I2C总线上没有固定的主机,任何设备都可以在总线空闲状态下充当主机,没有充当主机的就是从机,当这个主机完成了信号的通信,就会变回从机,如果从机之间有信号冲突同时要当主机,总线仲裁会判断谁来当主机

支持7位/10位地址模式

7位地址:起始位后的第一个字节是7位地址+读写位,第一个字节为寻址位。只有128种情况,设备非常多,不够用

10位地址:起始位的第一个字节前五位11110,第一个字节剩下的三位:前面两个和第二个字节的8位组成10位地址,最后一位读写位,也就是把前面两字节当成寻址位。有1024种情况

支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)

支持DMA

多字节通讯可以增加通信效率

兼容SMBus协议

SMBus系统管理总线,基于I2C总线改进产生

STM32F103C8T6 硬件I2C资源:I2C1、I2C2


2.I2C框图

外设通信引脚:SDA、SCL

SMBALERT:SMBus使用

数据控制部分

核心部分:DATA REGISTER和数据移位寄存器

需要发送数据时,可以把一个字节数据写到数据寄存器DR,当移位寄存器没有移位时,这个数据寄存器的值就会进一步转到数据寄存器里面,在移位的过程中,就可以把下一个数据放在数据寄存器里等待移位,一旦前面的一个数据完成移位,这个数据就可以无缝衔接进行移位,当数据由数据寄存器转到移位寄存器时,就会置转态寄存器的TXE位为1,表示发生寄存器为空。

接收和发送的过程相反,然后,置标志位RXNE,表示接收寄存器非空

比较器和地址寄存器(自身地址寄存器、双地址寄存器):从机模式使用,可变多主机模式,自身地址寄存器可以自定义的写入地址,如果STM32作为从机,在被寻址时,收到的寻址通过比较器判断,和自身地址相同,那STM32作为从机,响应外部主机的召唤,并且STM32支持同时响应两个从机地址,所以又有双地址寄存器

PEC计算和寄存器:数据校验模块,当发送一个多字节数据帧时,在PEC计算里硬件可以自动执行CRC校验计算(根据前面的数据,进行各种数据运算,得到一个字节的校验位,附加在数据帧的后面),接收到这个数据帧后,STM32硬件自动执行校验判断,如果数据在传输过程中出错了,CRC校验算法就通不过,硬件就会置校验错误标志位

时钟控制部分


3.I2C基本结构

因为是高位先行,所以向左移


4.主机发送


5.主机接收


6.软件/硬件波形对比


7.硬件I2C读写MPU6050代码

第一步:按图接线到面包板

第二步:复制软件I2C读写MPU6050代码

第三步:将MyI2C模块移除工程

第四步:在MPU6050.c中配置I2C外设

初始化步骤:1.开启I2C外设和对应的DPIO口的时钟;2.把I2C外设对应的GPIO口初始化为复用开漏模式(开漏:I2C协议要求,复用:GPIO控制权要交给硬件外设,软件配置就是通用开漏模式);3.使用结构体,对整个I2C进行配置;4.I2C_Cmd,使能

I2C相关库函数

恢复缺省配置、初始化、结构体初始化、使能

生成起始条件

生成终止条件

这个函数是配置CR1的ACK的,也就是配置收到一个字节之后,是否给从机应答

发送数据,实际就是把Data这个数据,直接写到DR寄存器

接收数据,读取DR的数据作为返回值

发送7位地址的专用函数

多种监控标志位的函数;1.基本状态监控(推荐使用);2.高级状态监控(一般不用);3.基于标志位的状态监控(之前经常只有)

获取标志位、清除标志位、获取中断状态、清除中断挂起位

第五步:在MPU6050.c中封装一个事件等待函数

第六步:在MPU6050.c中配置指定地址写一个字节的时序

第七步:在MPU6050.c中配置指定地址读一个字节的时序

如果想要读取多个字节,直接等待EV7事件,读取DR,就能收到数据,这样依次接收,在接收最后一个字节之前,也就是这里的EV7_1事件,需要提前把ACK置0,STOP置1;如果只读一个字节,在EV6直接之后,就要立刻ACK置0,STOP置1,要是设置晚了,时序就会多一个字节

这里是读一个字节,代码思路:我们是在EV6之后,也就是收到最后一个字节之前,临时把ACK置0,非应答,STOP置1,所以接收函数的最后要恢复默认的ACK=1

第八步:头文件声明

剩下的其他不变,代码任务完成

硬件I2C读写MPU6050完整代码

8. I2C相关库函数

恢复缺省配置、初始化、结构体初始化、使能

生成起始条件

生成终止条件

这个函数是配置CR1的ACK的,也就是配置收到一个字节之后,是否给从机应答

发送数据,实际就是把Data这个数据,直接写到DR寄存器

接收数据,读取DR的数据作为返回值

发送7位地址的专用函数

多种监控标志位的函数;1.基本状态监控(推荐使用);2.高级状态监控(一般不用);3.基于标志位的状态监控(之前经常只有)

获取标志位、清除标志位、获取中断状态、清除中断挂起位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值