AI SoC入门-7低速外设

原创 thatway1989 那路谈OS与SoC嵌入式软件 2024-10-29 21:19


上篇讲了核心的第一个子系统:
AI SoC入门-6CPU子系统
,对于其可以访问的低速外设本篇进行汇总说明下。

这些低速外设在SoC里面就是一个个IP,对于驱动程序员除了了解IP的寄存器和管脚,还需要了解这个IP的系统框图和应用场景。从IP对外的引脚上和内部原理上分析,才能更加通彻的掌握和运用,例如reset和clock以及一些控制引脚

本文找了一些外设IP的例子,粗略的介绍下。因为这些外设基本遵循相同的协议,从设计上也是大同小异,寄存器的设置上也出入不大,都可以借鉴学习。本文介绍的低速通信接口主要由
I2C、UART、SPI、QSPI、PGIO、PWM、DMA等。

1. I2C

这里找了一个I2C的IP开源设计,参考:

https://forum.digikey.com/t/i2c-master-vhdl/12797

上图显示了集成到系统中的 I2C 主设备的典型示例,I2C 主设备的端口如下:

I2C 总线是一种双线半双工数据链路,由飞利浦(现为 NXP)发明和指定。I2C 总线的两条线SDA 和 SCL 是双向和开漏的,有电阻上拉。SCL 是串行时钟线,SDA 是串行数据线。总线上的设备将一条线拉至地以发送逻辑零,释放一条线(使其悬空)以发送逻辑一。

  • SCL是时钟信号,从主设备发出;

  • SDA是数据信号,是一个双向的设备。设备发送数据和接收数据都是通过SDA信号。

一个总线连接多个I2C设备,如上图。上图中的SDA和SCL这两根线必须要接上一个上拉电阻。其余的I2C从器件都挂接到SDA和SCL这两根线上,这样就可以通过SDA和SCL这两根线来访问多个I2C设备了。每个设备需要有唯一的I2C地址

I2C最重要的功能包括:

  • 只需要两条总线

  • 没有严格的波特率要求,例如使用RS232,主设备生成总线时钟;

  • 所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;

  • I²C是真正的多主设备总线,可提供仲裁和冲突检测

  • 传输速度:

  • 标准模式:Standard Mode = 100 Kbps

  • 快速模式:Fast Mode = 400 Kbps

  • 高速模式:High speed mode = 3.4 Mbps

  • 超快速模式:Ultra fast mode = 5 Mbps

  • 最大主设备数:无限制;

  • 最大从机数:理论上是127;

软件报文格式如上。 写**寄存器**的标准流程为:

  1. Master发起START

  2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK

  3. Slave发送ACK

  4. Master发送reg addr(8bit),等待ACK

  5. Slave发送ACK

  6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK

  7. Slave发送ACK

  8. 第6步和第7步可以重复多次,即顺序写多个寄存器

  9. Master发起STOP

读**寄存器**的标准流程为:

  1. Master发送I2C addr(7bit)和w操作1(1bit),等待ACK

  2. Slave发送ACK

  3. Master发送reg addr(8bit),等待ACK

  4. Slave发送ACK

  5. Master发起START

  6. Master发送I2C addr(7bit)和r操作1(1bit),等待ACK

  7. Slave发送ACK

  8. Slave发送data(8bit),即寄存器里的值

  9. Master发送ACK

  10. 第8步和第9步可以重复多次,即顺序读多个寄存器

2. UART

这里使用ARM的UART IP:PL011进行说明,参考:

https://developer.arm.com/documentation/ddi0183/g/?lang=en


管脚解释

UART:universal asynchronous receiver and transmitter通用异步收发器,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。UART主要功能为 :

  • 串并转换:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。

  • 启停、校验:

在输出的串行数据 流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。

  • 缓冲:   

有一些比较高档的UART还提供输入输出数据的缓冲区,现在比较新的UART 是16550,它可以在计算机需要处理数据前在其缓冲区内存储16字节数据。

  • DMA支持:当UART处于FIFO启用模式时,数据传输可以通过单次或突发传输进行,这取决于编程的水印级别和FIFO中的数据量。表2-4列出了传输和接收fifo的触发点。

