I2C SPI CAN协议

I²C总线通信协议

简介

I²C中文叫做集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而开发简单的双向两线制总线协议标准。I²C的正确读法为“I平方C”(”I-squared-C”),而“I二C”(”I-two-C”)则是另一种错误但被广泛使用的读法。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。

  • 半双工
  • 多用于版内传输

设计

设计概述

I²C只使用两条双向漏极开路(Open Drain)线,其中一条线为传输数据的串行资料线(SDA),另一条线是启动或停止传输以及发送时钟序列的串行时脉线(SCL),这两条线上都有上拉电阻。I²C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v。

特点:只使用两个I/O即可控制多个设备

由于是有许多设备,就需要添加地址来确定数据发送对象

I²C使用一个7比特长度的地址空间但保留了16个地址,所以在一组总线最多可和112个节点通信,每一个设备都会对应一个唯一的地址。

速率

I2C协议可以工作在以下5种速率模式下,不同的器件可能支持不同的速率。

  • 标准模式(Standard):100kbps
  • 快速模式(Fast):400kbps
  • 快速模式+(Fast-Plus):1Mbps
  • 高速模式(High-speed):3.4Mbps
  • 超快模式(Ultra-Fast):5Mbps(单向传输)

先行资料

串行时脉线(SCL)与串行资料线(SDA)

串行时脉线(SCL)

即为时钟线,设置好比特率之后可以固定产生相应稳定波形,用于时间的校对统一

串行资料线(SDA)

即为信号线,高电平为1,低电平为0,传递所需信息

完整的一帧I2C数据:

主机与从机

由于I²C是半双工的协议,即同一根传输线既作接收又作发送,数据可以在两个方向上传送,但通信双方不能同时收发数据,且I²C只有一根信号线为同步通讯,所以便诞生了主机和从机

  • 主机拥有该时刻总线的控制权(发起和结束一次通讯的权利),从机只能被主机呼叫
  • 同一时间只能有一个主机,但可以有多个从机
  • 主机 – 产生时钟并发起与从节点的通信
  • 从机 – 接收时钟并响应主节点的寻址

总线空闲状态

由于两根线均使用了上拉电阻,所以在总线空闲时,时钟线与数据线均为高电平

起始和结束信号

I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号由主设备产生(意味着从设备不可以主动通信,所有的通信都是主设备发起的,主可以发出询问的command,然后等待从设备的通信)。

起始和结束信号产生条件:总线在空闲状态时,当时钟线为高电平而信号线由高到低的跳变,表示产生一个起始条件;当时钟线为高而信号线由低到高的跳变,表示产生一个停止条件。

在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。

通讯过程

寻址

主机需要先声明信号所传递的从机地址

  • 起始信号 – 主机发送模式时,发送起始比特(起始信号),拉低处于空闲状态总线的信号线电平,并使总线进入忙状态
  • 7比特地址位 – 发送希望与之通信的从机的7比特地址 (从高位到低位依次发布
  • 1比特读写指示位
    • 低电平:发送数据
    • 高电平:请求数据
  • 1位应答位(ACK) – 从机如果成功接收到主机所发送的数据,从机发送一个应答位到总线上
    • 只有SCL低电平时SDA可以变化,SCL高电平时SDA需要保持(方便数据接收方进行读取操作
    • 如果从机在总线上,它将以ACK字符应答(低态触发)该地址。主机收到应答后,根据它发送的读写比特,处于发送模式或者接收模式,从机则处于对应的相反模式(接收或发送)。

举例图片:

传输数据

如果主机想要读取从机数据,它将不断接收从机发送的一个个字节,在收到每个字节后发送ACK进行应答,除了接收到的最后一个字节。此时,主机处于主节点接收模式,从机处于从节点发送模式。

此后,主机不是发送停止比特终止传输,就是发送另一个起始比特以发起另一次传输(即“组合消息”)。

此时开始正式发送数据,发送过程大致具体如下图所示和寻址一样

  • 8比特数据位
  • 应答位 – 每发送一个8比特应答位后需要有一个应答位以确认
  • …重复…
  • 停止位 – SCL和SDA均拉高形成高电平,释放总线,总线再次处于空闲状态

举例图片:

SPI

简介

SPI(Serial Peripheral interface),中文叫做串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

  • 全双工通信
  • 通信简单 – 从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
  • 数据传输速率快
  • 没有应答机制确认是否接收到数据,可靠性有一定缺陷

设计

主-从模式

SPI协议同样使用了 主-从模式(Master-Slave) 的控制方式

规定两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave)。

  • 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备
  • Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备、
  • Slave 设备本身不能产生或控制 Clock
  • 没有 Clock 则 Slave 设备不能正常工作

传输数据

  • SPI 协议采用同步方式(Synchronous)传输数据
    • Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse组成了时钟信号(Clock Signal) 
    • 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输
  • SPI 协议的数据交换
    •  SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”
      • 在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备好还是从设备),相当于该设备有一个 bit 大小的数据被交换了
      • 因此SPI没有读和写的说法
    • 一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设备进行访问 (Access)。所以,Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上。
    • 在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。
      • 因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的(虽然发送后紧接着的读取是无意义的,但仍然需要从寄存器中读出来)

