STM32 IIC

2024-09-03 07:12
文章标签 stm32 iic

本文主要是介绍STM32 IIC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一块:介绍协议规则,然后用软件模拟的形式来实现协议,
第二块:介绍STM32的IIC外设,然后用硬件来实现协议

因为IIC是同步时序的额,软件模拟协议也非常方便,像我们单片机一样,外挂芯片里的众多外设也是通过读写寄存器来控制运行的,寄存器本身也是存储器的一种,,这个芯片多有的寄存器也是都被分配到了一个线性的存储空间,如果我们想要读写寄存器来控制硬件电路,我们就至少需要定义两个字节数据,一个字节是要读写哪个寄存器,也就是寄存器的地址,另一个地址就是这恶鬼地址下寄存器存的内容,写入内容就是控制电路,读出内容就是获取电路的状态,这整个流程和单片机CPU操作外设的原理一样的,单片机读写自己的寄存器可以通过内部的数据总线来实现,直接用指针就可以了,不需要我们操心,但是这个模块的寄存器在单片机的外面,你要是直接把单片机内部的数据总线拽出来,把两个芯片合为一体,那可能不太实现,所以现在大公司找到你,要求你给他设计一种通信协议,在单片机和外部模块连接少量几根线,实现单片机读写外部模块寄存器的功能。

异步时序在单片机运行过程中,单片机有事进入中断了,时序能不能暂停一下,接收方不知道可能导致数据出错,异步时序非常依赖硬件外设的支持。
同步时序能极大的降低单片机对硬件电路的依赖,即使没有硬件电路的支持,也可以很方便的用软件手动反转电平来实现通信,比如软件模拟IIC。如果设计能实现项目要求,符合电路原理,性能和稳定性好,如果能有大公司帮忙推广,得到了广泛认可,那以后学习的就是自己设计的通信协议了。
至少要实现在指定位置读寄存器和写寄存器,这两个功能,

在这里插入图片描述
单片机作为主机,主导IIC总线的运行,挂载在IIC总线的所有外部模块都是从机,从机只有被主机点名之后才能控制IIC总线,不能在未经允许的情况下碰IIC,防止冲突,这就像是在教室里,老师是主机主导课堂的运行,所有从机可以被动地听老师讲课,但是从机只有在被老师点名之后才能说话,我们使用IIC的绝大多数场景都是一主多从的形式,多主多从的模型在总线任何一个模块都可以主动跳出来,说接下来我就是主机,你们都得听我的,,这就像是在教室里,老师正在讲课,突然有个学生站起来说,老师打断一下,接下来让我说,所有同学听我指挥,这时就相当于发生了总线冲突,仲裁胜利的一方获取总线控制权,失败的一方自动变回从机,当然由于时钟线也是由主机控制的,所以多主机的模型下,还要进行时钟同步,多主机的情况下,协议是比较复杂的,感兴趣自行了解,

一般使用一主多从。
作为一个通信协议,必须要在硬件和软件上,都作出规定,硬件上就是电路应该如何连接,端口的输入输出模式都是什么样的,时序如何定义,字节如何传输,高位先行还是低位先行,一个完整的时序由哪些部分构成,硬件的规定和软件的规定配合起来,就是一个完整的通信协议。

任何时候,都是主机完全掌控SCL线,另外在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机,这就是主机的权力

在这里插入图片描述
从机不允许主动发起对SDA的控制,只有主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地取得SDA的控制权,这就是一主多从模型中协议的规定。
单主机模式下,其实SCL设置成推挽输出没问题。但是仍然采用了开漏加上拉输出的模式,因为多主机模式下会利用这个特征。

通过一个数据缓冲器或者施密特触发器,进行输入。