寄存器:

软件上需要注意:

  • 一般uart驱动跟命令行一块使用,需要用到中断来捕捉输入。

  • 串口频率一般跟模块整体频率绑定,如果系统频率因为省电变化,需要重新设置。

  • 由于调试需要,串口一般初始化比较早

3. PGIO

AXI GPIO IP 旨在为 AXI-Lite 接口提供通用输入/输出接口(GPIO),并且可以将设备配置为单通道或双通道,每个通道的宽度是可以独立配置。

GPIOx_DATA

GPIO**数据寄存器的作用有两个,当GPIO被配置为输入端口时,用于读取输入值;当GPIO被配置为输出端口**时,将要输出的值写入该寄存器。此外,当GPIO被配置为输入端口时,向该寄存器写数据是无效的。GPIO数据寄存器的描述如下表。

GPIOx_TRI

GPIO 3态控制寄存器可以动态地配置端口为输入或者输出。当某一个比特位被配置为1,则相应的端口就会被配置为输入端口;当某一比特位被配置为0,则相应的端口被设置为输出端口。GPIO 3态控制寄存器的描述如下。

Interrupts

在介绍与中断相关的寄存器之前,先介绍一下GPIO的中断。在中断使能的情况下,任何输入通道的转换都会产生一个电平中断。GPIO接口模块中包含了中断检测逻辑,该逻辑可以识别任何输入通道的转换。当一个转换被检测到,它将被告知给中断控制模块。为了支持通道的中断能力,中断控制模块中实现了以下的寄存器。全局中断使能寄存器(GIER)-使能或不使能中断输出,这些中断输出到processor或者interrupt controller。

IP中断使能寄存器(IPIER)-为每一个通道配置独立的中断使能位。IP中断状态寄存器(IPISR)-为每一个通道配置独立的中断状态位。为了测试,IP ISR也可以手动设置产生一个中断。

软件上的使用注意:

  1. 明确GPIO硬件上连接的两端是什么,才能去使用

  2. 配置是输入还是输出

  3. 配置输入的中断处理

参考:

  1. https://anlogic.oss-cn-shanghai.aliyuncs.com/web_doc/IP和参考设计/IP/通用接口/IPUG171_AXI_GPIO用户手册.pdf

  2. https://blog.csdn.net/qq_37816919/article/details/128163458

4. SPI

SPI,即串行外设接口(Serial Peripheral Interface)是一种同步串行通信协议,适用于短距离通信。该协议自 Motorola 公司于 20 世纪 80 年代提出至今,已经广泛应用在嵌入式系统当中,成为许多传感器,ADC,DAC,存储器以及控制器件的通信接口。值得注意的是,SPI 是一种约定俗称的协议, 并无正式的协议标准,造成该协议的形式多样,不同的器件厂商也会定义自己的协议版本。安路的 SPI IP 核具有极高的灵活性,用户可通过配置 SPI IP 核的主/从类型,时钟极性,时钟相位,数据宽度, 数据传输顺序,从设备数量以及部分接收阈值等,使 SPI IP 核兼容市场上常见的 SPI 接口。

SPI (Serial Protocol Interface,串行外围设备接口)是一种同步,高速、全双工、同步通信的总线,以主从方式工作,其逻辑结构如****所示。SPI接口对数据的传输只需要四根线就能够实现,节约了芯片的管脚,同时为节省PCB布局空间提供了方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。其中

  1. SCLK (Serial Clock):串行通讯同步时钟信号,他的作用是主设备向从设备发送时钟信号,控制他们两者之间数据传输的时机和速率;

  2. MOSI (Master Out Slave In):在SPI Master上也被称作发送通道TX_channel,控制SPI主机发送数据给SPI从机;

  3. MISO (Master In Slave Out):在SPI Master上也被称为接收通道RX_channel,控制SPI主机接收SPI从机传送过来的数据;

  4. SS/CS (Chip Select/Slave Select):串行通讯设备选择引脚,由SPI主设备Master选择与哪一个SPI从设备Slave之间进行通信,低电平表示从机被选中(低电平有效)。在实际运行中,主设备Mater作为主控方,是对数据发送和接收应答请求的发起方,它可以通过时钟和数据线,来保证数据在主设备、从设备两者之间的全双工通信 。

