首页 > 其他分享 >STM32之IIC协议

STM32之IIC协议

时间:2024-08-08 16:16:47浏览次数:12  
标签:协议 字节 SCL 总线 发送 STM32 SDA IIC 设备

物理层

 

1.从机数量选择

  • 地址限制:IIC协议本身没有严格规定总线上device最大数目, 从理论上看, IIC能挂的device数目取决于能表示的最大地址空间, 在7位地址模式下, 减去0x00地址不可用, 理论上可以挂2^7 -1 = 127个设备。
  • 总线电容限制:
  • 由于器件的管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。

2.引脚模式的选择:连接在SDA数据线的输出信号线必须是OD(开漏)输出或者OC(开集)输出,以保证线与的功能

3.上拉电阻阻值的选择:通讯速度限制由上升沿和下降沿时间决定,OD门的下降速度较快,因此主要由上拉能力决定,上拉能力主要由电源和上拉电阻决定,如果上拉电阻值过小,Vcc灌入端口的电流(Ic)变大,这样会导致器件开漏输出的MOS管(三极管)不完全导通,由饱和状态变成放大状态,这样端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V)。上拉电阻推荐4.7K~10k之间。

4.串联电阻的选用:I2C协议还定义了串联在SDA、SCL线上电阻Rs。该电阻的作用是,有效抑制总线上的干扰脉冲进入从设备,提高可靠性。这个电阻的选择一般在100~200ohm左右。当然,这个电阻并不是必须的,在恶劣噪声环境中,可以选用。

 

协议层:

1.起始与停止信号

  • 总线在空闲状态 时,SCL和SDA都保持着高电平,
  • 当SCL为高而SDA由高到低的跳变,表示产生一个起始条件;
  • 当SCL为高而SDA由低到高的跳变,表示产生一个 停止条件。
  • 在起始条件产生后,总线处于忙状态(线与),由本次数据传输的主从设备独占,其他I2C器件无法访问总线;
  • 而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。

2.传输数据有效性

  • SDA线上的数据必须在SCL的高电平时保持稳定。
  • SDA线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。

即SCL高时,SDA不可以动,SCL低时,SDA可动(用于区别起始和停止信号),改变SDA信号时候,总是要先拉低SCL信号,改变SDA的电平状态,以发送数据,由于接收端需要一个信号来确定每一位的位置,所以在改变SDA后需要将SCL重新拉高,以产生一个上升沿,此时从机根据上升沿读取这个SDA电平,在SCL上升后由于需要再次发送一个字节,因此需要再次将SCL拉低,准备下一次的SDA数据发送。

3.一次发送的字节数量必须是8位,每次可以传输的字节数量不被限制,每个字节后必须跟一个响应位,首先传输数据最高位MSB

4.ACK信号:

当主设备向从设备发送数据或地址后,或者从设备向主设备发送数据后,接收方会在第 9 个时钟脉冲期间通过将 SDA 线拉低来发送 ACK 信号,表示数据已成功接收。

这个信号代表此次的数据发送成功,如果回传Nack那么从机接收到后可以按情况处理

要通过 IIC 发送多个字节的数据,可以按照以下步骤进行:
起始条件:主设备发送起始信号(SCL 为高电平时,SDA 从高电平切换到低电平),启动通信。
发送从设备地址:主设备发送 7 位的从设备地址,并在第 8 位表示写操作(通常为 0)。
等待应答:从设备接收到地址后,发送应答信号(ACK)。
发送第一个字节数据:主设备在 SCL 的控制下,逐位发送第一个字节的数据。
接收应答:从设备在第 9 个时钟脉冲时发送应答信号(ACK),表示第一个字节数据接收成功。
重复步骤 4 和 5,依次发送后续的字节数据,直到所有要发送的数据字节都完成传输。
停止条件:主设备发送停止信号(SCL 为高电平时,SDA 从低电平切换到高电平),结束通信。
例如,假设要从主设备向从设备发送三个字节的数据 0xAA、0xBB、0xCC :
首先发送起始条件,然后发送从设备地址并等待应答。接着发送 0xAA 并等待应答,再发送 0xBB 并等待应答,之后发送 0xCC 并等待应答。最后发送停止条件。
在整个过程中,SCL 始终控制着通信的节奏,确保数据的稳定传输和正确的应答。

 

