这里仅总结一下IO控制相关及这种总线等  ~持续更新 第10部的啊  

一、单片机IO配置不同速度的区别

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚

很早之前年的单片机可能没有输出速度这个配置选项,但是这后面的单片机基本都有配置速度的选项,下面结合STM32来简单介绍一下。

GPIO输出速度

不管标准外设库,还是STM32CubeMX配置GPIO输出引脚,都会有速度GPIO_InitStruct.Speed这个选项。

类似如下:

GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

根据不同MCU型号,速度选项,有些有3个,有些有4个。一般定义在xxx_gpio.h文件中。

#define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */
#define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
#define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */

#define  GPIO_SPEED_FREQ_LOW        (0x00000000u)  /*!< Low speed       */
#define  GPIO_SPEED_FREQ_MEDIUM     (0x00000001u)  /*!< Medium speed    */
#define  GPIO_SPEED_FREQ_HIGH       (0x00000002u)  /*!< High speed      */
#define  GPIO_SPEED_FREQ_VERY_HIGH  (0x00000003u)  /*!< Very high speed */
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

对于普通输出GPIO,使用STM32CubeMX配置,默认配置低:

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_02

当然,如果配置成其他模式,有可能是中,或高。

比如:配置UART、CAN引脚,速度会是高。

提问:你想过为什么会是低、高吗?

测量GPIO输出波形

不知道大家用示波器测量过GPIO输出波形没有,特别是在高速(单位M)的时候。

我以前经常测量MCO引脚输出时钟,测量过的人应该都知道,如果输出速度高于配置速度,会明显看到波形不正常。

波形会出现不完整,幅度低等失真现象。

相信不用我说,有一定常识的人都能理解。

差异原因

速度的配置,就是决定IO口驱动电路的响应速度。

我们需要结合实际情况配置速度,不同速度会有不同的影响

高低速差异:

配置高速:输出频率高,噪音大,功耗高,电磁干扰强; 

配置低速:输出频率低,噪音小,功耗低,电磁干扰弱;提高系统EMI(电磁干扰)性能;
看到差异,相信很多人就能理解了。

实际情况中,比如:低功耗的产品,你会考虑功耗。

环境不好的场合,通信不稳定,你会考虑电磁干扰等。

举例:

如果你使用9600波特率UART通信,建议速度配置为低。

所以,如果你想使产品更加完美,速度配置也是关键的一项。

二、能替代模拟输入的通讯总线--SENT总线

SENT (Single Edge Nibble Transmission) 是由 SAE 推出的一种汽车传感器与 ECU 通信的新标准 (SAE J2716) ,该通讯协议比较简单,节省硬件成本,是 Analog input 的替代品。

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_03

但是SENT有一定的局限性,其通讯是单向的,不能实现双向传输,与之相比CAN、LIN作为双向通讯在汽车上有着更广阔的应用。

SENT通讯的输出波形是一系列的方波信号,通过两个下降沿之间的时间间隔来传递信号。下图为SENT通讯的实采波形。

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_04

#1#、SENT 总线的特征和优势

  • SENT 总线是一种数字信号传输协议,与模拟量相比具有更高的传输精度和速度。
  • SENT 总线是单线传输数据,减少信号线,降低成本,加上电源和地线,总共 3 线。
  • SENT 总线与模拟量相比具有更强大的诊断功能。
  • SENT 总线的逻辑电平为 4.75V – 5.25V。
  • SENT 总线单向传输协议,数据只能从传感器到 ECU,传输是连续的,不需要请求命令。
  • SENT 总线由帧来传输数据,或者数据包的形式,每一帧由不同宽度的脉冲即半字节组成。
  • SENT 总线数据的传输可以分为快速通道和慢速通道,重要的信号用快速通道以实现高频率的更新,比如压力等,对于非关键的信号,如诊断等可以放在慢速通道传输。
  • SENT 总线快速通道是每一帧传输一个完整的信号,慢速通道需要多帧来传输一个完整的信号。