SPI总线控制器能够与各种外设通信,如存储器、温度传感器、压力传感器、模拟转换器、实时时钟、任何支持串行模式的SD卡。SPI控制器可以工作在主机模式、从机模式、舵主模式。Zynq-7000系列包括2个SPI控制器。

  • 主机模式:控制器驱动串行时钟(源自PS时钟系统)和从机选择信号。控制器有3个从机选择信号(Slave Select,简称SS),并且可以在外部扩展。控制器通过向32位的读/写数据端口寄存器写入字节,实现读取或写入从机设备。

  • 从机模式:控制器接收来自外部设备的串行时钟,并使用SPI_Ref_Clk来同步数据捕获。从机模式包括一个可编程的启动检测机制,当SS信号有效时使能控制器。

  • 多主模式:当控制器处于无效状态时,其输出信号是三态的;当控制器使能时,可以检测连接错误。通过复位SPI使能位,控制器输出将立刻转换为三态。

SPI I/O接口和软件之间有读、写FIFO,作为缓存。主机、从机I/O模式下都可使用FIFO。

控制器特性:每个SPI控制器可以独立配置,包括如下特性:

  • 四线式总线:MOSI(主机输出-从机输入)、MISO(主机输入-从机输出)、SCLK、SS,主机模式下有3个从机选择信号;

  • 全双工工作,支持同时接收和发送;

  • 通过APB从接口的32位可编程寄存器;

  • 将读/写数据映射到Rx/Tx FIFO,以字节为单位;

  • 主机模式下,可选择手动或自动启动数据传输、手动或自动从机选择模式、从机选择信号可以直接与从机设备连接,也可以在外部做扩展(比如3-8译码器)、可编程的SS和MOSI延迟;

  • 从机模式下,可编程的启动检测模式;

  • 当SPI的I/O信号由MIO引脚引出时,SCLK为50MHz;由EMIO接口引出到PL管脚时,SCLK为25MHz;

  • 可编程的时钟相位和极性;

  • 可选择中断驱动或轮询状态。

主控制器模式端口配置:

SPI 端口包含 2 条数据信号线 MISO 和 MOSI,1 条同步时钟信号线 SCLK 以及 1 条或多条从设备片选 信号线:

  • MOSI(Master Output Slave Input) – 主设备输出/从设备输入信号;

  • MISO(Master Input Slave Output) – 主设备输入/从设备输出信号;

  • SCLK(Serial Clock) – 串行时钟信号,由主设备产生,用来同步数据比特;

  • SS(Slave Select)/CS(Chip Select) – 从设备片选信号,低电平有效,由主设备控制;

SPI 协议中有时钟极性(CPOL)和时钟相位(CPHA)两个参数,通过对这两个参数的设置可以产生 4 种 时序模式:

  • CPOL(Clock Polarity)—可被设置为 0 或 1。当 CPOL=0 时,SCLK 在空闲状态下为低电平。当 CPOL=1 时,SCLK 在空闲状态下为高电平。UART IP USER GUIDE IPUG108 v1.0 www.anlogic.com 2 2021.7

  • CPHA(Clock Phase):---可被设置为 0 或 1。当 CPHA=0 时,数据在 SCLK 的前沿被锁存,数据 在 SCLK 的后沿被更新。当 CPHA=1 时,数据在 SCLK 的后沿被锁存,数据在 SCLK 的前沿被更新。