标签:协议,字节,SCL,总线,发送,STM32,SDA,IIC,设备
From: https://www.cnblogs.com/aker-whale/p/18349041

相关文章

  • 自定义协议缓冲区(Protocol Buffers)在Xcode开发中的实战应用
    自定义协议缓冲区(ProtocolBuffers)在Xcode开发中的实战应用在当今的iOS开发中,数据的序列化和反序列化扮演着至关重要的角色。ProtocolBuffers(简称Protobuf),由Google开发,以其轻量、快速和简单的特点,成为了一种流行的跨平台数据交换格式。本文将带领你了解如何在Xcode中集......
  • TCP协议
    TCP(TransmissionControlProtocol)是一种面向连接的、可靠的传输层协议,用于在网络上可靠地传输数据。TCP协议的特点:面向连接:在通信开始之前,发送方和接收方需要建立一个连接,双方通过这个连接来进行数据的传输和通信(连接的建立和关闭采用三次握手和四次挥手);可靠性:TCP协议提供......
  • 【北京迅为】《stm32mp157开发板嵌入式linux开发指南》第四章 Ubuntu 启用 root 用户
         iTOP-STM32MP157开发板是基于意法半导体STARM双Cortex-A7核加单Cortex-M4核的一款多核异构处理器。Cortex-A7内核提供对开源操作系统Linux的支持,借助Linux系统庞大而丰富的软件组件处理复杂应用。M4内核上运行对于实时性要求严格的应用。        开发板既有......
  • 开源协议
    1、GPL(GNUGeneralPublicLicense)商业软件不能使用GPL协议的代码。2、LGPL(GNULibraryor“Lesser”GeneralPublicLicense)商业软件可以使用,但不能修改LGPL协议的代码。3、ApacheLicense2.0ApacheLicence是对商业应用友好的许可。使用者也可以在需要......
  • 基于STM32F103的FreeRTOS系列(七)·任务创建·列表的使用超详细解析
    目录1. 列表和列表项1.1 列表和列表项简介1.1.1  列表1.1.2  列表项1.1.3  迷你列表项1.1.4 列表与列表项关系图1.2 列表初始化1.3 列表项的初始化1.4 列表项的插入函数1.5 列表项的末尾插入1.6 列表项的删除1.7 列表的遍历1. 列表......
  • python joblib.load 发生错误:协议 0 中的持久 ID 必须是 ASCII 字符串 在 GCP 云运行
    总体而言:我尝试使用Cloudbuild和Cloudrun构建BERT模型。我将模型(参数)和元数据(标签)保存在GCPCloudStorage中。但是,我遇到了通过joblib.load()加载metadata.bin文件的错误。我的metadata.bin文件包含UTF-8字符,但joblib.load需要ASCII字符。在......
  • STM32&ADC
    ADC简介:有打moba游戏的别搞混了,这不是射手adc。在32中,ADC的全称为:Analog-to-DigitalConverter,指模拟/数字转换器 也就是模拟-数字电路的转换器。其实通俗的来讲,它就是一个电压表。目录一.ADC原理1.ADC框图2.通道3.规则组/注入组&转换顺序4.转换触发5.周期 6.转换模......
  • 代理IP类型详细解析:那么多种协议的代理如何选?
    代理IP已经成为跨境业务的得力工具,但是仍有许多新手小白在初次接触到代理IP服务商时,不知道具体如何选择代理IP类型,面对五花八门的代理类型名称,往往需要付出一定的试错成本才知道哪个适合自己的业务。今天就来给大家科普科普,常见的代理类型有哪些?1.数据中心代理数据中心代理,......
  • STM32F407 UART
    //串口(UART)------------------------://1.同步:      步调一致,两个设备之间的通信速度相同//2.异步:      步调不一致,两个设备之间的通信速度不相同//总结:      同步通信:有时钟线连接,并且时钟线可以控制两个设备之间的速度,让速度保持一致    ......
  • STM32F407 SysTick
    //定时器分类:   内核定时器(系统滴答定时器):      延时、定时中断、给操作系统提供时基   基本定时器:      延时、定时中断、时间片   通用定时器:      延时、定时中断、输出比较(PWM)、输入捕获(捕获高/低电平时间、红外信号解码(解NEC......