前言
通过前面的学习,已经可以实现最基础的引脚配置功能了,并实现了点亮LED的程序。下面将记录一下,S32K3的SPI模块的配置方法,以及注意事项。
一、LPSPI介绍
**LPSPI:LOW POWER Serial Peripheral Interface**
1.概述
- 所有LPSPI支持最大数据速率15 MHz的附加板和7.5MHz的标准版。
- LPSPI0实例在loopback模式下支持20MHz,在normal模式下支持15MHZ;
- 所有6个LPSPI模块Tx和Rx支持DMA访问。
- 可配置时钟极性和时钟相位。
- 每个SPI 具有 2 个 4 字深度的 FIFO 分别缓冲 TX 与 RX 信息。
- 每个LPSPI实例支持多个芯片选择。
- 在主模式下灵活定时,包括SCK频率,占空比和PCS与SCK边缘之间的延迟。
- TXMASK和RXMSK为半双工或匹配功能。
- 支持半双工传输,支持在每个时钟边缘上发送或接收1/2/4/8位。
每个SPI均具有多个片选信号线,其中SPI0具有8个外部片选信号线。
2.时钟配置
高性能的SPI0以外设桥平台时钟AIPS_PLAT_CLK为总线时钟源,其他SPI以外设桥时钟作为总线时钟源。总线时钟源输入SPI 后,根据 SPI 预分频值得到用于度量时序参数的功能时钟,最后由功能时钟分频得到输出的 SPI 同步时钟信号 SCK根据时钟源的配置SPI0 回环模式下支持 20M 波特率,普通引脚下 15M ;其他 SPI 模块回环模式下 15M ,普通模式下 7.5M。
3.功能框图
1.控制逻辑:负责管理模块工作参数与通信参数,通过配置寄存器与 TXFIFO写入参数; 2.移位寄存器:将传输数据移出到总线与将数据移入 RXFIFO 3.FIFO:分为两类,发送 FIFO 与接收 FIFO ,总共 4 字深度。其中传输命令字也通过TXFIFO 写入控制逻辑; 4.SPI外部接口:连接引脚与 IO 信号;
二、使用步骤
1.引脚配置
例程使用的是LPSPI0,参数选择默认即可。
2.外设配置
SPI配置界面将 SPI 模块抽象化为三个功能部分,分别为 Name SpiDriver SpiGeneral 。其中 Name 模块用于更上层的抽象定义 如 MCAL)MCAL),保持默认即可;我们主要讨论 SpiDriver SpiGeneral 两个模块的配置; SpiGeneral界面主要负责配置 SPI 物理模块参数的配置(即硬件参数),如全局 DMA支持,同步传输定时器的选择, SPI 模块号与主从模式的配置, DMA 通道的选择等。有多少个 SPI 模块就需要在 SpiPhyUnit 中加入对应项数。
SPI Driver 配置界面主要负责配置 SPI 通信参数与传输命令字,由于通信参数与连接 的外设芯片相关,所以也被称为 externalDevice 配置。该界面主要可配置波特率, PCS 片选信号线的选择,时钟极性与时钟相位,帧数据长度与格式、时钟延迟参数以及是否使能连续传输功能等。当配置完成后,通过SpiHwUnit 参数将此 externalDevice 配置映射到前面提到物理模块项。这种将物理模块与外设通信参数分离的设计思路可以很方便地应对 1 个 SPI 连接多个外设的情况。 值得注意的是SpiHwUnit中的选项就对应着SpiGeneral栏中的SpiphyUnit。这样我们就可以配置多个SPI芯片,对应一个SPI模块。
3.时钟配置
4.常用API
Lpspi_Ip_StatusType Lpspi_Ip_Init(const Lpspi_Ip_ConfigType *PhyUnitConfigPtr)
初始化指定的SPI HW实例。应该在调用所有其他API函数之前调用它。
Lpspi_Ip_StatusType Lpspi_Ip_UpdateTransferMode(uint8 Instance, Lpspi_Ip_ModeType Mode)
此函数更新指定SPI硬件微控制器外设的异步机制模式。
Lpspi_Ip_HwStatusType Lpspi_Ip_GetStatus(uint8 Instance)
这个函数返回指定SPI硬件微控制器外设的状态。
Lpspi_Ip_StatusType Lpspi_Ip_SyncTransmit(
const Lpspi_Ip_ExternalDeviceType *ExternalDevice,
uint8 *TxBuffer,
uint8 *RxBuffer,
uint16 Length,
uint32 TimeOut
)
调用SyncTransmit 函数执行一次同步传输,在函数内部获取计数器值进行计时,并
将数据依次推入 TDR 寄存器中发送。
5.Demo
应用程序使用SPI驱动程序以半双工模式传输数据 -通过LPSPI0(MASTER)传输10帧8位,通过LPSPI2(SLAVE)传输10帧8位
|