目前SPI数据通信最常见的实现方式可以分为三类:
直接无缓冲区通信、带FIFO缓冲区通信、以及结合DMA控制器通信。

  1. 首先是直接无缓冲区通信,每一次的通信只能实现最多4字节长度的数据传输,但由于部分需要发送的数据报文帧很长,不但增加了软件复杂度,而且同时面临抢占硬件资源的运作时间,从而大大降低了通信质量 1

  2. 第二种采用了具有FIFO (First in First Out)先进先出缓冲区的通信模式,有了FIFO缓冲,有效地解决了报文帧过长的难题,但由于FIFO缓冲通常与SPI系统模块绑定,而通信数据在被接受后,必须进行一次内存处理,对时间性能要求过高,这便让使用场合显得力不从心;

  3. 第三种采用SPI + DMA的方法,数据的交互传输在传统方式中是通过CPU来控制完成的,其原理是CPU执行一系列外设发来的指令代码,先将原设备数据信息写入CPU内存中,再把内存中的数据信息写入目标设备,适用于数据量较少的情况。而数据量大的时候,其传输的效率会被CPU处理指令代码的速度和CPU与外设交互所影响,传统的数据交互传输方式不再能够适应这一情况。DMA的出现解决了CPU在处理大量数据搬移过程中时间耗费成本高、速率慢的问题,利用DMA控制器的目的就是在释放较小的处理器的同时,也可以使DMA控制器以更高效的方式对存储器进行处理,既能解决对CPU持续的占用,又能解决内存的搬运问题。

SPI和DMA一起使用:

整个设计主要被分为两个部分来实现:

  1. 第一部分根据SPI的相关协议并结合项目需求,提取SPI功能特性设计出SPI功能框架,依照该功能框架对SPI接口设计进行模块划分,确定设计规格,利用SPI_master接口和APB_slave接口来实现数据的读写;

  2. 第二部分是通过加入DMA控制器和AXI接口来实现数据的读写,加入DMA之后,一方面可以在芯片启动阶段,通过硬件加速器提供SPI高速接口,加速芯片系统启动,在芯片工作阶段,通过硬件加速器提供通用读写SPI高速接口,另一方面在数据搬移的时候,采用突发传输,增加数据吞吐量,加速系统对数据搬移的性能,同时降低CPU的负荷。

参考:

  1. https://www.latticesemi.com/products/designsoftwareandip/intellectualproperty/ipcore/ipcores04/spi-controller#_94B893FA792349019D0E8CDCCD07BF1E

  2. https://www.hanspub.org/journal/paperinformation?paperid=58041

  3. https://fpga.eetrend.com/blog/2019/100045599.html

5. QSPI

SPI Flash控制器(以下简称“QSPI”)主要实现两类功能,一是与Flash设备进行数据交互,二是对Flash设备进行管理和查询

数据交互主要通过直接访问(DAC)和间接访问(INDAC)两种方式实现,管理查询主要通过软件触发命令生成(STIG)方式实现。

  • DAC方式,AHB地址与Flash设备地址一一映射,可用于开机启动引导(Boot)和片内程序执行(XIP)。

  • INDAC方式,需设置AHB地址范围,对落入该地址范围内的访问均采用间接访问方式,并使用嵌入式SRam作为收发数据缓存,还可通过DMA外设接口与外部DMA进行握手。

  • STIG方式,通过APB总线配置内部的一组寄存器,产生Flash命令(不同Flash设备,对应的命令有所不同),用来访问Flash设备中的寄存器以及执行擦除(Erase)操作。

  • 除此之外,还支持最原始的SPI访问方式,即旁路掉DAC和INDAC,直接访问底层的收发FIFO。

QSPI主要由AHB接口单元、APB接口单元、直接访问控制单元(以下简称“DAC”)、间接访问控制单元(以下简称“INDAC”)、Flash命令生成单元、SPI传输单元和SPI/Dual SPI/Qual SPI接口单元几部分组成。

其中,AHB接口单元负责通信,APB接口单元负责配置,通过AHB地址区分直接/间接访问模式,分别进入DAC和INDAC。无论采用哪种模式均要经过Flash命令生成单元,转换为Flash可识别的命令格式,进入底层SPI传输单元,实现串并/并串转换,通过SPI/Dual SPI/Qual SPI接口单元与外部的Flash设备完成通信。架构框图:

