本文参考“大胡子喵喵猪”大佬《S32K312配置SPI(基于MCAL)》https://blog.csdn.net/m0_64944741/article/details/134930744
0、简介
相比于参考文章,本文基于S32K312 介绍SPI的使用,主要是记录开发流程,本文基于《基于MCAL的S32K3 MCU使用》的工程,环境如下:
MCU:NXP S32k312
RTD版本:SW32K3_S32M27x_RTD_R21-11_4.0.0_D2311
EB版本:tresos Studio 29.0
***本文目前主要是记录配置,后期不断完善配置内容的含义***
1、模块简介
SDO 主设备数据输出,从设备数据输入 对应MOSI master output slave input
SDI 主设备数据输入,从设备数据输出 对应MISO master input slave output
SCLK 时钟信号,由主设备产生
CS Chip Select,从设备使能信号,由主设备控制
SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
当SPI主设备想读/写从设备时,它首先拉低从设备对应的CS线(如果CS是低电平有效)。接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把数据信号按位发到MOSI实现“写”,同时可对MISO采样而实现“读”。如下图所示:
注意:此图只是示例,不代表所有SPI的情况,因为输出和采样的边沿可能会变化。
采集位置 : CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位
空闲电平 : CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性
2、新建工程
2.1 新建工程
本文基于《基于MCAL的S32K3 MCU使用》的工程。
2.2 添加相关模块
2.3 PORT配置
参考《基于MCAL的S32K3 PORT、DIO使用》中PortContainer配置。
2.4 MCU配置
添加McuClockReferencePoint
时钟源如下图所示:
需要手动打开添加的模块LPSPI0:
2.4 SPI配置
2.4.1 general
2.4.2 SpiPhyUint
2.4.3 SpiChannel
2.4.4 SpiExternalDevice
MT6DIMD0芯片时序图如下
2.4.5 SpiJob、SpiSequence:
这里注意配多个SPI时SpiChannel、SpiJob、SpiSequence尽量相对应
3.1 S32DS代码
在main函数里初始化MCU、Port、Spi,初始化完后即可发送/接收:
(图中代码使用的是EB)Spi_SetupEB(),有四个参数,第一个选择使用的哪个Channel,第二个参数是发送地址指针,第三个参数是接收地址指针,第四个参数是外部缓冲区的数据长度:
Spi_SyncTransmit() 发送、接收都是调用这个函数:
Channel与Sequence两个参数,代码生成的位置如下图: