概述
MCAL中的SPI处理程序/驱动程序旨在服务于通过SPI总线连接的设备的读写操作。它允许多个用户(例如EEPROM、看门狗和I/O ASIC)共享对SPI通信的访问权。同时,它还提供了必要的机制来配置片上SPI外设。
SPI,即串行外围接口,是一个四线同步串行接口。数据通信的启动依赖于片选线(CS)。数据的传输则通过三线接口实现,这包括用于串行数据输出的MOSI线、用于串行数据输入的MISO线,以及负责串行时钟同步的CLOCK线。这种配置使得SPI成为一个高效、灵活的通信协议,适用于各种外围设备与主控制器之间的数据传输。
SPI除了具备基本的通信功能外,还具备模式选择的特性,这使得它能够在不同的应用场景中灵活应对。
在下面的图示中,我们可以清晰地看到SPI的四种时序模式,同时,这些时序模式与CPOL和CPHA两个关键参数之间的关系也一目了然。
CPOL参数决定了SCK时钟信号在空闲状态下的电平状态。具体来说,当CPOL设置为0时,时钟信号在空闲状态下保持低电平;而当CPOL设置为1时,空闲状态下的时钟信号则保持高电平。
另一方面,CPHA参数则用于确定数据的采样时刻。当CPHA设置为0时,SPI会在每个时钟周期的第一个时钟沿进行数据采样;而当CPHA设置为1时,采样操作则会在每个时钟周期的第二个时钟沿进行。
这两个参数的灵活组合使得SPI通信能够满足不同的数据传输需求,实现更高效、稳定的数据交换。
MCAL配置详解
1.SPI Channel
SpiChannelId:
通道ID,也可以理解成多个通道中某个通道的一个序号或者下标。
SpiChannelType:
通道类型,取决于SpiChannelBuffersAllowed参数
SpiChannelBuffersAllowed=0,选择IB.
SpiChannelBuffersAllowed=1,选择EB.
SpiChannelBuffersAllowed=2,IB或者EB.
SpiDataWidth:
SPI一次发送的数据长度
SpiEbMaxLength:
选择EB时,数据缓冲区的最大长度
SpiIbBuffers:
选择IB时,数据缓冲区最大数量
SpiTransferStart:
SPI发送数据的起始位,包括MSB和LSB,及低位在前还是高位在前。
2.SPI ExternalDevice
SpiBaudrate:
SPI的波特率。
SpiCsIdentifier :
这个参数是用于标识分配的芯片选择(Chip Select,简称CS)的符号名称。在SPI通信中,芯片选择(CS)或片选信号是一个控制信号,用于选择或激活特定的SPI从设备。当有多个SPI从设备与主控制器相连时,CS信号用于区分和选择每个从设备,以便主控制器可以与特定的从设备进行通信。
SpiCsPolarity :
片选信号的使能电平。
SpiDataShiftEdge :
选择采集的边沿,确认是上升沿还是下降沿进行采集的配置
SpiEnableCs:
使能片选
SpiHwUnit:
选择硬件接口
SpiAutoCalcBaudParams:
这个参数用于启用或禁用QSPI(Quad SPI,四线SPI)波特率参数的自动计算功能。如果此参数设置为ON(开启),那么硬件参数TQ、Q、A、B、C将根据SpiBaudrate(SPI波特率)自动计算得出。
SpiIdleTime:
在QSPI(Quad SPI)通信协议中,IDLEA和IDLEB时间是指QSPI接口在数据传输前后的空闲时间。这些空闲时间参数在QSPI通信中扮演着重要的角色,主要用于确保主设备(通常是微控制器)和从设备(如存储器)之间的同步和时序正确性。
IDLEA时间通常指的是主设备在发送命令或地址之前,以及在接收数据之后的空闲时间。这段时间允许从设备准备好接收新的命令或地址,或者在发送完数据后有一个短暂的休息时间。
IDLEB时间则是主设备在发送数据之后,以及在接收响应或状态之前的空闲时间。这段时间用于从设备处理接收到的数据,准备响应或状态信息,并确保在主设备开始接收之前数据已经准备好。
SpiTrailingTime:
Trailing Time,也称作尾随时间,是指在时钟信号的最后一个边沿与片选信号(CS)撤销之间的时间间隔。在SPI(Serial Peripheral Interface)通信中,Trailing Time也代表了SPI通道中数据元素之间的时间间隔。
在SPI通信协议中,时钟信号(SCK)用于同步主设备与从设备之间的数据传输。每个时钟周期,数据都会从主设备发送到从设备,或从从设备发送到主设备。Trailing Time是在一个数据传输周期结束时,从时钟信号的最后一个边沿(通常是下降边沿)到片选信号(CS)撤销之间的时间段。
SpiShiftClockIdlelevel:
这个参数定义了SPI移位时钟的空闲级别(SPI Shift Clock Idle Level)。在SPI通信协议中,移位时钟(SCK)用于同步主设备和从设备之间的数据传输。移位时钟的空闲级别指的是在数据传输的空闲或暂停期间,SCK信号线的电平状态。
SpiTimeClk2Cs:
这个参数用于定义在SPI(Serial Peripheral Interface)通信中,时钟信号(SCK)开始之前到片选信号(CS)激活之间的时间间隔。
在SPI通信中,片选信号用于选择特定的从设备,而时钟信号用于同步主设备与从设备之间的数据传输。前导时间是一个重要的时序参数,它确保在从设备被选中并准备接收数据之前,时钟信号已经稳定且处于正确的状态。
SpiParitySupport:
当选择了SpiParitySupport(SPI奇偶校验支持)时,SPI数据传输/接收会包含一个额外的位,根据选择将奇偶校验设置为偶数(EVEN)或奇数(ODD)。
奇偶校验是一种简单的错误检测方法,用于确保在传输过程中数据的完整性。在SPI通信中,当启用奇偶校验时,发送方会在每个数据字后面添加一个额外的位(奇偶校验位),使得整个数据字(包括奇偶校验位)中的1的个数为偶数或奇数,具体取决于所选择的奇偶校验类型。
-
偶数奇偶校验(EVEN):整个数据字(包括奇偶校验位)中1的个数为偶数。
-
奇数奇偶校验(ODD):整个数据字(包括奇偶校验位)中1的个数为奇数。
接收方在接收到数据后会重新计算接收到的数据字的奇偶性,并将其与发送的奇偶校验位进行比较。如果两者不匹配,则表明在数据传输过程中发生了错误。
3.SPI Job
SpiJobId:
SPI Job ID 是一个在 SPI API 函数中用作参数的标识符
SpiFrameBasedCS:
是否启用基于帧的片选功能。启用基于帧的片选功能时,SPI控制器或驱动器会自动处理片选信号的激活和撤销。当主设备开始发送或接收一个SPI帧时,片选信号会自动激活,以确保正确的从设备被选中。一旦帧的传输完成,片选信号会自动撤销,以便主设备可以与另一个从设备通信或进入空闲状态。
SpiJobPrioryty:
Spi 任务优先级。
SpiDeviceAssignment:
外部设备引用。这里引用的是SPI ExternalDevice中的eeprom Device
4.SPI Sequence
SpiSequenceId:
SPI Sequence ID(SPI序列ID)是在SPI API(应用程序接口)函数中用作参数的一个标识符。
SpiSeqEndNotification:
通知函数的引用
SpiInterruptibleSequence:
是否允许被另一个Sequence挂起。
SpiJobAssignment:
Spi Sequence对SpiJob eeprom的引用
5.SPI General
SpiCancelApi:
开启(ON)Spi_Cancel
函数意味着该函数是可用的,可以在需要时调用它来取消SPI通信。这通常在需要紧急停止当前操作或响应某些错误条件时使用。
关闭(OFF)Spi_Cancel
函数则意味着该函数不可用或被禁用。一旦关闭,即使调用该函数,它也不会执行任何操作或取消任何SPI通信。
SpiChannelbuffersAllowed:
0 - IB (Internal Buffer): 选择内部缓冲区(Internal Buffer,简称IB)。这意味着SPI通信将使用设备或处理器内部的缓冲区来存储和传输数据。内部缓冲区通常具有固定的大小和特性,并且由硬件或固件直接管理。使用内部缓冲区可以减少外部硬件或内存的依赖,但可能受限于其大小或性能。
1 - EB (External Buffer): 选择外部缓冲区(External Buffer,简称EB)。这表示SPI通信将使用外部内存或缓冲区来存储数据。外部缓冲区的大小和特性可以根据应用需求进行配置,提供了更大的灵活性和扩展性。然而,使用外部缓冲区可能增加系统的复杂性和潜在的延迟,因为数据需要在内部和外部缓冲区之间进行传输。
2 - Both: 选择同时使用内部和外部缓冲区。这种情况下,SPI通信可能根据具体的需求和条件动态地选择使用内部或外部缓冲区,或者同时使用两者。这种灵活性可能有助于优化性能、资源管理或错误处理。
SpiInitDeInitApiMode :
这个参数用于选择MCU(微控制器)初始化和去初始化API(应用程序接口)的操作模式。
SpiInitCheckApi :
是否启用API的初始化检查。
SpiRuntimeApiMode :
运行时API操作模式选择。
SpiDevErrorDetect :
开启或关闭默认错误追踪器(Det)的检测和通知功能。
SpiHwStatusApi :
开启或关闭 Spi_GetHWUnitStatus
函数
Spi_GetHWUnitStatus
函数通常用于获取SPI硬件单元的状态信息。这些状态信息可能包括SPI接口是否正在忙碌、是否发生错误、是否已准备好进行数据传输等。通过调用这个函数,开发者可以实时了解SPI硬件单元的工作状态,从而做出相应的控制或处理决策。
SpiInterruptibleSeqAllowed:
开启或关闭中断序列处理功能。
SpiLevelDelivered:
这个参数用于选择SPI处理器/驱动程序所提供的可扩展功能级别
LEVEL0(同步传输):在这种模式下,SPI驱动程序仅支持同步传输,这意味着发送和接收数据是顺序执行的,且发送一个数据块后会等待接收确认或完成信号再继续下一个操作。这种模式适用于对时序要求严格,且不需要并行处理多个传输任务的场景。
LEVEL1(异步传输):在这种模式下,SPI驱动程序支持异步传输,这意味着发送和接收数据是独立的,发送操作不会阻塞等待接收完成。这种模式适用于需要同时处理多个传输任务,或对响应时间有较高要求的场景。
LEVEL2(同步和异步传输):这是最高级别的功能,驱动程序能够同时处理同步和异步传输。这意味着它可以根据需要灵活地选择使用同步或异步模式,以满足不同的应用需求。这种模式适用于复杂的多任务环境,需要高效且灵活地管理SPI通信。
SpiSupportConcurrentSyncTransmit :
这个参数指定是否可以对不同序列的并发 Spi_SyncTransmit()
调用进行配置。
如果此参数允许配置并发调用,那么开发者可以根据应用的具体需求来决定是否允许并发传输。例如,在某些场景下,可能需要同时发送多个数据块到不同的SPI设备,以提高系统的吞吐量和效率。在这种情况下,允许并发调用是有益的。
然而,在某些其他场景下,并发传输可能会导致资源冲突、数据混乱或不可预测的行为。例如,如果SPI硬件不支持真正的并发传输,或者并发传输可能导致时序问题,那么禁止并发调用可能更为合适。
SpiSyncTransmitTimeoutDuration:
该参数用作等待单个数据元素传输/接收时的超时循环计数器。
这个参数定义了这样一个超时机制:当SPI驱动程序或函数正在等待单个数据元素的传输或接收完成时,它会使用一个循环来检查操作是否完成。每次循环,这个计数器就会递减。如果计数器减到零,但操作仍未完成,那么通常会触发一个超时错误,因为这意味着等待的时间已经超过了预期或可接受的阈值。
SpiVersionInfoApi :
开启或关闭 Spi_GetVersionInfo
函数。
SpiSystemClock:
Spi的系统时钟源
6.SpiHwConfigurationQspi
SpiHwConfigKernel:
标识关联的内核标志。
SpiJobQueueLengthQspix:
用于指定任务队列的大小。
SpiHWPinMRSTQspix :
主设备接收从设备发送的引脚配置。
SpiExternalDemux :
启用或禁用QSPI硬件的外部解复用器(demultiplexer)功能。
当启用QSPI硬件的外部解复用器功能时,QSPI接口能够通过外部解复用器与多个SPI设备进行通信。外部解复用器负责将QSPI接口的信号路由到不同的SPI设备,并管理它们之间的通信。这通常需要额外的硬件支持和配置,以确保正确的信号路由和同步。
相反,如果禁用外部解复用器功能,QSPI接口将只能与一个SPI设备进行通信,而无法同时与多个设备通信。这可能会限制系统的扩展性和功能。
SpiSLSO0StrobeDelay :
这个参数用于指定在外部解复用器模式下,为SLSO0配置的Strobe延迟。
PublishedInformation
SpiMaxHwUnit:
SPI处理器/驱动程序模块可处理和管理的不同SPI硬件微控制器外设(单元/总线)的数量,是指该模块能够支持并控制的SPI硬件接口的数量。
本文主要是基于参考芯片手册以及工作经验,以此作为我个人的学习记录。虽然我的理解尚不深刻,仍有许多疑惑之处需要深入探讨和改进。接下来,我会继续努力,不断实践和完善,以期取得更好的学习效果。