在这里插入图片描述
IIC总线处于空闲状态时,SCL和SDA都处于高电平状态,也就是没有任何一个设备去碰SCL和SDA,由外挂的上拉电阻拉高至高电平。当主机需要进行数据收发时,首先要打破总线的宁静,产生一个其实条件,把SDA拽下来,产生一个下降沿,当从机捕获到这个SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤。然后再SDA下降沿之后,主机要把SCL拽下来,一方面是占用这个总线,另一方面也是为了方便我们这些基本单元的拼接,就是之后我们会保证,除了起始和终止条件每个时序单元的SCL都是以低电平开始,低电平结束,这些单元拼接起来,SCL才能续的上,SCL高电平期间,SDA从低电平切换到高电平,也就是这样,SCL先放手,回弹到高电平,SDA再放手,回弹高电平,产生一个上升沿,这个上升沿触发终止条件,同时终止条件后,SCL和SDA都是高电平,回归到最初的平静状态,这个起始条件和终止条件就类似串口时序里面的起始位和停止位,,一个完整的数据帧,总是以起始条件开始,终止条件结束,。起始和终止,都是由主机产生的。从机不允许产生起始和终止,所以在总线空闲状态时,从机必须始终双手放开,不允许主动跳出来,去碰总线,

在这里插入图片描述
起始条件之后,第一个字节,也必须时主机发送的,就是最开始,SCL低电平,,主机如果想发送0,就拉低SDA到低电平,如果想发送1,就放手,SDA回弹到高电平,在SCL低电平期间,允许改变SDA电平,当这一个放好之后,主机就松手时钟线,SCL回弹到高电平,高电平期间,是从机读取SDA的时候,所以高电平期间SDA不允许变化,从机需要尽快地读取SDA,一般都是在上升沿的时刻,从机就已经读取完成了,因为时钟是主机控制的,从机并不知道什么时候会产生下降沿,你从机要是磨磨唧唧,主机可不会等你,所以从机在上升沿的时候,就会立刻把数据读走,那主机在放手SCL一段时间后,就饿可以继续拉低SCL,传输下一位了,主机也需要在SCL下降沿之后,尽快把数据放在SDA上,但是主机有时钟的主导权,所以主机并不需要那么着急,只需要在低电平的任意时刻把数据放在SDA上就行了,数据放完之后,主机再松手SCL,SCL高电平,就这样的流程。主机拉低SCL,把数据放在SDA上,主机松开SCL,从机读取SDA的数据,在SCL的同步下,依次进行主机发送和从机接收,循环8此,就发送了8位数据,也就是一个字节,所以第一位是一个字节的最高位B7,最后发送最低位B0,串口时序是低位先行,IIC是高位先行,。
另外,由于这里有时钟线进行同步,所以如果主机一个字节发送一半,突然中断了,不操作SCL和SDA了,那时序就会在终端位置不断拉长,SCL和SDA电平都暂停变化,等中断结束,主机回来继续操作。传输仍然不会出现问题,这就是同步时序的好处。由于整个时序就是主机发送一个字节,所以在这个单元里,SCL和SDA全程都由主机掌控,从机只能被动读取,这就是发送一个字节的时序,

在这里插入图片描述

SDA实线部分是主机控制的电平,虚线部分是从机控制的电平,SCL全程由主机控制,SDA在主机接受前要释放,交由从机控制,之后还是一样,因为SCL时钟是由主机控制的,所以从机的数据变换基本都是贴着SCL下降沿进行的,而主机可以在SCL高电平的任意时刻读取,,这就是接收一个字节的时序。

在这里插入图片描述
应答机制分为发送应答和接收应答,分别和发送一个字节,接收一个字节的其中一位是相同的,可以理解为发送一位和接收一位,这一位就用来作为应答,是主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答,。
是主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答,。
然后同样,主机在接收之前,需要释放SDA,这个意思就是当我们在调用发送一个字节之后

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这篇关于STM32 IIC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132379

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

STM32的使用方法一

注:我采用的是STM32F103RC芯片、相应的电路图和STM32CubeIDE软件这是在STM32CubeIDE软件定义芯片后,所给的必要的代码逻辑,加上了注释 #include "main.h"/* Private variables ---------------------------------------------------------*//* Private function

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项