AUTOSAR_SWS_SPIHandlerDriver

Specification of SPI Handler/Driver


简介和功能概述


SPI 处理程序/驱动程序提供对通过 SPI 总线连接的设备的读写服务。它为多个用户(例如,EEPROM、看门狗、I/O ASIC)提供访问 SPI 通信的能力。它还提供配置片上 SPI 外设所需的机制。

本规范描述了一个独立的 SPI 处理程序/驱动程序的 API。该软件模块包含(对 SPI 进行)处理及驱动的功能。该独立的 SPI 处理程序/驱动程序的主要目标是充分地利用每个微控制器的功能,并允许根据静态配置对实现进行优化,以尽可能地满足 ECU 的需求。

因此,该规范定义了可选的功能级别及可配置的特性,以实现利用微控制器的特性的高可扩展性的模块的设计。

为了配置 SPI 处理程序/驱动程序,应遵循以下步骤:
  • 应对 SPI 处理程序/驱动程序的功能级别进行选择并配置可选的功能
  • 应根据数据用途对 SPI 通道进行定义,其缓冲区域可以位于 SPI 处理程序/驱动程序(IB)内部或由用户提供(EB)的缓冲区域
  • 应根据 HW 属性 (CS) 对 SPI 作业进行定义,并且它们(SPI 作业)将包含使用这些属性的通道的列表
  • 最后一步,应定义 SPI 作业的序列,以便以排序的方式(优先级排序)对数据进行传输。

根据被调用的 API 函数及被选择的功能级别,SPI 处理程序/驱动程序可以以同步/异步的方式对数据帧进行传输。

该规范涵盖了处理程序/驱动程序的功能,这些功能被组合在同一个模块中。一部分是 SPI 处理程序,被用于处理可能位于 ECU 抽象层中的对总线的多个访问。另一部分是 SPI 驱动程序,被用于直接地访问可能位于微控制器抽象层中的微控制器硬件。

首字母缩略词和缩写


在本文档范围内且不被包含在 AUTOSAR 词汇表中的首字母缩略词和缩写将在本文档词汇表中被列出。




相关文档


AUTOSAR 的交付文档

[1] Layered Software Architecture 
  • AUTOSAR_EXP_LayeredSoftwareArchitecture

[2] General Requirements on SPAL 
  • AUTOSAR_SRS_SPALGeneral

[3] General Requirements on Basic Software Modules 
  • AUTOSAR_SRS_BSWGeneral

[4] Specification of Default Error Tracer 
  • AUTOSAR_SWS_DefaultErrorTracer

[5] Specification of ECU Configuration 
  • AUTOSAR_TPS_ECUConfiguration

[6] Requirements on SPI Handler/Driver 
  • AUTOSAR_SRS_SPIHandlerDriver

[7] Specification of Diagnostic Event Manager 
  • AUTOSAR_SWS_DiagnosticEventManager

[8] Glossary 
  • AUTOSAR_TR_Glossary

[9] Specification of MCU Driver 
  • AUTOSAR_SWS_MCUDriver 

[10] Specification of PORT Driver 
  • AUTOSAR_SWS_PORTDriver  

[11] Basic Software Module Description Template,  
  • AUTOSAR_TPS_BSWModuleDescriptionTemplate

[12] List of Basic Software Modules 
  • AUTOSAR_TR_BSWModuleList  

[13] Specification of Standard Types, 
  • AUTOSAR_SWS_StandardTypes

[14] General Specification of Basic Software Modules 
  • AUTOSAR_SWS_BSWGeneral

相关标准和规范

AUTOSAR 提供了关于基础软件模块的通用规范 [14](AUTOSAR_SWS_BSWGeneral),该规范也适用于 SPI 处理程序/驱动程序。

因此,规范 AUTOSAR_SWS_BSWGeneral 应被视为 SPI 处理程序/驱动程序的附加规范及必需规范。

约束和假设


限制

[SWS_Spi_00040]

[ ]
  • SPI 处理程序/驱动程序仅对主模式进行处理。

[SWS_Spi_00050]

[ ]
  • SPI 处理程序/驱动程序仅支持全双工模式。

对其他模块的依赖


[SWS_Spi_00244]

[ ]
  • SPI 处理程序/驱动程序模块并不负责在其初始化函数中对被用于配置时钟、预分频器和 PLL 的寄存器进行设置。这些设置操作必须由 MCU 模块完成 [9]。

注意:

SPI 外设可能依赖于系统时钟、预分频器和 PLL。因此,系统时钟的任何变化(例如,PLL 开启,PLL 关闭,时钟分频器)也可能影响 SPI 硬件的时钟设置。

[SWS_Spi_00342]

[ ]
  • 依据微控制器的类型,SPI 外设可以与其他外设共享寄存器。在这种情况下,SPI 处理程序/驱动程序与 MCU 模块 [9] 之间存在依赖关系(关于对这些寄存器的初始化和逆初始化)。

[SWS_Spi_00343]

[ ]
  • 如果需要使用微控制器的引脚进行片选操作,则 SPI 处理程序/驱动程序与 PORT 模块 [10] 之间存在依赖关系。在这种情况下,本规范假设这些微控制器的引脚由 SPI 处理程序/驱动程序模块直接地访问,而无需对 DIO 模块的 API 进行使用。无论如何,SPI 依赖于 ECU 的硬件设计,因此它可能会依赖于其他模块。

需求可追溯性



功能定义


SPI(Serial Peripheral Interface)具有一个 4 线同步串行接口。对数据通信的使能由片选线(CS)控制。对数据的传输由 3 线接口控制,该接口由串行数据输出线(MOSI)、串行数据输入线(MISO)和串行时钟线(CLOCK)组成。

功能和特性的概览

本规范基于先前规范的经验以及已被确定的主要用例。本节旨在对独立的 SPI 处理程序/驱动程序的可扩展性如何将一个满足简单需求的简单模块扩展为一个满足增强需求的智能模块进行总结。


本文档指定了以下 3 个关于 SPI 处理程序/驱动程序的可扩展的功能的级别:
  • LEVEL 0,简单的同步 SPI 处理程序/驱动程序:
    • 基于同步处理(使用轮询机制)的通信,并采用 FIFO 策略来处理多个访问。对缓冲区的使用为可配置的,以优化和/或利用硬件的能力。
  • LEVEL 1,基础的异步 SPI 处理程序/驱动程序:
    • 基于异步处理(在执行期间(选择性地)使用中断或轮询机制)的通信,并采用优先级策略来处理多个访问。对缓冲区的使用与 LEVEL 0 中的一致。
  • LEVEL 2,增强的(同步/异步)SPI 处理程序/驱动程序:
    • 基于异步处理(在执行期间(选择性地)使用中断或轮询机制)或同步处理的通信,并采用优先级策略来处理多个访问。对缓冲区的使用与 LEVEL 0 中的一致。

在 LEVEL 0 的情况下,即使已经为在同步传输中被使用的作业和/或序列指定了通知函数,这些函数也不会被调用。

[SWS_Spi_00109]

[SRS_Spi_13401]
  • SPI 处理程序/驱动程序的可扩展的功能的级别应始终是被静态地配置的(即在预编译阶段对其进行配置以允许最佳的源代码优化)。

[SWS_Spi_00110]

[SRS_Spi_13400]
  • 应根据所述的级别(0、1 或 2)将 SpiLevelDelivered 参数配置为 3 个值中的一个,以选择 SPI 处理程序/驱动程序的可扩展的功能的级别。

为了提高可扩展性,每个可扩展的功能的级别都提供了可配置(开启/关闭)或可选的功能。将在专门的章节中对其进行详细地描述。

一般行为

本章节一方面介绍了每个可扩展的功能的级别的一般行为和配置,另一方面详细地说明了每个可扩展的功能的级别的行为以及可选的功能。

[SWS_Spi_00041]

[SRS_Spi_12093]
  • SPI 处理程序/驱动程序的接口配置应基于在本文档中被定义的通道、作业和序列(参见第 2 章)。

[SWS_Spi_00034]

[SRS_Spi_12093]
[SRS_Spi_12256]
[SRS_Spi_12257]
  • SPI 处理程序/驱动程序应对一个或多个通道、作业及序列进行支持,以驱动所有类型的与 SPI 兼容的硬件。

[SWS_Spi_00255]

[ ] 
  • 应根据通道、作业及序列的配置参数对数据进行传输。

[SWS_Spi_00066]

[SRS_Spi_12094]
[SRS_Spi_12257]
[SRS_Spi_12032]
[SRS_Spi_12033]
  • 片选 (CS) 应被附加到对作业的定义中。

[SWS_Spi_00263]

[ ]
  • 片选 (CS) 应在作业的传输过程中被处理,并在传输结束时被释放。应根据作业的配置参数对片选 (CS) 进行处理。

[SWS_Spi_00370]

[ ]
  • 可以定义对片选 (CS) 的处理是否由硬件自主地完成,无需驱动程序明确地对片选 (CS) 进行处理,或者驱动程序是否应将片选 (CS) 线明确地作为 DIO 来驱动(参见 [ECUC_Spi_00212])。

当 SpiCsSelection = CS_VIA_GPIO 时,应由具体实现来决定在 SpiCsBehavior 中被配置的片选 (CS) 行为是否适用。

示例:

在作业的传输过程开始时,将片选 (CS) 设置为活动状态,并保持该状态直到该作业的所有通道的传输结束,之后将片选 (CS) 设置为非活动状态。根据用户的需求及本软件规范,每个通道仅会被定义一次,但可被分配给多个作业。

[SWS_Spi_00065]

[SRS_Spi_12257]
[SRS_Spi_12179]
[SRS_Spi_12258]
[SRS_Spi_12180]
[SRS_Spi_12181]
[SRS_Spi_12199]
[SRS_Spi_12200]
[SRS_Spi_12261]
[SRS_Spi_12201]
[SRS_Spi_12262]
  • 一个作业 (Job) 应至少包含一个通道。

[SWS_Spi_00368]

[ ]
  • 每个通道都应有一个索引,被用于指定该通道在作业 (Job) 中的顺序。

[SWS_Spi_00262]

[ ]
  • 如果一个作业 (Job) 包含多个通道,则所有被包含的通道在传输过程中都应具有相同的作业 (Job) 属性,并且应被静态地链接在一起。

根据用户的需求及本软件规范,每个作业 (Job) 仅会被定义一次,但可被分配给多个序列。

[SWS_Spi_00003]