#2#、SENT 总线的硬件连接

SENT 总线常用于传感器信号,其基本引脚连接如下:

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_嵌入式硬件_05

其高低信号的电平要求:0~0.5V 为逻辑电平 0,4.1~5V 为逻辑电平1。 

#3#、SENT 总线的协议

SENT 总线协议的数据使用半个字节 Nibble,即 4bit 来进行编码定义的,一个半字节Nibble 是通过 2 个下降沿之间的时间差来定义的。如下是一个 Nibble 的电压逻辑信号:

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_数据_06

时间精度以 1 个节拍 Tick 来定义(一般 1 个 Tick 的时间是 3~10us),每一个 Nibble 从一个下降沿开始,并且之后在逻辑0 状态至少维持 4Ticks,之后下一个下降沿距离第一个下降沿的时间差作为 Nibble 值的编码依据。需要注意的是,后一个下降沿距离第一个下降沿至少相隔 12Ticks,至多 27Ticks,且相隔 Tick 数减去 12 即为最终的 Nibble 值,如此 Nibble 值最小为 0,最大为 15(27Tick-12Tick),二进制表示时即为 4bit。

#4#、SENT 总线的帧结构

SENT 总线协议以 Nibble 为基础单元进行编码,一个完整的 SENT 数据帧结构如下所示:

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_07

SENT 总线的帧结构基本组成:

  • Sync 同步脉冲,固定的 56Ticks
  • Status/Com 状态及通讯字段,12~27Ticks,即 1 个 Nibble(4bit)
  • Data 数据段,12~162Ticks,即     1~6 个     Nibble
  • CRC 校验字段,12~27Ticks,即 1 个 Nibble
  • Pause 暂停脉冲     12~768Ticks,早期的 SENT 协议无此字段或者一个固定长度 Ticks,SENT2010 之后,部分通过此功能可以动态条件 TICKS 的个数,实现整个 SENT 协议是同一个固定长度 TICKS

#5#、SENT 总线的高级功能

以上是 SENT 总线协议中一帧报文的基本定义即功能,SENT 总线协议的高级功能是将多帧报文组合以实现更高复杂的通信功能,一般用于传输传感器的附加信号,比如温度,故障码和传感器类型信息等。SENT 总线协议提供如下 2 种多帧组合报文功能。

1.Short Serial Message

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_08

SENT 总线的慢速通道

当 Status/Com 字段的 bit3 值为 1,其之后的 15 帧 SENT 报文的 Status/Com 字段的 bit3 值都为 0 时,即为此种情况,此情况下是 16 帧 SENT 报文组合来传输附加信息。

Status/Com 字段的 bit3 值用来辨别以何种形式组合,而这 16 帧 SENT 报文的 Status/Com 字段的 bit2 值组合起来的 16bit 的值即为组合传输的信息,其由 4-bit 的 Message ID,8-bit 的 Data 和 4-bit 的 CRC 组成。

2.Enhanced Serial Message

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_09

SENT 总线的快速通道

与上一种情况不同的是,此情况下使用18 帧 SENT 报文组合来传输附加信息,起始标志是 Status/Com 字段 bit3 连续为 1111110,并且要求 Status/Com 字段 bit3 组合的第 13 和第 18 位都为 0

而数据域依然由 18 帧 SENT 报文的 Status/Com 字段的 bit2 值组合而成,但其数据组成又根据Status/Com 字段 bit3 组合的第 8 位的不同分为 2 种情况:

(1)Status/Com 字段 bit3 组合的第 8 位为 0:

Status/Com 字段 bit3 组合的 9~12bit 和 14~17bit 分别作为 8bit ID 的高 4 位和低 4 位数据,而 Status/Com 字段 bit2 组合的 1~6bit 是 6bit 的 CRC 数据,之后的 7~18bit 则为要传输的 12bit 的数据。

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_10