信号接口

SPI总线规定了4个保留逻辑信号接口,其中只有时钟线SCLK是必须的,其余的可以删减

  • SCLK(Serial Clock):时钟信号,由主机发出
    • 可能是时钟信号上升沿(从低到高)或下降沿(从高到低)
  • MOSI(Master Output, Slave Input):主机输出从机输入信号(数据由主机发出,主机给从机的发送指令和数据的通道)
  • MISO(Master Input, Slave Output):主机输入从机输出信号(数据由从机发出,主机读取从机的状态和数据的通道)
  • SS(Slave Select):片选信号,由主机发出,一般是低电位有效

SPI的四种模式

CPOL-时钟极性选择

  • 0表示 – 空闲时总线上为低电平
  • 1表示 – 空闲时总线上为低电平

CPHA-时钟相位选择

  • 0表示 – SCK在第一个(奇数个)跳变采样,SCK在第二个(偶数个)个跳变发送
  • 1表示 – SCK在第二个(偶数个)个跳变采样,SCK在第三个(奇数个)个跳变发送

四种模式

于是其两两互组,便有了如下4种模式,但是其原理大致相同

通讯过程

片选

同I²C协议一样,因为有多个从机,所以需要选择一个与之通讯

选择方式:将对应从机的SS由高电平拉低到低电平