[SRS_Spi_12179]
[SRS_Spi_12258]
[SRS_Spi_12180]
[SRS_Spi_12199]
[SRS_Spi_12200]
[SRS_Spi_12261]
[SRS_Spi_12201]
[SRS_Spi_12262] 
  • 一个序列应至少包含一个作业 (Job) 。

[SWS_Spi_00236]

[ ]
  • 如果一个序列包含多个作业 (Job),则所有被包含的作业 (Job) 在传输过程中都应具有相同的序列属性,并且应被静态地链接在一起。

应该对被用于传输的通道的参数进行配置,且允许将空指针作为源的指针或目标的指针以生成虚拟的传输(另请参阅 [SWS_Spi_00028][SWS_Spi_00030])。


注意:

与上图对应的配置为 SpiCsBehavior = CS_KEEP_ASSERTED。

通道的数据可能因负责处理的硬件和给定的用户(位于应用层中的客户端)的不同而有所差异。在客户端中,将根据 SpiDataWidth 以 8、16 或 32 位(bit)的模式对数据进行处理(参见第 8.2.5 章)。在微控制器中,硬件将对数据长度为 1 到 32 位(bit)之间的数据进行处理,或对固定数据长度(8 或 16 位(bit))的数据进行处理,且可以对每个通道的数据长度进行配置(参见 SpiDataWidth)。

[SWS_Spi_00149]

[ ]
  • SPI 处理程序/驱动程序应注意通道中的帧(SpiDataWidth)和数据访问中的数据类型(由 [SWS_Spi_00437] 提供)在数据长度上的差异。

[SWS_Spi_00289]

[ ]
  • 如果(所使用的)数据长度(SpiDataWidth)完全相同(8、16 或 32 位(bit)),则 SPI 处理程序/驱动程序可以直接地发送和接收数据而无需对位(bit)宽进行任何调整。

[SWS_Spi_00290]

[ ]
  • 如果数据访问中的数据类型的数据长度大于 SPI 处理程序/驱动程序中的数据长度,例如,SpiDataWidth 为 12 位(bit),数据访问中的数据类型为 16 位(bit),则:
    • 当通过 SPI 处理程序/驱动程序对数据进行传输时,应对低地址位(0 ~ 11 位(bit))的数据进行传输,并忽略高地址位(12 ~ 15 位(bit))的数据。
    • 当通过 SPI 处理程序/驱动程序对数据进行接收时,应将接收到的数据的数据长度扩充为 16 位(bit),并使用 0 填充高地址位(12 ~ 15 位(bit))的数据。

这将确保用户始终获得相同的接口。

[SWS_Spi_00437]

[ ]
  • 应根据 SpiDataWidth 以 uint8、uint16 或 uint32 的形式对数据缓冲区进行访问(独立于 Spi_DataBufferType),数据访问将使用以下类型转换:
    • uint8:SpiDataWidth < 9
    • uint16:9 =< SpiDataWidth < 17
    • uint32:17 =< SpiDataWidth

常见的可配置的功能:被允许的通道的缓冲区

为了充分地利用微控制器的所有功能,同时也为了发送/接收在专用内存中的数据,所有 SPI 处理程序/驱动程序的可扩展的功能的级别都具有与通道的缓冲区的位置相关的可选功能。

因此,可以通过配置对两种主要类型的通道缓冲方式进行使用:
  • 内部缓冲通道(IB):被发送/接收的数据的缓冲区由 SPI 处理程序/驱动程序提供。
  • 外部缓冲通道(EB):被发送/接收的数据的缓冲区由用户(静态和/或动态地)提供。

两种通道缓冲方式均可能被使用,具体取决于以下所述的 3 种用例:
  • 使用方式 0:SPI 处理程序/驱动程序仅管理内部缓冲区。 
  • 使用方式 1:SPI 处理程序/驱动程序仅管理外部缓冲区。
  • 使用方式 2:SPI 处理程序/驱动程序同时管理两种类型的缓冲区。

[SWS_Spi_00111]

[SRS_Spi_13401]
  • 应根据被描述的使用方式,将 SpiChannelBuffersAllowed 参数配置为 3 个值(0、1 或 2)中的一个。

[SWS_Spi_00279]

[ ]
  • 应通过对 SpiChannelBuffersAllowed 参数进行配置以选择 SPI 处理程序/驱动程序管理的通道的缓冲区。

IB 通道的行为

内部缓冲通道旨在利用微控制器硬件内部的缓冲功能。否则,需要通过软件来模拟该功能。

[SWS_Spi_00052]

[SRS_Spi_12025]
[SRS_Spi_12253]
  • 对于 IB 通道,SPI 处理程序/驱动程序将提供缓冲区,但无法保证传输期间缓冲区中的数据的一致性。通道的缓冲区的大小是固定的。

[SWS_Spi_00049]

[ ]
  • 接收到的通道的数据应被存储在对应通道的内部缓冲区(深度为 1 个条目)中。SPI 处理程序/驱动程序不应关注(处理)同一通道上的其他传输对缓冲区中的被接收的数据的覆盖。

[SWS_Spi_00051]

[ ]
  • 待传输的通道的数据应被复制到对应通道的内部缓冲区(深度为 1 个条目)中。

[SWS_Spi_00257]

[ ] 
  • SPI 处理程序/驱动程序无法阻止用户在传输过程中对缓冲区中的待被传输的数据进行覆盖。

[SWS_Spi_00438]

[ ]
  • SPI 处理程序/驱动程序应为发送和接收提供单独的缓冲区,以确保待传输的数据不会被接收到的数据覆盖。

EB 通道的行为

外部缓冲通道旨在复用外部的现存缓冲区。这意味着 SPI 处理程序/驱动程序不会对它们进行监控。

[SWS_Spi_00053]

[SRS_SPAL_12075]
[SRS_Spi_12025]
[SRS_Spi_12198]
[SRS_Spi_12200]
[SRS_Spi_12261]
[SRS_Spi_12262]
[SRS_Spi_12202]
[SRS_Spi_12103]
  • 对于 EB 通道,应用程序将提供缓冲区,并关注(处理)传输期间缓冲区中的数据的一致性。

[SWS_Spi_00112]

[ ] 
  • 通道的缓冲区的大小可以是固定的,也可以是变化的。通道的缓冲区的最大大小应由配置决定。

[SWS_Spi_00280]

[ ]
  • 应用程序为 SPI 处理程序/驱动程序提供的缓冲区的大小可能各不相同。

对缓冲通道的使用

下表提供了有关通道的特性的信息:


注意:

对于每个通道,如果当前通道被配置为内部缓冲通道(IB),则用户应配置内部缓冲通道(IB)的缓冲区的数量(至少为 1)。如果当前通道被设置为外部缓冲通道(EB),则用户应配置外部缓冲通道(EB)的缓冲区的大小。

LEVEL 0 - 简单的同步行为

此可扩展的功能的级别旨在为 SPI 处理程序/驱动程序提供一组精简的服务,以(仅)处理简单的同步传输。这通常被用于使用简单的 SPI 网络的 ECU,同时也被用于使用高速的外设的 ECU。

简单的同步传输意味着,对传输服务进行调用的函数将在传输过程中被阻塞,直至传输完成。

[SWS_Spi_00160]

[ ] 
  • 可扩展的功能的级别为 LEVEL 0 的 SPI 处理程序/驱动程序应提供对于 SPI 总线的同步的传输服务。

[SWS_Spi_00161]

[ ]
  • 对于可扩展的功能的级别为 LEVEL 0 的 SPI 处理程序/驱动程序,当不存在任何正在进行的传输序列时,SPI 处理程序/驱动程序应处于空闲状态 SPI_IDLE

[SWS_Spi_00294]

[ ] 
  • 独立的 SPI 处理程序/驱动程序能够根据所使用的微控制器处理 1 到 n 个 SPI 总线。

SPI 总线会被分配给作业(Job),而不是序列。不同 SPI 总线上的作业(Job)可以被分配给同一个序列。因此:

[SWS_Spi_00114]

[ ]
  • 如果待被传输的序列使用不同的总线,且参数 SPI_SUPPORT_CONCURRENT_SYNC_TRANSMIT 被启用,则可扩展的功能的级别为 LEVEL 0 的 SPI 处理程序/驱动程序应接受对 Spi_SyncTransmit 的并发式调用。此功能默认被禁用,这意味着,在序列被传输期间,所有其他对序列的传输请求都将被拒绝。

[SWS_Spi_00115]

[ ]
  • 可扩展的功能的级别为 LEVEL 0 的 SPI 处理程序/驱动程序的行为都应包含以下功能:对缓冲区的使用为可配置的。

[SWS_Spi_00084]

[SRS_Spi_12170]
  • 如果不同的作业(Job)(以及序列)包含相同的通道,则 SPI 处理程序/驱动程序的运行时环境应确保在通过该通道进行传输期间不会对该通道调用读取和/或写入函数。

[SWS_Spi_00384]

[ ]
  • 当检测到硬件错误时,SPI 处理程序/驱动程序应停止当前的序列,并根据配置向 DEM 报告错误,以及将作业(Job)的状态设置为 SPI_JOB_FAILED,并将序列的状态设置为 SPI_SEQ_FAILED

当对通道的数据进行传输时,读写函数无法保证数据的完整性。

LEVEL 1 - 基本的异步行为

此可扩展的功能的级别旨在为 SPI 处理程序/驱动程序提供一组精简的服务,以(仅)处理异步传输。这通常被用于使用具有不同优先级的 SPI 网络的 ECU,同时也被用于使用低速的外设的 ECU。

异步传输意味着,对传输服务进行调用的用户不会在传输过程中被阻塞。此外,在传输结束时用户会收到相应的通知。

通常,根据软件设计,可以通过轮询或中断机制来对异步传输的结束进行检测。此可扩展的功能的级别建议同时对这两种机制进行使用,可在执行期间对其进行选择。

[SWS_Spi_00156]

[ ]
  • 可在执行期间对轮询或中断机制进行选择(参见 [SWS_Spi_00188]),以处理 SPI 总线。

[SWS_Spi_00162]

[SRS_Spi_12099]
[SRS_Spi_12101]
[SRS_Spi_12103]
  • 可扩展的功能的级别为 LEVEL 1 的 SPI 处理程序/驱动程序应提供对于 SPI 总线的异步的传输服务。异步传输意味着,对传输服务进行调用的用户不会在传输过程中被阻塞。

[SWS_Spi_00295]