SENT 总线的快速通道细节

(2)Status/Com 字段 bit3 组合的第 8 位为 1:

Status/Com 字段 bit3 组合的 9~12bit 为 4bit ID,而 Status/Com 字段 bit2 组合的 1~6bit 是 6bit 的 CRC 数据,之后的 7~18bit 和 bit3 组合的 14~17bit 则组合为要传输的 16bit 的数据。

三、SPI协议及其在嵌入式中的应用

SPI在嵌入式系统中非常普遍,无论是芯片上的系统处理器(如ARM、MIC或Power PC等高端32位处理器),还是微控制器(如AVR、PIC等),通常包括能够以主从模式运行的SPI控制器。

    系统内可编程AVR控制器,可以使用SPI接口编程;基于芯片或FPGA的设计,有时使用SPI进行通信。当我们想要与外围设备快速传输数据,并对实时性有要求时,SPI是目前常用的一种技术。

    除SPI外,有许多串行接口,如Morse电报、RS232、 USB、火线、以太网等,对于许多设计来说,每个串行接口都有其优缺点,如何选择取决于所需的数据速率、空间可用性和噪声考虑等因素。

    SPI即串行外围接口,用来取代并行接口,这样设计时就不必绕着PCB布线并行总线了。它提供设备之间的高速数据传输,摩托罗拉是第一家将SPI命名为电路技术的公司。该技术应用于上世纪70年代末的首个基于68000的MCU,用于连接周边设备,后来被业内其他公司采用。接口的简单性和速度,使通信或传输数据变得容易,并使其成为流行的通信协议。

    SPI是一个简单的4线串行通信接口,使控制器和外设之间能够相互通信。在SPI中,数据每个时钟周期1 bit速率输入/输出,数据在主设备和一个或多个从设备之间短距离、高速传输。它基于一个8位移位寄存器将数据移出到一个输出引脚,并从另一个输入引脚将数据移入。

    SPI的另一个特性是,它没有传输总线所有权的概念,即改变主节点,也没有从节点地址。SPI是一种更简单的协议,因此工作频率可以高于10MHz(比TWI的频率高)。

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_嵌入式硬件_11

SPI得到广泛使用的一些特性是:

  • 全双工通信;
  • 吞吐量高于TWI;
  • 传输时不限于8位字;
  • 简单的硬件接口;
  • 可随意选择消息大小、内容和目的;
  • 通常符合低功耗要求;
  • 从机使用主机产生的时钟,不需要精确的振荡器;
  • 由于电路较少,功耗要求比TWI低。 

    然而,将TWI串行接口与SPI进行比较是不公平的。它们有各自的应用领域,这取决于系统的需求。

    TWI有如下特性:

  • IC封装上的引脚数比SPI少;
  • 存在硬件流控制;
  • 它有一个正式的标准,不像SPI;
  • 它在通信之前给出从机地址。 

    为什么SPI在PCB下应用最多? 

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_数据_12

尽管SPI主要是为主机处理器和外设之间的通信而开发的,但是通过SPI连接两个处理器也是可能的。SPI总线通常只用在PCB上;在PCB领域之外使用SPI有很多阻碍。

    首先,SPI被设计用来在不同的IC芯片之间以非常高的速度传输数据;由于高速要求,总线的长度不能太长,否则会因为电抗增加而无法使用。

    当然,在PCB外使用低速SPI是有可能的,但这不是很实际。外围设备可以是实时时钟、转换器(如ADC和DAC)、内存模块(如EEPROM和FLASH)、传感器(如温度传感器和压力传感器)或其他设备(如信号混频器、电位器、LCD控制器、UART、can控制器、USB控制器和放大器)。 

