-
概述
- SPI驱动程序只在主模式和全双工通信模式下工作。驱动程序支持同步和异步通信,支持Level-0, Level-1和Level-2类型配置。
- Level等级和同/异步通信,传输seq,传输job,传输channel的配置息息相关。这里的同/异步不是指SPI通信,而是驱动内部数据流的处理模式,是直接同步的由cpu去收发收据,还是由irq和dma组合在后台异步地收发数据的模式。
- 依赖资源
由上图可知spi驱动模块需要依赖的驱动模块包括Mcu,Port,McalLib,Irq和Dma。
Mcu 中的配套设置选择时钟源SEL1,外设核心时钟80MHz
Port 中的配套设置物理4线的输出和复用模式:
SPI主从模式切换:主模式下配置CS,CLK,MOSI 对用的pin为输出,且设置合适的复用值,同时配置MISO对应的pin为输入即可;从模式下配置MISO对应的pin为输出,且设置合适的复用值,同时配置CS,CLK,MOSI 对用的pin为输入即可。
主模式:
从模式:
关键信息: QSPI0,SLSO12中的12, MRSTC中的C,复用模式O4,CS低有效,从机工作在模式3 :Clock空闲高电平(CPOL=1) , 相位LEADING(CPH=1)
- 配置预览
Spi的配置主要包括SpiDriver,SpiGeneral,SpiHwConfiguration这3个主要的container,下面依次详解。
container:SpiGeneral 中包含Spi的一些通用配置,关闭错误侦测,关闭安全模式,失能部分接口API, 设置操作模式为SUPERVISOR, 禁止中断打断传输seq等。
SpiChannelBuffersAllowed 用于选择数据buffer是采用IB还是EB的方式,即内部buffer还是外部buffer,取值与实际含义见下图,关于IB和EB的区别请查阅文档。
SpiLevelDelivered 用于选择spi工作的Level,Level-0仅支持同步数据传输,Level-1仅支持异步数据传输,Level-2既支持同步数据传输,又支持异步数据传输,取值与实际含义见下图。
container:SpiChannel 中创建了2个传输通道,传输通道即可用于同步传输,也可用于异步传输;
SpiChannelType 选择IB,表示使用内部buffer;
SpiDataWidth选择8,表示传输数据为8位宽;
SpiIbNBuffers选择10,表示一个IB的容量是10个SpiDataWidth;如果SpiDataWidth=8,则表示一个IB的容量是10字节;如果SpiDataWidth=32,则表示一个IB的容量是40字节;
SpiEbMaxLength 表示 SpiChannelType选择EBbufer时,单buffer的最大数据量,只有SpiChannelType选择EB时,才需要考虑此值;
SpiTransferStart表示数据传输是MSB/LSB;
SpiDefaultData 表示代码中如果数据buffer指针为NULL时,spi总线上真实发送的数据。
container:SpiExternalDevice 中包含了外部连接的从机的配置;
SpiBaudrate 表示主机和从机用640000Hz的波特率通信;
SpiCsIdentifier 选择CHANNEL12 表示使用cs通道12(依据是前面关键信息中SLSO12中的12);
SpiCsPolarity 选择LOW表示cs为low电平时选中从机;
SpiCsSelection选择 CS_VIA_PERIPHERAL_ENGINE表示cs由物理外设驱动,即硬件cs,如果选择CS_VIA_GPIO则表示cs由软件控制gpio去模拟;
SpiDataShiftEdge 选择LEADING 表示空闲时时钟相位为1,选择TRAILING 表示空闲时时钟相位为0;
SpiEnableCs 选择true表示启用片选信号线cs;
SpiHwUnit 选择QSPI0 表示使用物理spi控制器0;
SpiCsGpio 只有在SpiCsSelection选择CS_VIA_GPIO时才需要填充软件模拟cs的gpio的信息;
SpiAutoCalcBaudParameter 选择true表示控制器自动计算波特率设置时需要的各参数的值,建议选择true;
SpiBaudrateParams 只有在SpiAutoCalcBaudParameter选择false时才需要手动填充设置波特率时需要的各参数的值;
SpiShiftClockIdleLevel 选择HIGH表示空闲时时钟极性为1,选择LOW表示空闲时时钟极性为0;
SpiParitySupport 选择UNUSED表示不启用硬件数据流奇偶校验,选择EVEN/ODD则表示启动硬件奇/偶校验;
其余的参数使用默认值即可,更多信息请参阅文档。
生成的配置代码如下:
模式由CPH, CPOL的值决定,模式=CPOL<<1|CPH
Sequence, Job, Channel 3者间的关系图:
container:SpiJob 中包含了数据传输Job的设置;本例中只创建一个传输Job。
SpiHwUnitSynchronous 选择SYNCHRONOUS表示此Job使用同步模式传输数据,选择ASYNCHRONOUS表示此Job使用异步模式传输数据;
SpiJobEndNotification 用来创建Job传输结束时的回调通知函数,只有SpiHwUnitSynchronous 选择为 ASYNCHRONOUS时该选项才可以配置,同时在代码中用户需要完善此函数的实现;
SpiJobId 由软件自动生成,表示Job的序号,从0开始计;
SpiFrameBaseCS 选择true表示MOSI的数据由CS拉低触发传输,选择false则不受cs触发,这里默认选择false;
SpiJobPriority 用来指定Job的优先级,优先级会影响Job在Sequence队列中的排序位置,默认选择0即可;当有多个Job时,各Job的优先级必须互不相同;
SpiDeviceAssignment 用来将此Job分配给真实的物理从机设备,本例中是前面配置的SpiExternalDevice_0;
SpiChannelList 中列出从属于本Job的所有Channel,分别是SpiChannel_0和SpiChannel_1;
container:SpiSequence 中包含了数据传输Sequence的设置;本例中只创建一个传输Sequence。
SpiInterruptibleSequence 选择false表示不支持中断打断seq的传输,选择true表示允许中断打断seq的传输,默认选择false禁止中断打断seq的传输,不论同步传输还是异步传输;
SpiSeqEndNotification 用来创建Sequence传输结束时的回调通知函数,只有SpiHwUnitSynchronous 选择为 ASYNCHRONOUS时该选项才可以配置,同时在代码中用户需要完善此函数的实现;
SpiSequenceId 由软件自动生成,表示Sequence的序号,从0开始计;
SpiJobAssignment 用来表示此Sequence下包含的Job,本例中SpiJob_0将被分配到SpiSequence_0下;
container:SpiMaxChannel 由软件自动计算用户总共配置的Channel数目,配置完全部的Channel之后,再配置此项;
container:SpiMaxJob 由软件自动计算用户总共配置的Job数目,配置完全部的Job之后,再配置此项;
container:SpiMaxSequence 由软件自动计算用户总共配置的Sequence数目,配置完全部的Sequence之后,再配置此项;
container:SpiHwConfiguration 中包含了Spi主机的配置,这里只实现了一个主机配置,即SpiHwConfigurationQspi_0;
SpiHwConfigKernal 用来选择物理控制器,本例中选择QSPI0作为Spi通信主机;
SpiJobQueueLengthQspix 用来指定Job队列支持的最大成员数目,使用默认值2即可;
SpiSleepEnableQspix 选择false表示禁止spi控制在空闲时进入Sleep模式,选择false表示允许spi控制在空闲时进入Sleep模式,使用默认值false禁止进入sleep;
SpiHWPinMRSTQspix 用来指定miso引脚定义,依据前面关键信息中的MRSTC中的C,在这里选择MRST0C_PORT22_PIN6,表示用Port22_Pin6用作miso引脚;
SpiExternalDemux 选择false表示禁止外部器件矩阵复用,选择true表示允许外部器件矩阵复用,因为外部从机只有一个,因此这里选择false禁止外部器件复用;
SpiSLSO0StrobeDelay 表示cs的强制延时值,这里使用默认值即可;
SpiHwDmaConfigurationQspi 用来分配Dma的通道,此项只有在SpiLevelDelivered选择1/2时且SpiHwUnitSynchronous 选择ASYNCHRONOUS时才允许配置,同时需要在DMA和irq中提前完成相关的配置,有关Dma和Irq的配置,请参阅Dma和Irq的配置说明文档;
container:SpiPublishedInformation 用来指定芯片支持的硬件spi控制器的数目,使用软件自动计算的默认值6即可;
container:CommonPublishedInformatica 中是软件自动生成的版本号默认值,用户无需修改,保持默认即可。
上面的配置是同步模式的配置截图,下面提供异步模式区别于同步模式额外新增的配置项截图:
- 在dma中创建2个通道,一个数据发送通道,一个数据接收通道,同时数据接收通道中须添加回调函数,发送通道不需要
- 在SpiHwDmaConfigurationQspi 中添加Dma接收和发送通道的分配
- 中断优先级的配置,需要遵循以下规则。 DMA.ERR > SPIx.PT > SPIx.ERR > SPIx.UD > SPIx.Tx > SPIx.Rx;同时SPIx.Tx和SPIx.Rx的值等同于二者所使用的DMA的channel号, 同时这两个dma-channel的优先级要保证dam.tx_channel > dma.rx_channel;
- 接收和发送的中断处理分配给dma
物理验证:使用1个Sequence,1个Job,2个Channel 环回模式下同步传输20字节数据的波形图: