一,前言
今天没事做,那么还是学习吧,之前MCAL SPI使用不顺畅,所以我今天就把同步及异步spi的源码全部看懂吧,侧重于了解它的设计思路。
二,学习点
- 同步spi使用Spi_lSyncStartJob函数,Spi_SetupEB仅用来设置发送接收buffer及长度的。
- 多核共享同一资源的操作,比如写spi4使用同步方式的策略。反正要对共享硬件资源操作的时候,就设置自选锁,对多核共享变量操作就加自选锁。对应共享资源的操作依赖判断变量的结果是忙碌还是空闲。
Temp=4,就是操作spi4。
a.先加自旋锁
b.判断此核spi4状态是否空,且核没锁住
if((Spi_RuntimeKernelVar[temp]->KernelStatus == SPI_IDLE)
&& (Spi_RuntimeCoreVar[CoreId]->KernelLock == 0U))
c.先设置锁住kernel,然后设置此核spi4为忙
Spi_RuntimeCoreVar[CoreId]->KernelLock |= (uint32)(1UL<<temp);
Spi_RuntimeKernelVar[temp]->KernelStatus = SPI_BUSY;
d.退出自旋锁
e.开始spi4同步传输动作
f.先加自旋锁
g.设置变量KernelLock为unlock,KernelStatus为idle。
e.退出自旋锁
- 异步主要使用Spi_lAsyncStartJob函数。关于spi中使用的DMA函数为Dma_ChUpdate。
- 通过看code可以知道异步通信函数中除了Global配置和ECON配置外,和DMA连接的是DATA_ENTRY(地址为0xF0002064),且用到了BACONENTRY。
三,MCAL配置spi为DMA异步方式
我参考MCAL demo,然后进行的修改。一开始就是无波形,于是我就跑了下MCAL demo的code,进行了配置修改及裁剪,结果通过对比找到原因,DMA也是类似中断,是需要安装的。加了如下3句在初始化,SPI通过DMA触发后就有波形了。
IrqSpi_Init();
SRC_QSPI4RX.B.SRE = 1;
SRC_QSPI4TX.B.SRE = 1;
四,关于MCAL SPI的EB配置备忘
1.SpiLevelDelivered (0 -> 2) 要选择2,就是支持同步和异步,若仅选0,仅支持同步。若是异步的,最好添加如下API设置为异步Spi_SetAsyncMode((Spi_AsyncModeType)1u)。
2.spijob要选异步
image.png
3.spi的hardware需要选DMAchannel
image.png
4.至于DMA模块中自己要创建channel,然后Irq中不选CPU0直接选DMA,然后中断优先级的位置填写DMA通道号。
五,DMA SPI通信成功
image.png六,小结
技能又长进了,搞定spi~
网友评论