[ ] 
  • 可扩展的功能的级别为 LEVEL 1 的 SPI 处理程序/驱动程序应提供对于 SPI 总线的异步的传输服务。此外,在传输结束时用户会收到相应的通知。

[SWS_Spi_00163]

[SRS_Spi_12099]
[SRS_Spi_12101]
[SRS_Spi_12103]
  • 对于可扩展的功能的级别为 LEVEL 1 的 SPI 处理程序/驱动程序,当不存在任何正在进行的传输序列时,SPI 处理程序/驱动程序应处于空闲状态 SPI_IDLE

该 SPI 处理程序/驱动程序将被多个软件模块使用,这些模块可能相互独立,或位于不同的层(BSW,APP)。因此,需要为作业(Job)分配优先级以处理并发访问的情况(这些情况通常发生在基于异步机制的实时系统中)。

[SWS_Spi_00002]

[SRS_Spi_12260]
  • 在为作业(Job)分配优先级后。序列中的(已被链接的)作业(Job)的优先级应为相同或递减的。这意味着,与序列中的其它作业(Job)的优先级相比,序列中的第一个作业(Job)的优先级应为相同或最高的。

[SWS_Spi_00093]

[SRS_Spi_12260]
[SRS_Spi_12150] 
  • 按照定义,应按从低到高的顺序对作业(Job)的优先级进行排列,数值越高代表优先级越高(例如,有 4 个优先级(0 ~ 3),0 代表最低的优先级,3 代表最高的优先级)。

通过作业(Job)的优先级,SPI 处理程序/驱动程序需要依据具体的规则在并发访问的情况下做出决策。

[SWS_Spi_00059]

[SRS_Spi_12260]
[SRS_Spi_12037]
  • SPI 处理程序/驱动程序的调度应保证具有最高优先级的作业(Job)被优先处理。

独立的 SPI 处理程序/驱动程序能够根据所使用的微控制器处理 1 到 n 个 SPI 总线。

SPI 总线会被分配给作业(Job),而不是序列。不同 SPI 总线上的作业(Job)可以被分配给同一个序列。因此:

[SWS_Spi_00116]

[ ]
  • 可扩展的功能的级别为 LEVEL 1 的 SPI 处理程序/驱动程序允许在同一时间对多个序列进行传输。这意味着,在序列被传输期间,所有其他对序列的传输请求需要被评估(根据正在被处理的作业(Job)),以决定是否对其进行处理。

[SWS_Spi_00117]

[ ]
  • 可扩展的功能的级别为 LEVEL 1 的 SPI 处理程序/驱动程序的行为都应包含以下功能:对缓冲区的使用为可配置的,并包含被配置的异步功能:可被中断的序列(参见下一章)。

[SWS_Spi_00267]

[ ]
  • 当检测到硬件错误时,SPI 处理程序/驱动程序应停止当前的序列,并根据配置向 DEM 报告错误,以及将作业(Job)的状态设置为 SPI_JOB_FAILED,并将序列的状态设置为 SPI_SEQ_FAILED

[SWS_Spi_00118]

[SRS_Spi_12108]
  • 如果作业(Job)被配置了特定的在传输结束时被调用的通知函数,则 SPI 处理程序/驱动程序应在作业(Job)传输结束时调用该通知函数。

[SWS_Spi_00281]

[ ]
  • 如果序列被配置了特定的在传输结束时被调用的通知函数,则 SPI 处理程序/驱动程序应在序列传输结束时调用该通知函数。

[SWS_Spi_00119]

[SRS_Spi_12108]
  • 如果作业(Job)被配置了有效的通知函数(参见 [SWS_Spi_00071]),则 SPI 处理程序/驱动程序应在作业(Job)传输结束时调用该通知函数,无论作业(Job)传输的结果是 SPI_JOB_FAILED 还是 SPI_JOB_OK(合理性:避免死锁或无限循环)。

[SWS_Spi_00120]

[SRS_Spi_12108]
  • 如果序列被配置了有效的通知函数(参见 [SWS_Spi_00073]),则 SPI 处理程序/驱动程序应在序列传输结束时调用该通知函数,无论序列传输的结果是 SPI_SEQ_FAILEDSPI_SEQ_OK 还是 SPI_SEQ_CANCELLED(合理性:避免死锁或无限循环)。

可配置的异步功能:可被中断的序列

为了使用异步传输机制,可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序具有挂起序列传输的可选功能。

因此,可以通过配置对两种主要类型的序列进行使用:
  • 不可被中断的序列:在序列传输结束前,每个已被启动的序列传输将不会被 SPI 处理程序/驱动程序挂起。
  • 混合序列:根据配置,每个已被启动的序列传输将会被 SPI 处理程序/驱动程序挂起(在两个连续的作业(Job)之间)。

[SWS_Spi_00121]

[SRS_Spi_13401]
  • SPI 处理程序/驱动程序的运行时环境应对参数 SpiInterruptibleSeqAllowed 进行配置,以配置 SPI 处理程序/驱动程序管理的序列的类型。

不可被中断的序列的行为

对于只对非阻塞的传输进行使用的情况。不可被中断的序列旨在提供一个基于基本的异步机制的简单的软件模块。

[SWS_Spi_00122]

[SRS_Spi_13401]
  • 当参数 SpiInterruptibleSeqAllowed 被配置为 OFF 时,可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序中的可被中断的序列将不被允许使用。

[SWS_Spi_00123]

[ ]
  • 当 SPI 处理程序/驱动程序中的可被中断的序列不被允许(根据配置)使用时,所有被声明的序列都将被视为不可被中断的序列(此需求并不旨在强制使用任何实现,而只是确保所有序列都将被视为不可被中断的序列)。

[SWS_Spi_00282]

[ ]
  • 当 SPI 处理程序/驱动程序中的可被中断的序列不被允许(根据配置)使用时,可以忽略对参数 SpiInterruptibleSequence 的配置,或者将其配置为默认值 FALSE。

[SWS_Spi_00124]

[SRS_Spi_12037]
  • 根据 [SWS_Spi_00116][SWS_Spi_00122] 的要求,SPI 处理程序/驱动程序不得挂起已被启动的序列传输,以处理其它序列传输。

混合序列的行为

混合序列旨在提供一个带有特定的异步机制的软件模块。例如,当对非常长的序列进行使用时,其应被具有更高优先级的其他序列挂起。

[SWS_Spi_00125]

[SRS_Spi_13401]
  • 当参数 SpiInterruptibleSeqAllowed 被配置为 ON 时,可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序中的可被中断的序列将被允许使用。

[SWS_Spi_00126]

[ ]
  • 当 SPI 处理程序/驱动程序中的可被中断的序列被允许(根据配置)使用时,所有序列都应具有与其对应的参数 SpiInterruptibleSequence(参见 [ECUC_Spi_00106]),以识别该序列在传输期间是否可以被挂起。

[SWS_Spi_00014]

[SRS_Spi_12260]
[SRS_Spi_12037]
  • 根据 [SWS_Spi_00125] 的要求,当序列被配置为可被中断的序列时,SPI 处理程序/驱动程序将被允许挂起已被启动的序列传输,以处理其它(具有更高优先级的作业(Job))序列传输(参见 [SWS_Spi_00002][SWS_Spi_00093])。这意味着,当一个(属于可被中断的序列的)作业(Job)传输结束时,如果存在另一个待被处理的序列传输,SPI 处理程序/驱动程序将重新进行调度,以选择下一个被处理的作业(Job)传输。

[SWS_Spi_00127]

[SRS_Spi_12037]
  • 根据 [SWS_Spi_00125] 的要求,当序列被配置为不可被中断的序列时,SPI 处理程序/驱动程序不得挂起已被启动的序列传输,以处理其它序列传输。

[SWS_Spi_00080]

[ ]
  • 当对可被中断的序列进行使用时,应注意,如果存在多个对同一个通道进行访问的序列,则在此通道中,具有低优先级的作业(Job)的数据可能会被具有高优先级的作业(Job)的数据覆盖。

LEVEL 2 - 增强的行为

此可扩展的功能的级别旨在为 SPI 处理程序/驱动程序提供一整套服务,以处理同步和异步传输。这通常被用于使用具有不同优先级的 SPI 网络的 ECU,同时也被用于使用不同速率的外设的 ECU。通常,根据软件设计,可以通过轮询或中断机制来对异步传输的结束进行检测。此可扩展的功能的级别建议同时对这两种机制进行使用,可在执行期间对其进行选择。

同步传输适用于可扩展的功能的级别为 LEVEL 0 的需求。

异步传输适用于可扩展的功能的级别为 LEVEL 1 的需求。

[SWS_Spi_00128]

[ ] 
  • 可扩展的功能的级别为 LEVEL 2 的 SPI 处理程序/驱动程序应提供对于 SPI 总线的同步和异步的传输服务。

[SWS_Spi_00283]

[ ] 
  • 对于可扩展的功能的级别为 LEVEL 2 的 SPI 处理程序/驱动程序,当不存在任何正在进行的传输序列时,SPI 处理程序/驱动程序应处于空闲状态 SPI_IDLE

对调度的建议

对于可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序(仅异步),在作业(Job)和/或序列传输结束时用户会收到相应的通知(参见 [SWS_Spi_00118])。其次,对于可被中断的序列,如果存在另一个待被处理的序列传输,SPI 处理程序/驱动程序将重新进行调度,以选择下一个被处理的作业(Job)传输(参见 [SWS_Spi_00014])。

[SWS_Spi_00088]

[ ] 
  • 对于可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序(仅异步),在作业(Job)传输结束时,对应的通知函数将被调用。

[SWS_Spi_00268]

[ ] 
  • 对于可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序(仅异步),在序列传输结束时,对应的通知函数将被调用。

[SWS_Spi_00269]

[ ]
  • 对于可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序(仅异步),以及可被中断的序列,如果存在另一个待被处理的序列传输,SPI 处理程序/驱动程序将重新进行调度,以选择下一个被处理的作业(Job)传输。

[SWS_Spi_00270]

[ ]
  • 当对通知函数的调用和对调度的处理完全由软件负责时,应确保对调度的处理在对通知函数的调用之前被完成。

错误分类

开发错误

[SWS_Spi_91001]

[ ]

运行时错误

[SWS_Spi_91002]

[ ]

扩展的产品错误

[SWS_Spi_00383]

[ ]

[SWS_Spi_00385]