数据传输

  • 空闲时刻为高电平,SCLK出现下降沿时,进行数据输出
  • SCLK出现上升沿时,进行数据采样(数据采样详情:数据交换
  • 重复

CAN协议

简介

CAN(Controller Area Network)中文是:控制器局域网总线,罗伯特·博世公司于1983年开发了控制器局域网(CAN bus),一个CAN控制芯片,由英特尔飞利浦生产,并且于1987年发布,最早用于汽车之上。如今应用于:乘用车、卡车、公共汽车(汽油车及电动车),航空、航海电子仪器,工业自动化及机械控制,电梯、扶梯,建筑自动化,医疗仪器及设备。

CAN协议也是这里个里面最精妙最复杂的一个。

  • 全双工
  • 速度快
  • 容错强
  • 多主机

速率

  • ISO-11898 定义了通信速率为 125 kbps ~1Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米
  • ISO11519 定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米

设计

设计简介

CAN协议主要使用两个信号线

  • CAN_H(IGH)
  • CAN_L(OW)

连接方式

  • 所有节点通过两条线连接起来。两条线分别称为CAN_HCAN_L。如果要求不高,一般用带屏蔽的双绞线就可以了。
  • 网络的两端必须有120Ω的终端电阻。所以在设计线路板的时候都要有一个120欧的电阻。通过跳线或者拨码开关选择是否使用这个电阻。如果不存在电阻就无法产生电压差。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线

CAN外设的结构

邮箱

同一个设备共用一个邮箱,同一个芯片的CAN有3个发送邮箱,2个接收邮箱

大家可能也有这样的疑问:为什么有3个发送邮箱2个接收邮箱,数量不一致

”发送邮箱“是用于CAN总线数据发送的,总共有3个,并且存在优先级关系。优先级越高其数据会被优先发送。数据在发送前都会被送到优先级最高且空闲的发送邮箱,然后依次发送。
发送邮箱有3个,且每个邮箱只能装一个报文。

”接收邮箱“是用于CAN总线数据接收用的,在接收数据端会有一个过滤器处于”接收邮箱“的前面,过滤器使用于删选”标识符“的,只有标识符符合的报文才会被放入到”接收邮箱“当中。
接收邮箱只有2(FIFO0、FIFO1)个,但是每一个有三层,每层都可以存放一个报文,即每一个接收邮箱可以接收三个报文。但读取时只能读到最先收到的报文,等这个读完之后,才能读下一个报文。

筛选器

用于筛选通过的数据,比如不让id为001的通过等等

作用

邮箱和筛选器是节点处做的消息处理(每个节点都有个自己专用的),大致起到一个中间商的作用,要使用CAN的时候需要先对外设进行初始化,设置其筛选器,发送的数据也会经过这里

CAN总线上的电平信号

在CAN总线上传输数据是使用隐性电平(1)和显性电平(0)来完成的

性质逻辑CAN_HCAN_L两线电压差
隐性(Recessive)12.5V2.5V0V
显性(Dominant)03.5V1.5V2V
  • 隐性电平:CAN控制器发送逻辑1,CAN收发器使CAN_H和CAN_L都为2.5V,这时,两条线上的电压差为0V
  • 显性电平:CAN控制器发送逻辑0,CAN收发器使CAN_H为3.5V,CAN_L为1.5V,这时,两条线上的电压差为2V
  • 每一个节点都可以主动发送帧。多节点同时发送时,会有总线仲裁来确定优先级,从而决定发送先后顺序

总线仲裁

  • 可以想象,当总线上同时存在节点发送0(隐性)和1(显性)时,总线上则会表现为显性信号1,这也是显性的来源,可以覆盖掉隐性信号
    • 0 0 0
    • 0 0 1
    • 0 1 0 比如这里若同时发送,下面两个就会因为有1而被0覆盖掉,从而使第一个优先级最高
  • 每个CAN device可以发送多条不同的ID报文。每一个总线节点的CAN控制器中都有一个东西叫过滤器,通过设置相关寄存器能够配置它,设置好之后,CAN控制器会根据你的设置,自动去判断要不要接收报文
  • 仲裁规则:
    • 在总线空闲时,最先开始发送的节点获得发送权,一旦开始发送,不会被其他节点抢占
    • 多个节点同时开始发送时,各发送节点从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的节点可继续发送。(显性优先)
    • 具有相同ID的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权可继续发送
    • 标准格式ID与具有相同ID的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的RTR 位为显性位的具有优先权可继续发送。

CAN帧的种类

帧的种类有很多,其中错误帧过载帧帧间隔都是由硬件完成的,没有办法用软件来控制。对于一般使用者来说,只需要掌握数据帧遥控帧。数据帧和遥控帧有标准格式扩展格式。标准格式有11位标识符,扩展格式有29位标识符。

通讯过程

数据帧

下方为数据帧的扩展形式
  1. 帧起始 – 表示帧的开始,产生一个bit的显性电平
  2. 仲裁段 – 表示帧的优先级, 由标识符(ID)和传送帧类型(RTR)组成。
    • 标准格式的标识符长度的是11位,紧随其后的是RTR位,用于表明此帧是数据帧还是远程帧。IDE位用于表明此帧是标准帧还是扩展帧。
    • 扩展格式的标识符长度的是29位,紧随其后的是RTR位,用于表明此帧是数 据帧还是远程帧。IDE位用于表明此帧是标准帧还是扩展帧。
  3. 控制端 – 表示将要发送数据的字节数,由6个bit构成
    • 保留位(r0、r1) 必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。
    • 数据长度码(DLC) 与数据的字节数的对应关系下表所示。数据的字节数必须为 0~8字节。但接收方对 DLC=9~15的情况并不视为错误。
  4. 数据段 – 数据的具体内容,可发送0~8 个字节的数据。CAN控制器有对应的寄存器,只需要把数据直接填进去就可以了。
  5. CRC段 – 用于校验传输是否正确。
  6. ACK段 – 表示确认是否正常接收。
  7. 帧结束 – 表示此帧结束。

参考资料

https://www.bilibili.com/video/BV1UG411L7pH

I²C

https://www.cnblogs.com/aaronLinux/p/6218660.html

https://zh.wikipedia.org/wiki/I%C2%B2C

ISP

https://zhuanlan.zhihu.com/p/150121520

https://zhuanlan.zhihu.com/p/290620901

https://www.bilibili.com/video/BV1354y1R7nB

CAN

https://blog.csdn.net/weixin_44793491/article/details/107298426

https://www.bilibili.com/video/BV1Dq4y1J7WA

感谢一位实验室大四学长的精彩讲解
感谢一位实验室大四学长的精彩讲解

评论

  1. wlli
    Windows Edge
    5 月前
    2023-11-27 14:35:44

    学习了

  2. 购买
    Windows Chrome
    1 年前
    2023-2-07 21:02:47

    测试

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