1. 概述
    1. SPI驱动程序只在主模式和全双工通信模式下工作。驱动程序支持同步和异步通信,支持Level-0, Level-1和Level-2类型配置。
    2. Level等级和同/异步通信,传输seq,传输job,传输channel的配置息息相关。这里的同/异步不是指SPI通信,而是驱动内部数据流的处理模式,是直接同步的由cpu去收发收据,还是由irq和dma组合在后台异步地收发数据的模式。

 

  1. 依赖资源

由上图可知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)

 

  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 中是软件自动生成的版本号默认值,用户无需修改,保持默认即可。

 

上面的配置是同步模式的配置截图,下面提供异步模式区别于同步模式额外新增的配置项截图:

  1. 在dma中创建2个通道,一个数据发送通道,一个数据接收通道,同时数据接收通道中须添加回调函数,发送通道不需要

 

  1. SpiHwDmaConfigurationQspi 中添加Dma接收和发送通道的分配

 

  1. 中断优先级的配置,需要遵循以下规则。 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;

 

  1. 接收和发送的中断处理分配给dma

 

物理验证:使用1个Sequence,1个Job,2个Channel 环回模式下同步传输20字节数据的波形图:

 

posted on 2022-12-28 11:46  lance9527  阅读(4460)  评论(0编辑  收藏  举报