[ ] 
  • 在 SPI 传输状态寄存器中,当任何错误位被置位时,应通过调用 Dem_SetEventStatus(SPI_E_HARDWARE_ERROR, DEM_EVENT_STATUS_FAILED),将 SPI 传输状态寄存器的信息报告给 DEM。

[SWS_Spi_00386]

[ ]
  • 在 SPI 传输状态寄存器中,当没有错误位被置位时,应通过调用 Dem_SetEventStatus(SPI_E_HARDWARE_ERROR, DEM_EVENT_STATUS_PASSED),将 SPI 传输状态寄存器的信息报告给 DEM。

API 规范


导入的类型

本章列出了以下模块包含的所有类型:

[ ]
[ ]

类型定义

Spi_ConfigType 

[SWS_Spi_00372]

[ ]

Spi_StatusType 

[SWS_Spi_00373]

[SRS_BSW_00406]
[SRS_BSW_00335]

[SWS_Spi_00061]

[SRS_BSW_00335] 
  • 枚举类型 Spi_StatusType 定义了 SPI 处理程序/驱动程序的状态的取值范围。它提供了有关 SPI 处理程序/驱动程序的状态的信息或有关特定的 SPI 硬件的信息。

[SWS_Spi_00259]

[ ]
  • 可以通过调用 Spi_GetStatus 来获取类型为 Spi_StatusType 的值。

[SWS_Spi_00260]

[ ]
  • 可以通过调用 Spi_GetHWUnitStatus 来获取类型为 Spi_StatusType 的值。

[SWS_Spi_00011]

[ ] 
  • 在复位后,类型为 Spi_StatusType 的值应为默认值 SPI_UNINIT

[SWS_Spi_00345]

[ ]
  • 当 SPI 处理程序/驱动程序处于被初始化或不可用的状态时,Spi_GetStatus 应返回 SPI_UNINIT

[SWS_Spi_00346]

[ ] 
  • 当 SPI 处理程序/驱动程序当前进行任何作业(Job)传输时,Spi_GetStatus 应返回 SPI_IDLE

[SWS_Spi_00347]

[ ]
  • 当 SPI 处理程序/驱动程序当前正在进行作业(Job)传输时,Spi_GetStatus 应返回 SPI_BUSY

[SWS_Spi_00348]

[ ]
  • 当 SPI 硬件当前进行任何作业(Job)传输时,Spi_GetHWUnitStatus 应返回 SPI_IDLE

[SWS_Spi_00349]

[ ]
  • 当 SPI 硬件当前正在进行作业(Job)传输时,Spi_GetHWUnitStatus 应返回 SPI_BUSY

Spi_JobResultType 

[SWS_Spi_00374]

[ ]

[SWS_Spi_00062]

[SRS_BSW_00335] 
  • 枚举类型 Spi_JobResultType 定义了 SPI 处理程序/驱动程序的作业(Job)的状态的取值范围。

[SWS_Spi_00261]

[ ] 
  • 类型为 Spi_JobResultType 的值将指示 SPI 处理程序/驱动程序的作业(Job)的状态,可以通过使用作业(Job)ID 调用 Spi_GetJobResult 来获取类型为 Spi_JobResultType 的值。

[SWS_Spi_00012]

[ ]
  • 在复位后,类型为 Spi_JobResultType 的值应为默认值 SPI_JOB_OK

[SWS_Spi_00350]

[ ]
  • 对于特定的作业(Job)传输,如果对其的最后一次处理被成功地完成,则 Spi_GetJobResult 应返回 SPI_JOB_OK

Spi_SeqResultType 

[SWS_Spi_00375]

[ ]

[SWS_Spi_00351]

[ ]
  • 在 SPI 处理程序/驱动程序中,定义了一系列类型为 Spi_SeqResultType 的特定的序列的状态。可以通过调用 Spi_GetSequenceResult 来获取类型为 Spi_SeqResultType 的值。

[SWS_Spi_00019]

[SRS_BSW_00335] 
  • 枚举类型 Spi_SeqResultType 定义了 SPI 处理程序/驱动程序的序列的状态的取值范围。

[SWS_Spi_00251]

[ ] 
  • 类型为 Spi_SeqResultType 的值将指示 SPI 处理程序/驱动程序的序列的状态,可以通过使用序列 ID 调用 Spi_GetSequenceResult 来获取类型为 Spi_SeqResultType 的值。

[SWS_Spi_00017]

[ ]
  • 在复位后,类型为 Spi_SeqResultType 的值应为默认值 SPI_SEQ_OK

[SWS_Spi_00352]

[ ] 
  • 对于特定的序列传输,如果对其的最后一次处理被成功地完成,则 Spi_GetSequenceResult 应返回 SPI_SEQ_OK

[SWS_Spi_00353]

[ ]
  • 当 SPI 处理程序/驱动程序当前正在进行序列传输时,Spi_GetSequenceResult 应返回 SPI_SEQ_PENDING,此状态的含义等同于 SPI_BUSY

[SWS_Spi_00354]

[ ] 
  • 对于特定的序列传输,如果对其的最后一次处理被成功地完成,则 Spi_GetSequenceResult 应返回 SPI_SEQ_FAILED

Spi_DataBufferType

[SWS_Spi_00376]

[ ]

[SWS_Spi_00355]

[ ]
  • Spi_DataBufferType(派生自 uint8)定义了数据缓冲区的数据类型,对数据缓冲区的访问方式为动态的(参见 [SWS_Spi_00437]),数据缓冲区(的大小)需要按照 32 位(bit)的方式对齐。

[SWS_Spi_00164]

[ ]
  • Spi_DataBufferType 为数据缓冲区的数据类型。

Spi_NumberOfDataType 

[SWS_Spi_00377]

[ ]

[SWS_Spi_00165]

[ ]
  • Spi_NumberOfDataType 定义了通过通道发送和/或接收的数据(其类型在 [SWS_Spi_00437] 中被定义)的数量。

Spi_ChannelType 

[SWS_Spi_00378]

[ ]

[SWS_Spi_00356]

[ ]
  • Spi_ChannelType 定义了通道的标识符(ID)类型。

[SWS_Spi_00166]

[ ] 
  • Spi_ChannelType 类型的值被用于指定通道的标识符(ID)。

Spi_JobType 

[SWS_Spi_00379]

[ ]

[SWS_Spi_00357]

[ ]
  • Spi_JobType 定义了作业(Job)的标识符(ID)类型。

[SWS_Spi_00167]

[ ]
  • Spi_JobType 类型的值被用于指定作业(Job)的标识符(ID)。

Spi_SequenceType 

[SWS_Spi_00380]

[ ]

[SWS_Spi_00358]

[ ]
  • Spi_SequenceType 定义了作业(Job)所属的序列的标识符(ID)类型。

[SWS_Spi_00168]

[ ]
  • Spi_SequenceType 类型的值被用于指定作业(Job)所属的序列的标识符(ID)。

Spi_HWUnitType 

[SWS_Spi_00381]

[ ]

[SWS_Spi_00359]

[ ]
  • Spi_HWUnitType 定义了 SPI 硬件(单元)的标识符(ID)类型。

[SWS_Spi_00169]

[ ]
  • Spi_HWUnitType 类型的值被用于指定  SPI 硬件(单元)的标识符(ID)。

Spi_AsyncModeType 

[SWS_Spi_00382]

[ ]

[SWS_Spi_00360]

[ ]
  • 通过调用 Spi_SetAsyncMode 来选择异步机制。

[SWS_Spi_00170]

[ ]
  • Spi_AsyncModeType 类型的值被用于指定被异步地处理的 SPI 总线的异步机制。

[SWS_Spi_00150]

[ ]
  • 应在预编译阶段通过对参数 SpiLevelDelivered 进行配置以启用或禁用对 Spi_AsyncModeType 类型的定义(仅适用于可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序)。

[SWS_Spi_00361]

[ ]
  • 如果使用参数 SPI_POLLING_MODE 调用 Spi_SetAsyncMode,则将以轮询的方式实现异步机制。因此,与被异步地处理的 SPI 总线相关的中断将被禁用。

[SWS_Spi_00362]

[ ]
  • 如果使用参数 SPI_INTERRUPT_MODE 调用 Spi_SetAsyncMode,则将以中断的方式实现异步机制。因此,与被异步地处理的 SPI 总线相关的中断将被启用。

函数定义

Spi_Init 

[SWS_Spi_00175]

[ ]

[SWS_Spi_00298]

[ ]
  • Spi_Init 是不可重入的。

[SWS_Spi_00299]

[ ]
  • Spi_Init 提供 SPI 初始化服务。

[SWS_Spi_00013]

[SRS_BSW_00405]
[SRS_BSW_00101]
[SRS_SPAL_12057]
[SRS_SPAL_12125]
  • Spi_Init 将使用参数 ConfigPtr 引用的值初始化所有相关的 SPI 寄存器。

[SWS_Spi_00015]

[SRS_BSW_00406]
[SRS_BSW_00101]
[SRS_SPAL_12057]
  • 在调用 Spi_Init 对 SPI 模块进行初始化后,SPI 处理程序/驱动程序应将自身的状态设置为 SPI_IDLE,并将(所有)序列传输的结果设置为 SPI_SEQ_OK,及将(所有)作业(Job)传输的结果设置为 SPI_JOB_OK

[SWS_Spi_00151]

[ ]
  • 对于可扩展的功能的级别为 LEVEL 2 的 SPI 处理程序/驱动程序(参见 7.2.5 章节),Spi_Init 应默认将 SPI 处理程序/驱动程序的异步机制设置为 SPI_POLLING_MODE,且与 SPI 总线相关的中断将被禁用。

在通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行重新初始化之前,需要通过调用 Spi_DeInit 对 SPI 处理程序/驱动程序进行逆初始化。

应对 Spi_Init 的参数进行检查(如 API 参数检查章节所述)。

Spi_DeInit 

[SWS_Spi_00176]

[ ]

[SWS_Spi_00300]

[ ]
  • Spi_DeInit 是不可重入的。

[SWS_Spi_00301]

[ ]
  • 当对 Spi_DeInit 的调用请求被接受时,Spi_DeInit 应返回 E_OK。

[SWS_Spi_00302]

[ ]
  • 当对 Spi_DeInit 的调用请求不被接受时,Spi_DeInit 应返回 E_NOT_OK。

[SWS_Spi_00303]

[ ]
  • Spi_DeInit 提供 SPI 逆初始化服务。

[SWS_Spi_00021]