SPI协议

    SPI协议包括以下4条信号线:

  • MOSI (Master Out Slave In)

    MOSI信号由Master产生,接收端是Slave;

  • MISO(Master In Slave Out)

    Slave产生MISO信号,接收方为Master;

  • SCLK/SCK

    SCLK由master产生,用于在master和slave之间同步数据传输;

  • SS/CS

    SS信号由master产生,用于选择单个slave。

    有时串行数据输入[SDI]被用于MOSI,串行数据输出[SDO]用于MISO。

 

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_13

   一个主控制器可以与多个SPI外设通信,一般有两种设置方法:

  • 级联slave配置;
  • 并行slave配置。

级联slave配置

    级联slave是将所有的时钟线(SCLK)和片选(CS)连接在一起。数据通过微控制器传输到每个外设,最后再返回到微控制器。前一个slave的数据输出连接到下一个slave的数据输入,从而形成一个更宽的移位寄存器。因此,级联slave被视为一个更大的设备,他们连接相同的芯片选择信号。

    这意味着,master只需要产生一条SS线,而不用为每个slave都产生一条单独的SS线。

 

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_嵌入式硬件_14

并行slave配置

    这是典型的SPI总线配置,包含一个master和多个slave。在这个独立或并行的从属配置中:

  • 所有时钟线(SCLK)都连接在一起;
  • 所有MISO数据线都连接在一起;
  • 所有MOSI数据线都连接在一起。

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_字段_15

SPI通信

    SPI通信一直是由master发起的。首先master产生时钟,时钟频率小于或等于slave支持的最大频率;随后master通过产生时钟信号(SCLK)来控制数据传输,并通过将特定slave的芯片选择(SS)线拉低来进行通信。总线上的slave如果没有被master选中,将会忽略来自主机的输入时钟和MOSI信号,并且绝对不能驱动MISO;这意味着master每次只选择一个slave。

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_字段_16

四个引脚的使用取决于设备。例如,某些设备不需要输入(例如ADC), SDI引脚可能不存在,或者有些设备不需要输出(例如LCD控制器),SDO引脚可能不存在。如果一个微控制器只需要与1个SPI外设通信,那么该slave上的CS引脚可以接地(CS低电平有效)。对于多个从设备,每个从设备都需要一个独立的CS信号。 

SPI中三态输出的意义是什么?

    在数字电子学中,三态逻辑允许输出端口除了0和1逻辑电平外,还采用高阻抗状态。这允许多个电路共享一个输出线,大多数外设都有三态输出,当设备未被选中时,输出会进入高阻抗状态(断开)。没有三态输出的设备不能与其他设备共享SPI总线。

    SPI设备有时使用另一条信号线向主机CPU发送中断信号。使用中断信号例子有温度传感器的温度警报,实时时钟芯片发出的警报,以及手机声音编解码器监测到的耳机插孔插入等。 

时钟极性和相位

    另一对参数称为时钟极性(CPOL)和时钟相位(CPHA)决定了数据驱动和采样的时钟信号的边缘。除了设置时钟频率,master还必须配置时钟极性(CPOL)和相位(CPHA)。由于时钟作为数据通信的同步,在这个CPOL和CPHA的基础上,有四种可能的模式可以在SPI协议中使用。

嵌入式分享~IO相关10一、单片机IO配置不同速度的区别_引脚_17

SPI应用

    全双工能力使得SPI对于主/从应用场景下十分高效,通过全双工模式可以为数字音频、数字信号处理等应用实现高效、快速的数据流。

    SPI用于与各种外设通信,例如:

  • 传感器
    温度,压力,ADC,触摸屏,视频游戏控制器;
  • 控制设备
    音频编解码、数字电位器、DAC;
  • 相机镜头
    佳能EF镜头支架;
  • 通讯
    以太网,USB, USART,CAN手持视频游戏;
  • 存储器
    Flash和EEPROM;
  • 实时时钟;
  • LCD,有时甚至用于管理图像数据;
  • 任何MMC或SD卡(包括SDIO变体);
  • 对于高性能系统,FPGA有时使用SPI作为主机的从机接口,使用SPI作为传感器的主机接口,或者用于flash memory的导入接口。