1.基本知识

  • 串行与并行
    串行: 一根线 数据一位一位的发送
    并行: 多个线 数据多个位一次传输过去
  • 异步与同步
    看有没有时钟线 有时钟线说明是根据时钟信号同步的 否则就是各玩各的
  • 全双工与半双工
    数据能不能边收边发

2.SPI

  • 简介
    SPI是 串行 同步 全双工
    一共有四条线 SCL MISO MOSI NSS

  • SPI的四种模式

    • CPOL
      CPOL = 0: 时钟空闲时为低电平
      CPOL = 1: 时钟空闲时为高电平
    • CPHA : 表示采样时刻
      CPHA = 0 表示在时钟的第一个跳变沿采样
      CPHA = 1 表示在时钟的第二个跳变沿采样
      在这里插入图片描述
  • 通信过程
    SPI是边发送边接受的 发送一个字节就会接受一个字节
    同时SPI是没有什么起始/终止/校验的 字节流一个个的发送
    在这里插入图片描述

  • 三线SPI
    根据实际需求 只保留 MISO 或者 MOSI

  • 可能遇见的问题

    • 主机和丛机的CPOL 和 CPHA设置要完全一致
    • 四种模式的选择
    • SCK过大 可能丛机内边顶不住了 接收就开始出现问题了
    • SPI先发的是高有效位

3.I2C与SMBUS

  • 简介
    I2C是 串行 同步 半双工 通信 两根线 SCL 和 SDA

  • 为什么是开漏输出

    • I2C支持多个设备在同一条主线上,在不使用开漏不使用推挽输出的前提下,一个输出高 一个输出低可能就短路了;但是开漏不一样 开漏无法输出高 在高阻态的时候你可以看做它根本没连到这个I2C主线上
    • 为了实现线与的逻辑: 假设现在I2C总线已经有人在用了 又有一个设备想用了 结果发现SDA已经被拉低了,那此时这个新来的就用不了–"仲裁"机制
  • 为什么要加上拉电阻
    如果选择了开漏输出但是不加上拉电阻 那对于 SCL 和 SDA两个总线在空闲时的电平状态是不确定的 所以需要上拉电阻
    在这里插入图片描述

  • 通信过程

    • 主机与丛机
      主机可以控制 SCL和SDA两条线 丛机只能控制SDA并且只能被动的接受
      主机和丛机都会有一个地址

    • 起始信号
      在SCL为高电平时 SDA由高变低

    • 停止信号
      在SCL为高电平时 SDA由低变高

    • 正常数据
      在SCL为高电平时 要保持不变 在SCL为低的时候才准备下一位

    • 写流程

      • 主机发送起始信号 SDA被拉低
      • 发送一个字节的数据 前7bit为地址 后1bit表示读/写(0表示写),此时主机放开SDA线 SDA恢复高电平
      • 丛机应答 SDA被丛机拉低(一个脉冲周期内得做出回应)
      • 主机知道丛机存在 开始发送一个字节数据,丛机在SCL为高的时候读取SDA的电平状态(主机在第9个脉冲放开SDA线的控制)
      • 丛机应答, SDA被丛机拉低
      • 主机发送停止信号 此时主机丛机都恢复高阻态 SDA变回高
        在这里插入图片描述
    • 读流程

      • 主机发送起始信号 SDA被拉低
      • 发送一个字节的数据 前7bit为地址 后1bit表示读/写(0表示写),此时主机放开SDA线 SDA恢复高电平
      • 丛机应答 SDA被丛机拉低(一个脉冲周期内得做出回应)
      • 丛机发送一个字节的数据,此时主机在SCL为高的时候读取SDA电平的状态
      • 主机应答
      • 主机发送停止信号 此时主机丛机都恢复高阻态 SDA变回高
        在这里插入图片描述
  • SMBUS
    SMBUS是I2C的子集
    可以参考
    https://blog.csdn.net/caiji0169/article/details/142892183

4.UART

  • uart–串行(对于一个字节只能一位一位发送)异步(没有时钟线)全双工(可以边收边发)通信

  • 两根线 TX 和 RX线

  • 通信帧格式:
    起始位/数据位/校验位/停止位 4项 其中校验位不是必须的
    在这里插入图片描述

  • 波特率计算
    单位是 bit/s
    比如115200 说明传输1bit需要1/115200 s
    所以完成一次传输的最少时间 (1 + 8 + 1) / 115200 s(因为起始位和停止位不能省略)

  • 通信过程
    起始位:通过拉高拉低电平告诉接收方准备接收
    停止位:告诉对面发完了
    校验位:可选
    数据位:需要发送的数据
    而波特率就决定了 比如接收方在开始之后 每间隔多久就去采样一次电平

  • 可能遇见的问题

    • 双方对于高/低电平的定义不同所以不能直接相连
    • 串口先发的是低位

IIC 和 SPI、串口区别

  • 相同:
    • 均采用同步,串行
    • 均采用 TTL 电平
    • 均采用主从方式
  • 异:
    • IIC 为半双工,SPI和UART为全双工
    • IIC 有应答机制,SPI 无
    • IIC 的时钟和极性是固定的(空闲时高电平,SCL 为高电平时读取数据),SPI 是可以变化设置的
    • 寻址方式不同,IIC 是发送一个字节去寻址,SPI 通过片选位选择
    • IIC和SPI都是先发高位 UART是先发低位

5.CAN

这个没用过,参考着整理一下
https://blog.csdn.net/fish_study_csdn/article/details/131113850
https://blog.csdn.net/qq_35057766/article/details/135580884

6.PCI总线

  • PCI总线是同步并行半双工(半双工是在特定时刻 要么是主设备->从设备,要么是从设备->主设备,不能同时进行)PCIE是同步串行全双工
  • 同一时刻,一个设备只能处于Master或Slave状态,不能同时执行双重角色
  • PCI总线由三部分组成: PCI总线 + PCI桥 + PCI设备
  • PCI桥式连接PCI总线之间的纽带 所以整个PCI总线是树状的结构
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