[SRS_BSW_00336]
[SRS_SPAL_12163]
[SRS_SPAL_12064]
  • Spi_DeInit 应对 SPI 处理程序/驱动程序进行逆初始化。

[SWS_Spi_00252]

[ ]
  • 当 SPI 处理程序/驱动程序的状态不为 SPI_BUSY 时,Spi_DeInit 应将所有已被初始化的 SPI 硬件的状态设置为相同的值(例如,上电复位)。

[SWS_Spi_00253]

[ ]
  • 当 SPI 处理程序/驱动程序的状态为 SPI_BUSY 时,对 Spi_DeInit 的调用请求应被拒绝。

[SWS_Spi_00022]

[SRS_BSW_00336]
[SRS_SPAL_12163]
  • 在调用 Spi_DeInit 对 SPI 模块进行逆初始化后,SPI 处理程序/驱动程序应将自身的状态设置为 SPI_UNINIT

在通过调用 Spi_DeInit 对 SPI 处理程序/驱动程序进行逆初始化之前,需要保证已通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化,否则,请参见 [SWS_Spi_00046]

Spi_WriteIB 

[SWS_Spi_00177]

[ ]

[SWS_Spi_00304]

[ ]
  • Spi_WriteIB 是可重入的。

[SWS_Spi_00305]

[ ]
  • 当对 Spi_WriteIB 的调用请求被接受时,Spi_WriteIB 应返回 E_OK。

[SWS_Spi_00306]

[ ]
  • 当对 Spi_WriteIB 的调用请求不被接受时,Spi_WriteIB 应返回 E_NOT_OK。

[SWS_Spi_00307]

[ ]
  • Spi_WriteIB 提供向 SPI 处理程序/驱动程序的内部缓冲(IB)通道(由对应的参数指定)写入一个或多个数据的服务。

[SWS_Spi_00018]

[SRS_Spi_12101]
[SRS_Spi_12153]
  • Spi_WriteIB 应向 SPI 处理程序/驱动程序的内部缓冲(IB)通道(由对应的参数指定)写入一个或多个数据。

[SWS_Spi_00024]

[ ]
  • Spi_WriteIB 应将给定的参数指向的数据保存到内部缓冲(IB)区(由 Spi_Init 定义)中。

[SWS_Spi_00023]

[ ]
  • 如果给定的参数 DataBufferPtr 的值为 NULL,则 Spi_WriteIB 将假定待被传输的数据不相关,并使用给定的通道的默认传输值替代待被传输的数据。

[SWS_Spi_00137]

[ ]
  • 应在预编译阶段通过对参数 SpiChannelBuffersAllowed 进行配置以启用或禁用 Spi_WriteIB(该函数仅与内部缓冲(IB)通道相关)。

应对 Spi_WriteIB 的参数进行检查(如 API 参数检查章节所述)。

在调用 Spi_WriteIB 之前,需要保证已通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化,否则,请参见 [SWS_Spi_00046]

Spi_AsyncTransmit 

[SWS_Spi_00178]

[ ]

[SWS_Spi_00308]

[ ]
  • Spi_AsyncTransmit 是可重入的。

[SWS_Spi_00309]

[ ]
  • 当对 Spi_AsyncTransmit 的调用请求被接受时,Spi_AsyncTransmit 应返回 E_OK。

[SWS_Spi_00310]

[ ]
  • 当对 Spi_AsyncTransmit 的调用请求不被接受时,Spi_AsyncTransmit 应返回 E_NOT_OK。

[SWS_Spi_00311]

[ ]
  • Spi_AsyncTransmit 提供向 SPI 总线传输数据的服务。

[SWS_Spi_00020]

[SRS_Spi_12099]
[SRS_Spi_12101]
[SRS_Spi_12103]
  • Spi_AsyncTransmit 应启动传输,及将  SPI 处理程序/驱动程序的状态设置为 SPI_BUSY,并在将序列传输的结果设置为 SPI_SEQ_PENDING返回。

[SWS_Spi_00194]

[ ]
  • 当调用 Spi_AsyncTransmit 时,Spi_AsyncTransmit 应将作业(Job)传输的结果设置为 SPI_JOB_QUEUED,可通过调用 Spi_GetJobResult 获取作业(Job)传输的结果。

[SWS_Spi_00157]

[ ]
  • 当调用 Spi_AsyncTransmit 时,SPI 处理程序/驱动程序应对作业(Job)传输的结果进行处理。当作业(Job)传输开始时,应将作业(Job)传输的结果设置为 SPI_JOB_PENDING

[SWS_Spi_00292]

[ ]
  • 当调用 Spi_AsyncTransmit 时,SPI 处理程序/驱动程序应对作业(Job)传输的结果进行处理。当作业(Job)传输成功地结束时,应将作业(Job)传输的结果设置为 SPI_JOB_OK

[SWS_Spi_00293]

[ ]
  • 当调用 Spi_AsyncTransmit 时,SPI 处理程序/驱动程序应对作业(Job)传输的结果进行处理。当作业(Job)传输成功地结束时,应将作业(Job)传输的结果设置为 SPI_JOB_FAILED

[SWS_Spi_00081]

[ ]
  • 当调用 Spi_AsyncTransmit 且被请求的序列传输的结果为 SPI_SEQ_PENDING 时,SPI 处理程序/驱动程序不应对该请求进行处理,Spi_AsyncTransmit 应返回 E_NOT_OK。

[SWS_Spi_00266]

[ ]
  • 当调用 Spi_AsyncTransmit 且被请求的序列传输的结果为 SPI_SEQ_PENDING 时,SPI 处理程序/驱动程序应报告 SPI_E_SEQ_PENDING 错误(根据 [SWS_BSW_00042][SWS_BSW_00045])。

[SWS_Spi_00086]

[ ]
  • 当调用 Spi_AsyncTransmit,在被请求的序列传输中存在被另一个序列传输包含的作业(Job)传输,且另一个序列传输的结果为 SPI_SEQ_PENDING 时,SPI 处理程序/驱动程序不应对该请求进行处理,Spi_AsyncTransmit 应返回 E_NOT_OK。SPI 处理程序/驱动程序应报告 SPI_E_SEQ_PENDING 错误(根据 [SWS_BSW_00042] 及 [SWS_BSW_00045])。

[SWS_Spi_00035]

[SRS_Spi_12200]
[SRS_Spi_12201]
  • 当对外部缓冲(EB)通道调用 Spi_AsyncTransmit 且已通过 Spi_SetupEB 将源的指针设置为 NULL 时,应使用为每个通道配置的默认传输值替代待被传输的数据(另请参阅 [SWS_Spi_00028])。

[SWS_Spi_00036]

[ ]
  • 当对外部缓冲(EB)通道调用 Spi_AsyncTransmit 且已通过 Spi_SetupEB 将目标的指针设置为 NULL 时,SPI 处理程序/驱动程序应忽略(该通道)接收到的数据(另请参阅 [SWS_Spi_00030])。

[SWS_Spi_00055]

[SRS_Spi_12181]
  • 当对包含被链接的作业(Job)的序列传输调用 Spi_AsyncTransmit 时,Spi_AsyncTransmit 应从序列中的第一个作业(Job)开始,对每个作业(Job)进行传输。

[SWS_Spi_00057]

[SRS_SPAL_00157]
[SRS_Spi_12108]
  • 在由 Spi_AsyncTransmit 启动的序列传输结束时,如果已为该序列传输配置了通知函数,SPI 处理程序/驱动程序应在调用最后一个作业(Job)传输的通知函数(如已配置)之后,调用序列传输的通知函数。

[SWS_Spi_00133]

[ ]
  • 应在预编译阶段通过对参数 SpiLevelDelivered 进行配置以启用或禁用 Spi_AsyncTransmit(仅适用于可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序)。

[SWS_Spi_00173]

[ ]
  • SPI 处理程序/驱动程序的运行时环境应,在对外部缓冲(EB)通道调用 Spi_SetupEB 或对内部缓冲(IB)通道调用 Spi_WriteIB 之后,在调用 Spi_ReadIB 之前,调用 Spi_AsyncTransmit。

应对 Spi_AsyncTransmit 的参数进行检查(如 API 参数检查章节所述)。

在调用 Spi_AsyncTransmit 之前,需要保证已通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化,否则,请参见 [SWS_Spi_00046]

Spi_ReadIB 

[SWS_Spi_00179]

[ ]

[SWS_Spi_00312]

[ ]
  • Spi_ReadIB 是可重入的。

[SWS_Spi_00313]

[ ]
  • 当对 Spi_ReadIB 的调用请求被接受时,Spi_ReadIB 应返回 E_OK。

[SWS_Spi_00314]

[ ]
  • 当对 Spi_ReadIB 的调用请求不被接受时,Spi_ReadIB 应返回 E_NOT_OK。

[SWS_Spi_00315]

[ ]
  • Spi_ReadIB 提供从 SPI 处理程序/驱动程序的内部缓冲(IB)通道(由对应的参数指定)同步地读取一个或多个数据的服务。

[SWS_Spi_00016]

[SRS_Spi_12099]
[SRS_Spi_12152]
  • Spi_ReadIB 应从 SPI 处理程序/驱动程序的内部缓冲(IB)通道(由对应的参数指定)同步地读取一个或多个数据。

[SWS_Spi_00027]

[ ]
  • SPI 处理程序/驱动程序的运行时环境应,在(对该通道)调用传输函数接口后,调用 Spi_ReadIB 以获取内部缓冲(IB)通道中的数据。

[SWS_Spi_00138]

[ ]
  • 应在预编译阶段通过对参数 SpiChannelBuffersAllowed 进行配置以启用或禁用 Spi_ReadIB(仅适用于内部缓冲(IB)通道)。

应对 Spi_ReadIB 的参数进行检查(如 API 参数检查章节所述)。

在调用 Spi_ReadIB 之前,需要保证已通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化,否则,请参见 [SWS_Spi_00046]

Spi_SetupEB 

[SWS_Spi_00180]

[ ]

[SWS_Spi_00316]

[ ]
  • Spi_SetupEB 是可重入的。

[SWS_Spi_00317]

[ ]
  • 当对 Spi_SetupEB 的调用请求被接受时,Spi_SetupEB 应返回 E_OK。当对 Spi_SetupEB 的调用请求不被接受时,Spi_SetupEB 应返回 E_NOT_OK。

[SWS_Spi_00318]

[ ]
  • Spi_SetupEB 提供对 SPI 处理程序/驱动程序的外部缓冲(EB)通道(由对应的参数指定)的缓冲区及数据长度进行设置的服务。