下面描述了IP用于生成SPI事务的数据包结构。当启用TX FIFO时,包头和数据结构也可以写入TX FIFO。从flash设备读取的数据可以在启用时存储在RX FIFO中,或者在通过接口读取数据之前存储在数据包数据寄存器中。对于支持命令的flash操作,报头上的dwords数取决于闪存地址宽度。下图显示了受支持的命令的数据包结构,如写和读状态寄存器,它们不需要闪存地址,但有写或读数据。

信号描述:

寄存器描述:

具体比较多,可以参考下面资料里面的手册。

使用场景举例:

上图显示了如何在模板上实例化QSPI Flash控制器IP。AXI4-L接口直接连接到AXI4系统总线,而AHB-L接口通过AXI4到AHB-L的一桥器连接到AXI4系统总线。SPI接口端口作为顶级端口端口输出。输入时钟和复位分别连接到PLL输出时钟和系统复位。

QSPI Flash控制器IP示例设计包括以下方块:

  • RISC-VRXCPU-处理数据和指令。

  • 系统内存和TCM-存储要用于测试的命令。

  • 振荡器和PLL-时钟发生器系统总线

  • 管理从处理器和内存到所连接的IP模块的传输。

  • 接口桥-将GPIO和UART的AXI4转换为APB事务;将QSPI Flash控制器的AXI4转换为AHB-L事务。

  • GPIO和UART-作为调试模块。UART可用于显示调试消息,而GPIO输出可用于指示在FPGA板上成功加载位流。

  • QSPI Flash控制器IP-连接到FPGA板上可用的Flash设备的IP的实例。

  • 闪存-SPI目标。这不是任何子模块的实例。IP的SPI接口端口通过物理设计约束(PDC)文件连接到板载闪存设备。

DMA操作流程:当一次间接操作被触发,DMA控制单元可以获取本次传输的总数据量(字节数),并按照寄存器(0x20)配置的单次Burst和Single请求的字节数将本次传输拆分为多次Burst和Single请求。举例说明,如果一次间接读操作的总字节数是512B、SRam的空间是256B、单次Burst传输的字节数是256B,则当SRam中缓存了第一个256B数据后,DMA控制单元将触发一次DMA Burst请求,当剩余的256B数据缓存到SRam后才会触发第二次Burst请求。由于SRam空间只有256B,所以只有DMA将SRam中的数据全部取走后才会发送下一个请求。DMA控制单元可以看到SRam的填充状态。

间接读操作的DMA请求流程如下图所示,。


间接写操作的DMA请求流程如下图所示:

参考:

  1. https://www.latticesemi.com/zh-CN/Products/DesignSoftwareAndIP/IntellectualProperty/IPCore/IPCores05/QSPI-Flash-Controller-IP-Core

  2. https://blog.csdn.net/yangguoyu8023/article/details/121400556

6. PWM

PWM即为脉冲宽度调制技术,通过改变PWM波的周期可以实现调频,通过改变PWM波的占空比可以实现调压,大量应用于控制电路中中,如常用的PWM调光技术,电机调速技术等。

PWM组件提供比较输出,以在硬件中生成单个或连续的定时和控制信号。PWM提供了一种简单的方法来精确地生成复杂的实时事件,而CPU干预最小。PWM功能可以与其他模拟和数字组件相结合,以创建自定义外设。

PWM最常用的用途是产生具有可调占空比的周期波形。PWM还提供了电源控制、电机控制、开关调节器和照明控制的优化功能。您还可以将PWM作为时钟分频器,通过将时钟输入时钟输入,并使用终端计数或PWM输出作为分割时钟输出。PWM、计时器和计数器共享许多功能,但每个功能都提供特定的功能。

计数器组件更好地用于需要对多个事件进行计数的情况,但也提供了上升的边缘捕获输入和比较输出。计时器组件更好地用于专注于事件长度的时间安排,测量多个上升和/或下降边缘的间隔,或对于多个捕获事件。

