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 的两个设备也不能同时传输 |