[SWS_Spi_00058]

[SRS_Spi_12103]
  • Spi_SetupEB 应对 SPI 处理程序/驱动程序的外部缓冲(EB)通道(由对应的参数指定)的缓冲区及数据长度进行设置。

[SWS_Spi_00067]

[SRS_Spi_12103]
  • Spi_SetupEB 应使用(参数)给定的值更新指定的通道的缓冲区指针及数据长度。

这些(通道的)属性是持久有效的,当对指定的通道调用传输函数接口时,这些(通道的)属性将被使用。

[SWS_Spi_00028]

[ ]
  • SPI 处理程序/驱动程序的运行时环境调用 Spi_SetupEB 且参数 SrcDataBufferPtr 的值为 NULL 时,传输函数接口(被调用时)应使用为每个通道配置的默认传输值替代待被传输的数据(另请参阅 [SWS_Spi_00035])。

[SWS_Spi_00030]

[ ]
  •  SPI 处理程序/驱动程序的运行时环境调用 Spi_SetupEB 且参数 DesDataBufferPtr 的值为 NULL 时,SPI 处理程序/驱动程序应忽略(该通道)接收到的数据(另请参阅 [SWS_Spi_00036])。

[SWS_Spi_00037]

[ ]
  • 在对外部缓冲(EB)通道调用传输函数接口前,SPI 处理程序/驱动程序的运行时环境应对每个外部缓冲(EB)通道调用一次 Spi_SetupEB。

[SWS_Spi_00139]

[ ]
  • 应在预编译阶段通过对参数 SpiChannelBuffersAllowed 进行配置以启用或禁用 Spi_SetupEB(仅适用于外部缓冲(EB)通道)。

应对 Spi_SetupEB 的参数进行检查(如 API 参数检查章节所述)。

在调用 Spi_SetupEB 之前,需要保证已通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化,否则,请参见 [SWS_Spi_00046]

Spi_GetStatus 

[SWS_Spi_00181]

[ ]

[SWS_Spi_00319]

[ ]
  • Spi_GetStatus 是可重入的。

[SWS_Spi_00320]

[ ]
  • Spi_GetStatus 提供返回 SPI 处理程序/驱动程序的状态的服务。

[SWS_Spi_00025]

[SRS_SPAL_12064]
[SRS_Spi_12104] 
  • Spi_GetStatus 应返回 SPI 处理程序/驱动程序的状态。

Spi_GetJobResult 

[SWS_Spi_00182]

[ ]

[SWS_Spi_00321]

[ ]
  • Spi_GetJobResult 是可重入的。

[SWS_Spi_00322]

[ ]
  • Spi_GetJobResult 提供返回指定的作业(Job)传输的最后一次结果的服务。

[SWS_Spi_00026]

[SRS_SPAL_00157]
[SRS_Spi_12104]
  • Spi_GetJobResult 应返回指定的作业(Job)传输的最后一次结果。

[SWS_Spi_00038]

[SRS_SPAL_00157]
  • SPI 处理程序/驱动程序的运行时环境应调用 Spi_GetJobResult 以确认作业(Job)传输成功与否(SPI_JOB_OK:成功,SPI_JOB_FAILED:失败)。

注意:

对于同一作业(Job)传输,当 SPI 处理程序/驱动程序接受(对其的)新的传输请求时,上一次的传输结果将被覆盖,覆盖后的结果将为 SPI_JOB_QUEUEDSPI_JOB_PENDING

应对 Spi_GetJobResult 的参数进行检查(如 API 参数检查章节所述)。

如果在通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化之前调用 Spi_GetJobResult,返回的结果将为未定义的。

Spi_GetSequenceResult 

[SWS_Spi_00183]

[ ]

[SWS_Spi_00323]

[ ]
  • Spi_GetSequenceResult 是可重入的。

[SWS_Spi_00324]

[SRS_SPAL_00157]
[SRS_Spi_12104]
  • Spi_GetSequenceResult 提供返回指定的序列传输的最后一次结果的服务。

[SWS_Spi_00042]

[SRS_SPAL_00157]
[SRS_Spi_12170]
  • SPI 处理程序/驱动程序的运行时环境应调用 Spi_GetSequenceResult 以确认(整个)序列传输成功与否(SPI_SEQ_OK:成功,SPI_SEQ_FAILED:失败)。

注意:

对于同一序列传输,当 SPI 处理程序/驱动程序接受(对其的)新的传输请求时,上一次的传输结果将被覆盖,覆盖后的结果将为 SPI_SEQ_PENDING

应对 Spi_GetSequenceResult 的参数进行检查(如 API 参数检查章节所述)。

如果在通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化之前调用 Spi_GetSequenceResult,返回的结果将为未定义的。

Spi_GetVersionInfo 

[SWS_Spi_00184]

[ ]

[SWS_Spi_00371]

[ ]
  • 如果启用了 Det,则需要检查参数 versioninfo 的值是否为 NULL。如果值为 NULL,则应上报 SPI_E_PARAM_POINTER 错误。

Spi_SyncTransmit 

[SWS_Spi_00185]

[ ]

[SWS_Spi_00327]

[ ]
  • Spi_SyncTransmit 是可重入的。

[SWS_Spi_00328]

[ ]
  • 当对 Spi_SyncTransmit 的调用请求被接受时,Spi_SyncTransmit 应返回 E_OK。

[SWS_Spi_00329]

[ ]
  • 当对 Spi_SyncTransmit 的调用请求不被接受时,Spi_SyncTransmit 应返回 E_NOT_OK。

[SWS_Spi_00330]

[ ]
  • Spi_SyncTransmit 提供向 SPI 总线传输数据的服务。

[SWS_Spi_00134]

[SRS_Spi_12152]
[SRS_Spi_12153]
[SRS_Spi_12154]
  • 当调用 Spi_SyncTransmit 时,Spi_SyncTransmit 应将  SPI 处理程序/驱动程序的状态设置为 SPI_BUSY可通过调用 SPI_GetStatus 获取SPI 处理程序/驱动程序的状态。

[SWS_Spi_00285]

[ ]
  • 当调用 Spi_SyncTransmit 时,Spi_SyncTransmit 应将序列传输的结果设置为 SPI_SEQ_PENDING可通过调用 Spi_GetSequenceResult 获取序列传输的结果。

[SWS_Spi_00286]

[ ]
  • 当调用 Spi_SyncTransmit 时,Spi_SyncTransmit 应将作业(Job)传输的结果设置为 SPI_JOB_PENDING可通过调用 Spi_GetJobResult 获取作业(Job)传输的结果。

[SWS_Spi_00135]

[SRS_Spi_12093]
  • 当调用 Spi_SyncTransmit 时,如果存在另一个正在被处理的序列传输且参数 SPI_SUPPORT_CONCURRENT_SYNC_TRANSMIT 被设置为禁用,或另一个正在被处理的序列传输与所请求的序列传输的目标 SPI 总线相同,SPI 处理程序/驱动程序不应对该请求进行处理,Spi_SyncTransmit 应返回 E_NOT_OK(参见 [SWS_BSW_00114])。SPI 处理程序/驱动程序应报告 SPI_E_SEQ_IN_PROCESS 错误(根据 [SWS_BSW_00042] 及 [SWS_BSW_00045])。

[SWS_Spi_00136]

[ ]
  • 应在预编译阶段通过对参数 SpiLevelDelivered 进行配置以启用或禁用 Spi_SyncTransmit(仅适用于可扩展的功能的级别为 LEVEL 0 及 LEVEL 2 的 SPI 处理程序/驱动程序)。

应对 Spi_SyncTransmit 的参数进行检查(如 API 参数检查章节所述)。

Spi_GetHWUnitStatus 

[SWS_Spi_00186]

[ ]

[SWS_Spi_00331]

[ ]
  • Spi_GetHWUnitStatus 是可重入的。

[SWS_Spi_00332]

[ ]
  • Spi_GetHWUnitStatus 提供返回指定 SPI 硬件的状态的服务。

[SWS_Spi_00141]

[ ]
  • Spi_GetHWUnitStatus 应返回指定 SPI 硬件的状态。

[SWS_Spi_00287]

[ ]
  • SPI 处理程序/驱动程序的运行时环境应调用 Spi_GetHWUnitStatus 以确认指定 SPI 硬件的状态(SPI_IDLESPI_BUSY)。

[SWS_Spi_00142]

[ ]
  • 应在预编译阶段通过对参数 SpiHwStatusApi 进行配置以启用或禁用 Spi_GetHWUnitStatus。

应对 Spi_GetHWUnitStatus 的参数进行检查(如 API 参数检查章节所述)。

如果在通过调用 Spi_Init 对 SPI 处理程序/驱动程序进行初始化之前调用 Spi_GetHWUnitStatus,返回的结果将为未定义的。

Spi_Cancel 

[SWS_Spi_00187]

[ ]
  •  

[SWS_Spi_00333]

[ ]
  • Spi_Cancel 是可重入的。

[SWS_Spi_00334]

[ ]
  • Spi_Cancel 提供取消正在被处理的序列传输的服务。

[SWS_Spi_00144]

[ ]
  • Spi_Cancel 应取消正在被处理的指定序列传输(不应取消正在被处理的作业(Job)传输),并将序列传输的结果设置为 SPI_SEQ_CANCELLED

这意味着,Spi_Cancel 应,在当前正在被处理的(如果有)作业(Job)传输结束后,在下一个即将被处理的(如果有)作业(Job)传输开始前,取消指定序列传输。

[SWS_Spi_00145]

[ ] 
  • 当调用 Spi_Cancel 时,Spi_Cancel 应取消指定序列传输并调用该序列传输的通知函数(如果有),而不是对下一个即将被处理的(如果有)作业(Job)传输进行处理。

[SWS_Spi_00146]

[ ] 
  • 应在预编译阶段通过对参数 SpiCancelApi 进行配置以启用或禁用 Spi_Cancel。

SPI 处理程序/驱动程序不应关心由取消序列传输导致的外部设备的损坏或未被定义的状态,SPI 处理程序/驱动程序的运行时环境应处理这些问题。

Spi_SetAsyncMode 

[SWS_Spi_00188]

[ ]

[SWS_Spi_00335]

[ ]
  • Spi_SetAsyncMode 是不可重入的。

[SWS_Spi_00336]

[ ]
  • 当对 Spi_SetAsyncMode 的调用请求被接受时,Spi_SetAsyncMode 应返回 E_OK。