接口:

使用fpga也可以自己设计一个专用PWM。在ZYNQ、Microblaze这样的嵌入式系统中。我们时常可以使用PL端的设计来减轻处理器的压力。比如,生成PWM。如果是单纯的嵌入式系统,如STM32这样的,产生PWM,通常会使用到定时器资源。而定时器是有限的,也会对处理器造成负担。

但如果是在PL端,用Verilog设计一个PWM IP,处理器只负责给它设置周期和占空比,那是不是就轻松很多了?相当于我们用FPGA设计出了一个专门用于产生PWM波的芯片,然后CPU再去控制它。

参考:

  1. https://www.infineon.com/dgdl/Infineon-Component_PWM_V3.10-Software Module Datasheets-v03_03-EN.pdf?fileId=8ac78c8c7d0d8da4017d0e805dce1203

  2. https://www.bilibili.com/read/cv7889001/

  3. https://blog.csdn.net/zhoutaopower/article/details/113484481

7. DMA

DMA (Direct Memory Access,直接存储器访问)是用来实现外设和存储器之间以及存储器和存储器之间的高速数据传输,允许不经过CPU的控制从存储器直接读取数据信息。该操作是基于地址空间标识的原理,完成了单信道源地址与目的地址两者间数据的单向传输,为不同系统模块之间的高速数据传输提供了一种可靠的方法。

在DMA对数据进行搬移时,CPU从接口单元对DMA控制器(Direct Memory Access Controller, DMAC)的配置寄存器进行初始化操作。接收数据时,由外部设备在准备好数据以后,直接向DMAC发送指令,即数据信息的地址及大小,DMAC则负责从外部设备直接将数据信息存储到存储器中。

在数据信息发送时,先定义发送存储器的区域,由CPU直接把传输的数据保存至发送存储区域中,把存储器的首地址和数据长度分别派发给对应的DMA信道。此时,DMAC的主接口单元模块会根据DMA发出的中断请求信号向CPU发起总线控制权的申请。CPU在处理完当前事务之后,就对DMA的请求作出仲裁处理,如果CPU将总线控制权交给了DMA,则由DMA来请求仲裁处理,然后根据配置信息对数据进行传输,在此过程中CPU不会介入。在数据传输完成后,DMA控制器就会发出中断信号,将总线控制权返还给CPU,至此就实现了一次DMA的数据传输。DMA发送数据如上图所示。

DMA 存储传输的过程如下:

  1. 配置用 DMA 传输数据到存储器,处理器发出操作DMA的指令/代码。

  2. DMA 控制器把数据从外设传输到存储器或从存储器到存储器,而让 CPU 腾出手来做其它操作。

  3. 数据传输完成后,向 CPU 发出一个中断信号来通知它 DMA 传输可以关闭了。

功能框图:

数据交互图:

参考:

  1. https://blog.csdn.net/weixin_41445387/article/details/116198910

后记:
本篇东拼西凑,写的还是比较牵强。但是如果没接触过这些知识也算打开了一道大门,有时候这些硬件驱动相关的东西第一次见到肯定看不懂,但是也不能退缩。装作自己比较懂,一遍一遍的看,接触的越多可能就会突然开窍了。这就是经验型知识的特点,不像软件编程写个算法一样,千变万化但是基础语法很少,从而门槛很低。
还有一点就是画出技术框图很重要,把主要功能和接口表现的很丰富,是设计的精髓。

“啥都懂一点,啥都不精通,

干啥都能干,干啥啥不是,

专业入门劝退,堪称程序员杂家”。

欢迎各位有自己公众号的留言:申请转载

纯干货持续更新,欢迎分享给朋友点赞、收藏、在看、划线和评论交流

彩蛋:

  1. 本公众号提供微信技术交流群,一起探讨汽车软件技术(先加微信:thatway1989,备注感兴趣的技术方向)。

  2. 有需要投放广告、商业合作的也可以联系博主。

  3. 赞赏1元钱交个朋友

results matching ""

    No results matching ""