一、SPI基础概念和一些总结
基础概念
1、channel:channel是被相同标准定义的数据软件交换介质,其中相同的标准包含配置、参数、相同大小的数据元素的数量、数据指针(源端和目的端)/数据位置;
2、Job : Job是同一个片选的一个或多个channel的组合;一个Job是一个元子操作,在Job处理过程中不释放;不能被其他的Job中断,且Job具有优先级;
3、Sequence : Sequence是有多个要传输的Job组成,且Sequence中可以根据Job的优先级调度Job;一个Sequence能否被另一个sequence打断取决于配置;
一个Job至少由一个channel组成; 每个channel应有一个相关索引,用于指定作业中频道的顺序;属于同一Job的channel拥有相同的Job属性;
Job属性是???
一个Sequence至少由一个Job组成;属于同一个Sequence的Job拥有相同的Sequence属性
Sequence属性是???
channel与Job的关系
Job与Sequence的关系
###################################分割线###################################
硬件形式
SPI有4根线,通信使能是通过CS(ChipSelect 片选),数据的传输由MOSI(序列数据输出)、MISO(序列数据输入)和CLOCK(序列时钟) 3根线组成
CS的作用是标记Job的开始与结束,CS的默认状态根据芯片手册设置,状态可高可低;当要开始Job传输时,CS会被拉高或者拉低(处于Active状态),当Job完成传输后拉会默认状态(处于InActive状态),如下图所示:
###################################分割线###################################
一些个人总结
1、Job的优先级用于SPI Driver调度开始前对调度Job的顺序排序;
2、当一个Job正在传输时,不能被其他高优先级的Job中断(挂起);
3、当一个Job传输完成时,若改Job所在的Sequence是可中断的,则该Sequence可以被拥有高优先级Job的Sequence中断,SPI Driver会重新调度高优先级Job所在的Sequence。
4、Sequence没有优先级
二、SPI的3个可扩展功能级别
功能扩展级别概要如图所示
1、Level 0:Simple Synchronous SPI Handler/Driver(简单同步SPI),通信基于采用 FIFO 策略的同步处理来处理多个访问;缓冲区使用可配置以优化和/或利用硬件功能;
目的:是为SPI Handler/Driver提供一组减少的服务,以仅处理简单的同步传输,简单的同步传输意味着调用传输服务的函数在传输过程中被阻塞,直到传输完成;
其他 :当传输发生错误时,会停止当前Sequence中的Job的传输,设Job状态为SPI_JOB_FAILED,Sequence的状态为SPI_SEQ_FAILED;Channel 数据传输时,读写功能无法保证数据完整性;
2、Level 1:Basic Asynchronous SPI Handler/Driver(基础异步SPI),通信基于异步行为并使用优先级策略来处理多个访问。 缓冲区使用可配置为“简单同步”级别。
目的:是为SPI Handler/Driver提供一组减少的服务,以仅处理异步传输;传输服务在正在传输时不会被阻塞,在传输完成后会通过notification通知用户;
其他:未在传输时处于SPI_IDLE状态;
--属于统一Sequence的Job具有相同或者递减的优先级,即Sequence中的第一个Job具有本Sequence中的最高/同等高的优先级;
--Job的优先级,数字越大,优先级越高;且取值范围为[0,3];优先级最高的Job在Sequence中首先被发送;
--允许同时传输多个Sequence;
--Notification的调用顺序是先调用[Job_Notification],然后调用[Sequence_Notification],且Job状态为SPI_JOB_FAILED/SPI_JOB_OK,Sequence状态为SPI_SEQ_FAILED/SPI_SEQ_OK/SPI_SEQ_CANCELLED
该级别功能特点:能使用ChannelBuffer和可中断Sequence
异步通信可配置架构(适用Level1和Level2)提供两种类型的序列(Sequence),SpiInterruptibleSeqAllowed决定Sequence是否可中断:
不可中断序列:每个启动的序列传输不会被处理程序/驱动程序暂停,直到传输结束;
混合序列:根据其配置,开始的序列传输可能会被Driver在两个连续的Job之间暂停
3、Level 2:Enhanced (Synchronous/Asynchronous) SPI Handler/Driver(增强型同步/异步SPI),通信基于异步行为或同步处理,使用在执行期间可选择的中断或轮询机制,并使用优先级策略来处理多个访问。 缓冲区的使用与其他级别一样是可配置的;
目的:为 Handler/Driver 提供一整套服务来处理同步和异步传输;空闲时的SPI状态为SPI_IDLE;
其他:
--异步结束传输可以通过轮询或中断机制来检测;
--异步传输使用Polling机制或者中断机制在SPI执行期间可通过Spi_SetAsyncMode设置;
三、ChannelBuffer分类
1、IB(Internally buffered Channels ):收发数据的buffer由SPI Driver提供;
2、EB(Externally buffered Channels):收发数据的buffer由用户(静态/动态的)提供;
3、Channel实际能使用什么类型的Buffer,取决于SpiChannelBuffersAllowd的值:
四、调度相关
1、Notification和Reschedule
若Notification和重新调度都由软件控制,应该先执行重新调度,再执行Notification;
若Notification和重新调度都由硬件控制,无法按要求配置执行顺序; the order shall be completely documented。
2、Spi_Init默认会将异步通信的模式设置为polling机制;
3、Spi_AsyncTransmit和Spi_SetupEB
当Spi_SetupEB的SrcPointer为NULL调用Spi_AsyncTransmit时,则SPI Driver会用Channel的默认值进行数据传输;
当Spi_SetupEB的DestPointer为NULL调用Spi_AsyncTransmit时,则SPI Driver会忽略收到的数据;
4、Spi_AsyncTransmit和IB Channel
Spi_AsyncTransmit应在Spi_WriteIB之后调用,在Spi_ReadIB之前调用,即顺序为Spi_WriteIB-Spi_AsyncTransmit-Spi_ReadIB
5、Spi_SetAsyncMode的使用(原型为Std_ReturnType Spi_SetAsyncMode (Spi_AsyncModeType Mode))(PS:这个在使用异步通信的时候需要格外注意)
若SPI Driver的状态为SPI_BUSY且异步传输正在进行时调用Spi_SetAsyncMode,则SPI Driver不应改变为AsyncModeType并保持模式不变,且返回E_NOT_OK;
若SPI Driver的状态即使为SPI_BUSY且同步传输正在进行时调用Spi_SetAsyncMode,则SPI Driver应改变AsyncModeType为入参Mode,且返回E_OK;
6、在准备使用SPI传输数据之前(在Spi_WriteIB或者Spi_SetupEB之前),需要查询使用的Sequence的状态不为Pending。
五、相关时序图
1、同步时序图如下
2、异步时序图如下