[SWS_Spi_00337]

[ ]
  • 当对 Spi_SetAsyncMode 的调用请求不被接受时,Spi_SetAsyncMode 应返回 E_NOT_OK。

[SWS_Spi_00338]

[ ] 
  • Spi_SetAsyncMode 提供设置被异步地处理的 SPI 总线的异步机制的服务。

[SWS_Spi_00171]

[ ] 
  • 当调用 Spi_SetAsyncMode 时,如果 SPI 处理程序/驱动程序的状态为 SPI_BUSY 且存在正在被处理的异步传输,SPI 处理程序/驱动程序不应变更异步机制(AsyncModeType 类型的值),Spi_SetAsyncMode 应返回 E_NOT_OK。

[SWS_Spi_00172]

[ ]
  • 当调用 Spi_SetAsyncMode 时,如果存在正在被处理的同步传输,SPI 处理程序/驱动程序应根据参数 Mode 设置异步机制(AsyncModeType 类型的值),即使在 SPI 处理程序/驱动程序的状态为 SPI_BUSY 的情况下也是如此,Spi_SetAsyncMode 应返回 E_OK。

[SWS_Spi_00154]

[ ]
  • 应在预编译阶段通过对参数 SpiLevelDelivered 进行配置以启用或禁用 Spi_SetAsyncMode(仅适用于可扩展的功能的级别为 LEVEL 1 及 LEVEL 2 的 SPI 处理程序/驱动程序)。

调度函数

本章列出了由 SPI 处理程序/驱动程序提供的并由 SchM 直接调用的所有函数。

SPI 处理程序/驱动程序需要一个调度函数以实现对以轮询的方式实现的异步模式的管理(参见 [SWS_Spi_00361])。以下指定的函数通过示例说明了如何实现它们(如有需要)。

Spi_MainFunction_Handling 

[SWS_Spi_00189]

[ ]

此函数应轮询被分配给序列传输的 SPI 中断(被链接到 SPI 硬件),以实现状态机的切换。

预期接口

本章列出了 SPI 处理程序/驱动程序所需的由其他模块提供的所有函数。

强制接口

SPI 处理程序/驱动程序需要以下接口以实现其核心功能。

[SWS_Spi_00389]

[ ]

可选接口

SPI 处理程序/驱动程序需要以下接口以实现其可选功能。

[SWS_Spi_00339]

[ ]

可配置的接口

本章列出了所有可对其目标函数进行配置的接口。目标函数通常是一个回调函数。这些接口的名称并不是固定的,因为它们是可配置的。

[SWS_Spi_00075]

[SRS_SPAL_00157] 
  • SPI 处理程序/驱动程序应使用 Spi_JobEndNotification 来通知其他软件模块有关状态或状态的切换。

[SWS_Spi_00264]

[ ]
  • SPI 处理程序/驱动程序应使用 Spi_SeqEndNotification 来通知其他软件模块有关状态或状态的切换。

[SWS_Spi_00265]

[ ]
  • 为了实现回调函数,其他模块需要以预期的方式提供例程。

[SWS_Spi_00044]

[SRS_SPAL_12056] 
  • SPI 处理程序/驱动程序的实现方需要保证对 Spi_JobEndNotification 和 Spi_SeqEndNotification 的实现(做为在初始化数据结构(Spi_ConfigType)中被定义的函数指针)。

[SWS_Spi_00048]

[SRS_BSW_00359]
[SRS_BSW_00360]
[SRS_BSW_00369]
  • Spi_JobEndNotification 和 Spi_SeqEndNotification 不应具有参数或返回值。

[SWS_Spi_00054]

[SRS_SPAL_12056]
  • 如果回调通知函数被配置为 NULL,则不应对回调函数进行调用。

[SWS_Spi_00085]

[ ]
  • 在回调通知函数中,允许使用以下 SPI 处理程序/驱动程序的接口:
    • Spi_ReadIB 
    • Spi_WriteIB 
    • Spi_SetupEB 
    • Spi_GetJobResult 
    • Spi_GetSequenceResult 
    • Spi_GetHWUnitStatus 
    • Spi_Cancel 
  • 其他 SPI 处理程序/驱动程序的接口不被允许使用。

Spi_JobEndNotification 

[SWS_Spi_00192]

[ ]

[SWS_Spi_00340]

[ ]
  • Spi_JobEndNotification 是可重入的。

[SWS_Spi_00071]

[SRS_SPAL_00157]
  • 如果对 Spi_JobEndNotification 进行了配置(非 NULL),SPI 处理程序/驱动程序应在作业(Job)传输结束时调用 Spi_JobEndNotification 指向的目标函数。

注意:

接口可能在中断级别被调用(依据调用的函数)。

Spi_SeqEndNotification 

[SWS_Spi_00193]

[ ]

[SWS_Spi_00341]

[ ]
  • Spi_SeqEndNotification 是可重入的。

[SWS_Spi_00073]

[SRS_SPAL_00157]
  • 如果对 Spi_SeqEndNotification 进行了配置(非 NULL),SPI 处理程序/驱动程序应在序列传输结束时调用 Spi_SeqEndNotification 指向的目标函数。

注意:

接口可能在中断级别被调用(依据调用的函数)。

错误检测

API 参数检查

[SWS_Spi_00004]

[SRS_BSW_00327]
[SRS_BSW_00337]
[SRS_BSW_00385] 
  • 当使用错误的参数对接口进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_PARAM_CHANNEL 错误进行检测。

[SWS_Spi_00237]

[ ] 
  • 当使用错误的参数对接口进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_PARAM_JOB 错误进行检测。

[SWS_Spi_00238]

[ ]
  • 当使用错误的参数对接口进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_PARAM_SEQ 错误进行检测。

[SWS_Spi_00240]

[ ]
  • 当使用错误的参数对接口进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_PARAM_LENGTH 错误进行检测。

[SWS_Spi_00241]

[ ]
  • 当使用错误的参数对接口进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_PARAM_UNIT 错误进行检测。

[SWS_Spi_00031]

[SRS_BSW_00323]
  • 参数 Channel 的值应属于在初始化数据结构中被定义的通道范围内的值,并且通道的类型(IB 或 EB)必须正确(相关错误:SPI_E_PARAM_CHANNEL)。否则,调用应被终止,并返回 E_NOT_OK。

[SWS_Spi_00032]

[SRS_BSW_00323]
  • 参数 Sequence 和 Job 的值应属于指定范围内的值(相关错误:SPI_E_PARAM_SEQ 或  SPI_E_PARAM_JOB)。

[SWS_Spi_00060]

[SRS_BSW_00323]
  • 参数 Length 的值应小于或等于指定缓冲区的最大数据长度(相关错误:SPI_E_PARAM_LENGTH)。

[SWS_Spi_00258]

[ ]
  • 包含参数 Length 的接口被终止时,应返回 E_NOT_OK。

[SWS_Spi_00143]

[ ] 
  • 参数 HWUnit 的值应属于指定范围内的值(相关错误:SPI_E_PARAM_UNIT)。

[SWS_Spi_00288]

[ ]
  • 包含参数 HWUnit 的接口被终止时,应返回 SPI_UNINIT。

[SWS_Spi_00235]

[ ]
  • 当不存在作为参数的初始化数据时,SPI 处理程序/驱动程序的运行时环境应使用 NULL 调用 Spi_Init。

SPI 状态检测

[SWS_Spi_00242]

[ ]
  • 当 SPI 处理程序/驱动程序的运行时环境在 SPI 处理程序/驱动程序被初始化之前对函数接口进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_UNINIT 错误进行检测。

[SWS_Spi_00046]

[SRS_BSW_00406]
  • 当 SPI 处理程序/驱动程序的运行时环境在 SPI 处理程序/驱动程序被初始化之前对函数接口进行调用且对 SPI 处理程序/驱动程序的开发错误的检测被开启时,SPI 处理程序/驱动程序应向 DET 报告 SPI_E_UNINIT 错误(根据配置)。

[SWS_Spi_00246]

[ ] 
  • 当 SPI 处理程序/驱动程序的运行时环境在 SPI 处理程序/驱动程序被初始化之后对 SPI_Init 进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_ALREADY_INITIALIZED 错误进行检测。

[SWS_Spi_00233]

[ ]
  • 当 SPI 处理程序/驱动程序的运行时环境在 SPI 处理程序/驱动程序被初始化之后对 SPI_Init 进行调用且对 SPI 处理程序/驱动程序的开发错误的检测被开启时,SPI 处理程序/驱动程序应报告 SPI_E_ALREADY_INITIALIZED 错误,并不进行任何操作。

SPI 运行时检查

[SWS_Spi_00243]

[ ]
  • 当对错误的序列传输调用函数接口时,SPI 处理程序/驱动程序应能够对 SPI_E_SEQ_PENDING 错误进行检测。

[SWS_Spi_00245]

[ ]
  • 当在错误的时间对同步传输函数接口进行调用时,SPI 处理程序/驱动程序应能够对 SPI_E_SEQ_IN_PROCESS 错误进行检测。

[SWS_Spi_00195]

[ ]
  • 当在同步或异步传输过程中发生硬件错误时,SPI 处理程序/驱动程序应能够对 SPI_E_HARDWARE_ERROR 错误进行检测(参阅 [SWS_Spi_00267][SWS_Spi_00384])。

[SWS_Spi_00254]

[ ]
  • 当对序列传输或作业(Job)传输的处理未被完成时,处理的返回结果(根据处理的类型)应为 E_NOT_OK 或失败的结果(SPI_JOB_FAILED 或 SPI_SEQ_FAILED)。

[SWS_Spi_00256]

[ ]
  • SPI 处理程序/驱动程序不应执行被调用的函数接口(错误发生时),并应返回 E_NOT_OK 或失败的结果(SPI_JOB_FAILED 或 SPI_SEQ_FAILED)。

序列图


初始化


模式切换

以下序列图显示了对 Spi_Init / Spi_DeInit 的调用的示例。


Write/AsyncTransmit/Read (IB) 

一个通道,一个作业(Job)及一个序列

