0%

MCAL SPI 配置及调用

Autosar 中 SPI 关键概念

Autosar 中的描述

Definition Description
Sequences Channel是使用相同标准定义的数据的软件交换介质:参数配置,具有相同大小和数据指针(源和目标)或位置的数据元素数量。
Job Job由具有相同片选的一个或多个Channel组成(在处理Job期间不会释放)。 一个Job被视为原子作业,因此不能被另一个Job打断。Job具有分配的优先级。
Channel Sequence是要传输的多个连续Job,但是可以使用优先级机制在Job之间重新安排Sequence。 Sequence传输是可中断的(通过另一Sequence传输)或不可中断,这取决于静态配置。

关键 API 使用

读写 Channel Buffer

在 SPI 通信中,在开始传输之前 ,必须先准备好发送的数据;传输完成后 ,则需要读取接收到的数据。这就涉及到对 读写缓冲区 的操作。

  • IB 模式 下,缓冲区由驱动内部维护,因此需要调用专用接口进行读写:

    • 写入待发送数据:Std_ReturnType Spi_WriteIB(Spi_ChannelType Channel, const Spi_DataBufferType* DataBufferPtr);
    • 读取接收到的数据:Std_ReturnType Spi_ReadIB(Spi_ChannelType Channel, Spi_DataBufferType* DataBufferPointer);
  • EB 模式 下,用户自行提供发送和接收缓冲区,在配置阶段通过以下接口设置发送数据地址、接收数据地址、数据长度:

    • 配置缓冲地址和长度:Std_ReturnType Spi_SetupEB(Spi_ChannelType Channel, const Spi_DataBufferType* SrcDataBufferPtr, Spi_DataBufferType* DesDataBufferPtr, Spi_NumberOfDataType Length);

IB / EB

Autosar 标准下的 SPI Channel 有 IB / EB 两种类型:
IB 通道由驱动内部提供缓冲区,适用于短数据传输(如 <10 字节)和 daisy-chain 场景。优点是简单易用,能利用硬件缓冲提升效率(如果硬件支持),但不适合大数据传输。
EB 通道需要用户提供缓冲区,适合大数据通信或控制复杂外设。优点是灵活高效、支持从 ROM 发送常量数据,缺点是实现复杂,对上层要求高。

开始传输 Sequence

完成 Buffer 设置后(无论是 IB 还是 EB),SPI 通信需要通过 传输接口 来启动传输。Autosar SPI 支持两种传输方式:

  • 同步传输(Sync) :调用后会 阻塞等待 传输完成:Std_ReturnType Spi_SyncTransmit(Spi_SequenceType Sequence);
  • 异步传输(Async) :调用后 立即返回 ,传输在后台进行,完成后通过回调函数通知:Std_ReturnType Spi_AsyncTransmit(Spi_SequenceType Sequence);

获取状态 / 结果

在 SPI 异步传输中,为了判断传输是否完成以及传输是否成功,Autosar 提供了多种状态获取接口:

  • 获取 SPI 驱动的整体状态,如未初始化(UNINIT)、空闲(IDLE)、忙(BUSY):Spi_StatusType Spi_GetStatus(void)
  • 查询某个具体 SPI 硬件单元的当前状态是否空闲。适用于多个 SpiDevice 通过不同片选挂在同一路 SpiPhyUni 系统:Spi_StatusType Spi_GetHWUnitStatus(Spi_HWUnitType HWUnit)
  • 获取指定 Job 的最近一次传输结果,如成功(OK)、失败(FAILED)、进行中(PENDING)、取消(CANCELED):Spi_JobResultType Spi_GetJobResult(Spi_JobType Job)
  • 获取指定 Sequence 的最近一次传输结果,如成功(OK)、失败(FAILED)、进行中(PENDING)、排队中(QUEUED):Spi_SeqResultType Spi_GetSequenceResult(Spi_SequenceType Sequence)

取消传输

void Spi_Cancel(Spi_SequenceType Sequence); 接口仅在异步传输模式下使用,并且只有在一个 Sequence 包含多个 Job 时才会涉及。
注意:这是个异步接口,调用后传输 Sequence 会等当前的 Job 传输完成后取消剩余其他的 Job。

使用场景 :当你有多个 Job 在同一个 Sequence 中异步执行,且突然需要优先传输其他重要的 Sequence 时,可以调用此接口取消当前的传输,然后立即启动新的传输。

调用时序图

Write/AsyncTransmit/Read (IB), One Channel, one Job then one Sequence

关键配置

Parameter Description
SpiChannelBuffersAllowed 指定支持的 Channel 缓冲区类型:
0 - 仅允许内部缓冲(IB)
1 - 仅允许外部缓冲(EB)
2 - 同时支持内部(IB)和外部(EB)缓冲
SpiInterruptibleSeqAllowed 是否允许中断 Sequence:
0 - 不可中断,已启动的 Sequence 传输期间不会被挂起
1 - 允许中断,具体是否中断由配置决定,Handler/Driver 可在两个连续 Job 之间中断 Sequence
SpiLevelDelivered 驱动提供的功能等级:
0 - 仅支持简单同步传输
1 - 支持基本异步传输
2 - 支持增强型传输行为
SpiSupportConcurrentSyncTransmit 是否支持多个不同 Sequence 的 Spi_SyncTransmit() 同时并发调用(配置项是否允许并发)
注意:如果不勾选这项,即使不是同一路 SPI 的两个设备也不能同时传输

参考文档