下图展示了对 Spi_WriteIB / Spi_AsyncTransmit / Spi_ReadIB 的调用的示例,序列传输仅包含一个作业(Job)传输(一个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID2 被分配给作业(Job)传输 ID1,作业(Job)传输 ID1 被分配给序列传输 ID0。



多个通道,一个作业(Job)及一个序列

下图展示了对 Spi_WriteIB / Spi_AsyncTransmit / Spi_ReadIB 的调用的示例,序列传输仅包含一个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID2,ID3 被分配给作业(Job)传输 ID1,作业(Job)传输 ID1 被分配给序列传输 ID0。



多个通道,多个作业(Job)及一个序列

下图展示了对 Spi_WriteIB / Spi_AsyncTransmit / Spi_ReadIB 的调用的示例,序列传输包含多个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID0 至 ID3 被分配给作业(Job)传输 ID1(高优先级),通道 ID4 至 ID10 被分配给作业(Job)传输 ID2(低优先级),作业(Job)传输 ID2 没有通知函数。这些作业(Job)传输都被分配给序列传输 ID0。



多个通道,多个作业(Job)及多个序列

下图展示了对 Spi_WriteIB / Spi_AsyncTransmit / Spi_ReadIB 的调用的示例,多个序列传输包含多个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID0 至 ID3 被分配给作业(Job)传输 ID1(高优先级 2),通道 ID4 至 ID10 被分配给作业(Job)传输 ID2(低优先级 1),作业(Job)传输 ID2 没有通知函数,这些作业(Job)传输都被分配给序列传输 ID0(可被中断的)。

通道 ID11 至 ID13 被分配给作业(Job)传输 ID0(高优先级 3),这些作业(Job)传输都被分配给序列传输 ID1(不可被中断的)。



Setup/AsyncTransmit (EB) 

不定数据长度/固定数据长度

[SWS_Spi_00077]

[SRS_Spi_12198]
[SRS_Spi_12200]
[SRS_Spi_12201]
  • 当传输不定长的数据时,在对 Spi_AsyncTransmit 进行调用前,必须对 Spi_SetupEB 进行调用以将数据保存在 SPI 处理程序/驱动程序中。

[SWS_Spi_00078]

[SRS_Spi_12253]
[SRS_Spi_12262]
[SRS_Spi_12202]
  • 当传输定长的数据时,仅在首次对 Spi_AsyncTransmit 进行调用前,才需要对 Spi_SetupEB 进行调用以将数据保存在 SPI 处理程序/驱动程序中。

一个通道,一个作业(Job)及一个序列

下图展示了对 Spi_SetupEB / Spi_AsyncTransmit 的调用的示例,序列传输仅包含一个作业(Job)传输(一个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID2 被分配给作业(Job)传输 ID1,作业(Job)传输 ID1 被分配给序列传输 ID0。



多个通道,一个作业(Job)及一个序列

下图展示了对 Spi_SetupEB / Spi_AsyncTransmit 的调用的示例,序列传输仅包含一个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID2,ID3 被分配给作业(Job)传输 ID1,作业(Job)传输 ID1 被分配给序列传输 ID0。



多个通道,多个作业(Job)及一个序列

下图展示了对 Spi_SetupEB / Spi_AsyncTransmit 的调用的示例,序列传输包含多个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID0 至 ID3 被分配给作业(Job)传输 ID1(高优先级),通道 ID4 至 ID10 被分配给作业(Job)传输 ID2(低优先级),作业(Job)传输 ID2 没有通知函数。这些作业(Job)传输都被分配给序列传输 ID0。



多个通道,多个作业(Job)及多个序列

下图展示了对 Spi_SetupEB / Spi_AsyncTransmit 的调用的示例,多个序列传输包含多个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID0 至 ID3 被分配给作业(Job)传输 ID1(高优先级 2),通道 ID4 至 ID10 被分配给作业(Job)传输 ID2(低优先级 1),作业(Job)传输 ID2 没有通知函数,这些作业(Job)传输都被分配给序列传输 ID0(可被中断的)。

通道 ID11 至 ID13 被分配给作业(Job)传输 ID0(高优先级 3),这些作业(Job)传输都被分配给序列传输 ID1(不可被中断的)。



混合作业(Job)传输

根据通道的配置和序列传输的内部的优先级需求,对不同类型的作业(Job)传输进行处理是可行的。

用户需要知晓哪些通道正在被使用。然后,根据这些通道的类型,对相应的函数接口进行调用。

LEVEL 0 同步传输序列图

Write/SyncTransmit/Read (IB) - 多个通道,多个作业(Job)及一个序列

下图展示了对 Spi_WriteIB / Spi_SyncTransmit / Spi_ReadIB 的调用的示例,序列传输包含多个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID0 至 ID3 被分配给作业(Job)传输 ID1(高优先级),通道 ID4 至 ID10 被分配给作业(Job)传输 ID2(低优先级)。这些作业(Job)传输都被分配给序列传输 ID0。



Setup/SyncTransmit (EB) - 多个通道,多个作业(Job)及一个序列

下图展示了对 Spi_SetupEB / Spi_SyncTransmit 的调用的示例,序列传输包含多个作业(Job)传输(多个通道)。当作业(Job)传输仅进行读取或写入操作时,可跳过写入(仅读取时)或读取(仅写入时)操作。

示例:

通道 ID0 至 ID3 被分配给作业(Job)传输 ID1(高优先级),通道 ID4 至 ID10 被分配给作业(Job)传输 ID2(低优先级)。这些作业(Job)传输都被分配给序列传输 ID0。



配置规范


容器和配置参数

以下章节总结了所有配置参数。参数的详细定义在第 7 章和第 8 章中被描述。可根据需要添加与硬件/实现相关的参数。

[SWS_Spi_00390]

[ ]
  • SPI 处理程序/驱动程序应拒绝实际实现不支持的(分区映射)配置。

Spi



SpiDemEventParameterRefs



SpiGeneral














[SWS_Spi_CONSTR_00001]

[ ]
  • SpiKernelEcucPartitionRef 引用的 ECUC 分区应是 SpiEcucPartitionRef 引用的 ECUC 分区的子集。

[SWS_Spi_CONSTR_00003]

[ ]
  • 如果 SpiEcucPartitionRef 引用了一个或多个 ECUC 分区,则 SpiKernelEcucPartitionRef 的多重性应为 1 ,并应引用 SpiEcucPartitionRef 引用的 ECUC 分区中的一个。

SpiSequence







SpiChannel










SpiChannelList 





SpiJob








SpiExternalDevice
















[SWS_Spi_CONSTR_00002]

[ ]
  • SpiDeviceEcucPartitionRef 引用的 ECUC 分区应是 SpiEcucPartitionRef 引用的 ECUC 分区的子集。

[SWS_Spi_CONSTR_00004]

[ ]
  • 如果 SpiEcucPartitionRef 引用了一个或多个 ECUC 分区,则 SpiDeviceEcucPartitionReff 的多重性应大于 0 ,并应引用 SpiEcucPartitionRef 引用的 ECUC 分区中的一个或多个。

SpiDriver







SpiPublishedInformation



Published information 

For details refer to the chapter 10.3 "Published Information" in SWS_BSWGeneral 

Configuration concept 

There is a relationship between the SPI Handler/Driver module and the modules that use it. This relationship is resolved during the configuration stage and the result of it influences the proper API and behaviour between those modules. 

The user needs to provide to the SPI Handler/Driver part of the configuration to adapt it to its necessities. The SPI Handler/Driver shall take this configuration and provide the needed tools to the user. 

The picture shows the information flow during the configuration of the SPI Handler/Driver. It is shown only for one user, using an External EEPROM Driver as example, but this situation is common to all users of the SPI Handler/Driver. To highlight the situation where more users are affected, several overlapping documents are drawn.


The steps on the diagrams are: 
  • The user (External EEPROM Driver) of SPI Handler/Driver edits a XML configuration file. This XML configuration file is the same used by the user to generate its own configuration. 
  • For each ECU, a XML HW configuration document contains information which should be used in order to configure some parameters. 
  • The "SPI generation tool". The Generation tool (here is reflected only the part that generates code to SPI usage) shall generate the handles to export and the instance of the configuration sets. In this step the software integrator will provide missing information. 
  • SPI instance configuration file. As a result of the generation all the symbolic handlers needed by the user are included in the configuration header file of the SPI Handler/Driver.
  • User gets the symbolic name of handlers. User imports the handle generated to make use of them as requested by its XML configuration file.

Not applicable requirements


[SWS_Spi_NA_00999]
[SRS_BSW_00301]
[SRS_BSW_00302]
[SRS_BSW_00306]
[SRS_BSW_00307]
[SRS_BSW_00308]
[SRS_BSW_00309]
[SRS_BSW_00312]
[SRS_BSW_00325]
[SRS_BSW_00328]
[SRS_BSW_00330]
[SRS_BSW_00331]
[SRS_BSW_00334]
[SRS_BSW_00341]
[SRS_BSW_00342]
[SRS_BSW_00343]
[SRS_BSW_00347]
[SRS_BSW_00375]
[SRS_BSW_00399]
[SRS_BSW_00400]
[SRS_BSW_00401]
[SRS_BSW_00413]
[SRS_BSW_00416]
[SRS_BSW_00417]
[SRS_BSW_00422]
[SRS_BSW_00423]
[SRS_BSW_00424]
[SRS_BSW_00426]
[SRS_BSW_00427]
[SRS_BSW_00428]
[SRS_BSW_00429]
[SRS_BSW_00432]
[SRS_BSW_00433]
[SRS_BSW_00005]
[SRS_BSW_00006]
[SRS_BSW_00009]
[SRS_BSW_00010]
[SRS_BSW_00161]
[SRS_BSW_00164]
[SRS_BSW_00168]
[SRS_BSW_00170]
[SRS_BSW_00172]
[SRS_SPAL_12267]
[SRS_SPAL_12068]
[SRS_SPAL_12069]
[SRS_SPAL_12063]
[SRS_SPAL_12129]
[SRS_SPAL_12067]
[SRS_SPAL_12077]
[SRS_SPAL_12078]
[SRS_SPAL_12092]
[SRS_SPAL_12265]
  • These requirements are not applicable to this specification.

Appendix 


The table shown on the next page is just an example to help future users (and/or developers) that have to configure software modules to use the SPI Handler/Driver. This table is independent of the Spi_ConfigType structure but contains all elements and aggregations like Channels, Jobs and Sequences.



评论

此博客中的热门博文

AUTOSAR_SWS_CANDriver

Linux Driver Char Device 笔记

AUTOSAR_SWS_PWMDriver

AUTOSAR_SWS_PortDriver

AUTOSAR_SWS_ECUStateManager

EB - MCAL - MCU

AUTOSAR_SWS_ICUDriver

EB - MCAL - PWM