CP AUTOSAR标准之SPI Handler/Driver(AUTOSAR_SWS_SPIHandlerDriver)

本文遵循autosar标准:R22-11

1 简介及功能概述

  SPI 提供对通过 SPI 总线连接的设备进行读取和写入的服务。它为多个用户提供对 SPI 通信的访问(例如 EEPROM、看门狗、I/O ASIC)。它还提供配置片上 SPI 外设所需的机制。
  该规范描述了单片 SPI 的 API。该软件模块包括处理和驱动功能。该单片 SPI 的主要目标是充分利用每个微控制器的功能,并允许根据静态配置进行实现优化,以尽可能 满足 ECU 的需求。因此,该规范定义了可选择的功能级别和可配置特性,以允许设计利用微控制器特性的高可扩展模块。
  要配置 SPI ,应遵循以下步骤:

  • 应选择 SPI 功能级别并配置可选功能。
  • SPI 通道应根据数据使用情况进行定义,它们可以在 SPI (IB) 内部缓冲或由用户 (EB) 提供。
  • SPI 作业应根据硬件属性 (CS) 进行定义,并且它们将包含使用这些属性的通道列表。
  • 作为最后一步,应定义作业序列,以便以排序方式(按优先级排序)传输数据。

  SPI可以根据调用的API函数和选择的功能级别以异步或同步方式传输数据帧。该规范涵盖了合并在一个模块中的处理程序/驱动程序功能。一是 SPI 处理部分,用于处理对可能位于ECU 抽象层的总线的多次访问。另一部分是直接访问微控制器硬件的 SPI 驱动程序,该驱动程序可能位 于微控制器抽象层中。

2 首字母缩写词和缩写词

在这里插入图片描述

3 相关文档

3.1 输入文件

[1]分层软件架构:AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[2] SPAL需求:AUTOSAR_SRS_SPALGeneral.pdf
[3]基础软件模块总体要求:AUTOSAR_SRS_BSWGeneral.pdf
[4] 默认错误跟踪器:AUTOSAR_SWS_DefaultErrorTracer.pdf
[5] ECU配置规格:AUTOSAR_TPS_ECUConfiguration.pdf
[6] SPI 处理程序/驱动程序的要求:AUTOSAR_SRS_SPIHandlerDriver.pdf
[7] 诊断事件管理器文档:AUTOSAR_SWS_DiagnosticEventManager.pdf
[8]术语表:AUTOSAR_TR_Glossary.pdf
[9] MCU驱动文档:AUTOSAR_SWS_MCUDriver.pdf
[10] PORT驱动文档:AUTOSAR_SWS_PORTDriver.pdf
[11]基本软件模块描述模板:AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[12]基础软件模块列表:AUTOSAR_TR_BSWModuleList
[13]标准类型文档:AUTOSAR_SWS_StandardTypes.pdf
[14]基础软件模块通用文档:AUTOSAR_SWS_BSWGeneral.pdf

3.2 相关文档

  AUTOSAR 提供了基本软件模块的通用 文档 [14](SWS BSW General), 本文档对于 SPI 处理程序驱动程序也有效。SWS BSW General 文档应被视为 SPI 处理程序驱动程序的附加且必需的 文档。

4 约束

4.1 限制

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

4.2 汽车领域的适用性

无。

5 对其他模块的依赖

   SPI Handler/Driver模块不负责在其 init 函数中设置配置时钟、预分频器和 PLL 的寄存器。这必须由 MCU 模块完成。注意,SPI 外设可能取决于系统时钟、预分频器和 PLL。因此,系统时钟的任何变化(例如PLL打开/PLL关闭/ 时钟分频器)也可能影响SPI硬件的时钟设置。根据微控制器的不同,SPI 外设可以与其他外设共享寄存器。在这种典型情况下,SPI Handler/Driver与 MCU 模块有关系,用于初始化和取消初始化这些寄存器。 如果使用微控制器引脚完成片选,则 SPI Handler/Driver与端口模块存在关系。在这种情况下,本文档假设这些微控制器引脚由 SPI Handler/Driver直接访问,而不使用 DIO 模块的 API。无论如何,SPI 取决于 ECU 硬件设计,因此它可能取决于其他模块。

6 溯源

7 功能

  SPI(串行外设接口)具有 4 线同步串行接口。数据通信通过片选线 (CS) 启用。数据传输采用3线接口由串行数据输出 (MOSI)、串行数据输入 (MI‑SO) 和串行时钟 (CLOCK) 线组成。

7.1 功能和特性

  本文档基于以前的文档经验,也基于已确定的案例。本节的目的是总结SPI Handler/Driver 的可扩展性如何允许从满足简单需求的简单软件模块到满足增强需求的软件模块。
在这里插入图片描述

  本文档规定了 SPI 的以下 3 个可扩展功能级别:

  • LEVEL 0,简单同步 SPI Handler/Driver:通信是基于同步处理(使用轮询机制)并使用 FIFO 策略来处理多次访问。缓冲区使用可配置以优化和/或利 用硬件功能。
  • LEVEL 1,基本异步 SPI Handler/Driver:通信是基于异步行为 (使用执行期间可选择的中断或轮询机制)并使用优先级策略来处理多个访问。缓冲区使用可按照 “简单同步”级别进行配置。
  • LEVEL 2,增强型(同步/异步)SPI Handler/Driver:通信基于异步行为(使用执行期间可选择的中 断或轮询机制)或同步处理,并使用优先级策略来处理多个访问。与其他级别一样,缓冲区的使用是可配置的。

  即使为同步传输中使用的作业和/或序列指定了通知函数,在 LEVEL0 的情况下也不会调用这些函数。SPI Handler/Driver的可扩展功能级别应始终是静态可配置的,即在预编译时配 置以实现最佳源代码优化。SpiLevelDelivered 参数应根据所描述的级别(0、1 或 2)配置为 3 个值之一,以允许选择 SPI Handler/Driver的可扩展功能级别。为了提高可扩展性,每个级别都有可配置(开/关)或可选择的可选功能。这些在专门章节中有详细描述。

7.2 一般行为

  本章一方面介绍了所有级别的常见行为和配置。另一方面,它指定每个级别的行为以及允许的可选功能。 SPI Handler/Driver接口配置应基于本文档中定义的通道、作业和序列(第 2 章)。 SPI Handler/Driver应支持一个或多个通道,
以便驱动所有类型 SPI 兼容硬件设备的作业和序列。数据传输应根据 Channels、Job 和 Sequences 配置参数进行。
  片选(CS)附在作业定义中。片选应在作业传输期间处理,并应在作业传输结束时释放。此片选处理应根据作业配置参数完成。 可以定义片选处理是否由硬件外设自主管理,无需驱动程序显式片选控制,或者 SPI 驱动程序应将片选线显式驱动为 DIO。
  当 SpiCsSelection = CS_VIA_GPIO 时,由实现决定配置到 SpiCsBehavior 中的片选行为是否适用。
  CS 处理示例:在 Job 传输开始时将 CS 设置为活动状态;保持它直到属于该作业的所有通道的传输结束,然 后将CS设置为非活动状态。一个通道被定义一次,但根据用户需求和本软件 文档,它可以属于多个作业。一项作业应至少包含一个通道。
  每个通道应有一个关联的索引,用于指定 Job中 Channel 的顺序,如果一个Job包含多个Channel,则包含的所有Channel在传输过程中具有相同的 Job属性,并且应静态链接在一起。 一项作业被定义一次,但根据用户需求和本软件文档,它可以属于多个序列。一个序列应至少包含一个作业。
  如果它包含多个,则包含的所有作业在传输过程中具有相同的序列属性,并且应静态链接在一起。用于传输的通道应该配置其参数,但允许传递空指针作为源和目标指针以生成虚拟传输。
在这里插入图片描述

  注:上图对应SpiCsBehavior=CS_KEEP_ASSERTED的配置。
  通道数据可能与处理的硬件和用户(客户端应用程序)给出的不同。在客户端,数据基于 SpiDataWidth 以 8、16 或 32 位模式处理(第 8.2.5 章)。在微控制器方面,硬件可以处理 1 到 32 位之间的数据,也可以 处理固定值(8 或 16 位),并且该宽度对于每个通道都是可配置的(SpiDataWidth)。SPI Handler/Driver应注意通道帧宽度 (SpiDataWidth) 和数据访问数据类型之间的差异。
  如果数据宽度 (SpiDataWidth) 完全相同(8 或 16 或 32 位),SPI 处理程序/驱动 程序可以直接发送和接收数据,而无需任何位更改。如果数据访问转换类型优于数据宽度(例如 SpiDataWidth = 12 位,数据访问为16 位),则通过 SPI Handler/Driver传输的数据应发送较低部分,忽略较高部分。接收下半部分,用零扩展。这确保用户始终获得相同的界面。
  根据独立于 Spi_DataBufferType 的 SpiDataWidth,将数据缓冲区作为 uint8、uint16 或 uint32 进行访问。数据访问将使用以下转换:uint8 代表 SpiDataWidth < 9、uint16 代表 9 =< SpiDataWidth < 17、uint32 代表 17 =< SpiDataWidth。

7.2.1 通用可配置功能:允许的通道缓冲区

  为了允许利用所有微控制器功能,同时也允许向专用存储位置发送数据或从专用存储位置接收数据,所有级别都具有与通道缓冲区位置相关的可选功能。因此,可以通过配置使用两种主要类型的通道缓冲:

  • 内部缓冲通道(IB):提供传输/接收数据的缓冲区由处理程序/驱动程序编辑。
  • 外部缓冲通道(EB):提供发送/接收的缓冲区由用户(静态和/或动态)。

  根据下面描述的3个用例,可以使用两种通道缓冲方法:

  • 方法0: SPI Handler/Driver仅管理内部缓冲区。
  • 方法1: SPI Handler/Driver仅管理外部缓冲区。
  • 方法2: SPI Handler/Driver管理两种缓冲区类型。

  SpiChannelBuffersAllowed参数应根据描述的使用情况配置为3个授权值(0、1或2)之一。
  应配置SpiChannelBuffersAllowed参数选择 SPI Handler/Driver管理的通道缓冲区。

7.2.1.1 IB 通道的行为

  内部缓冲区通道的目的是通过硬件利用包含此功能的微控制器。否则,应通过软件模拟此功能。
  对于IB通道,处理程序/驱动程序应提供缓冲,但它无法照顾传输过程中缓冲区中数据的一致性。Channel缓冲区的大小是固定的。接收到的通道数据应按通道存储在1个条目的内部缓冲区中。 SPI Handler/Driver不应处理同一通道上的另一个传输对这些“接收”缓冲区的覆盖。
  要传输的通道数据应按通道深度内部缓冲区复制在1个条目中。 SPI Handler/Driver无法防止用户在传输过程中覆盖这些缓冲区。处理程序/驱动程序应为接收和发送提供单独的缓冲区以确保发送的数据不会被接收的数据覆盖。

7.2.1.2 EB 通道的行为

  外部缓冲区通道的目的是重用位于外部的现有缓冲区。这意味着 SPI Handler/Driver不会监视它们。对于EB通道,应用程序应提供缓冲,并应在传输期间注意缓冲区中数据的一致性。Channel缓冲区的大小可以是固定的,也可以是可变的。通道缓冲区的最大大小应由配置定义。
  应用程序为SPI处理程序驱动器提供的缓冲区呃可能有不同的size。

7.2.1.3 缓冲通道使用

  下面提供了有关通道特征的信息:

IB Channels提供:更抽象的概念(隐藏缓冲机制)、实际和未来的最佳实施受益于硬件缓冲区设施(给定的256字节大小满足当今的要求)。
IB Channels建议使用:Daisy-chain、小型数据传输设备(最多10字节)。
EB Channels提供:支持大数据流通信的高效机制、从ROM表和备用RAM大小中发送常量数据、为不同的设备发送各种数据表(具有多个集成外围设备的高度复杂的ASICS,也是混合信号类型,可能超过IB硬件缓冲区大小)。
EB Channels建议使用:大数据流、EEPROM通信、复杂硬件芯片的控制。

  对于每个通道,如果当前通道选择IB,则用户配置IB缓冲区的数量(至少1);如果当前通道选择EB,则用户配置EB缓冲区的最大数据量。

7.2.2 级别 0,简单同步行为

  此功能级别的目的是为处理程序/驱动程序提供一组减少的服务,以仅处理简单的同步传输。对于包括简单SPI网络的ECU以及使用高速外部设备的ECU来说,通常都是这种情况。简单的同步传输意味着调用传输服务的函数在传输过程中被阻塞,直到传输完成。LEVEL 0条件下 SPI Handler/Driver应提供同步SPI总线传输服务。
  对于工作在LEVEL 0的 SPI Handler/Driver,当没有正在进行的序列传输时, SPI Handler/Driver应处于空闲状态SPI_IDLE。这个单片 SPI Handler/Driver能够处理一对n根据所使用的微控制器的SPI总线。然后SPI总线被分配给作业而不是序列。因此,不同SPI总线上的作业可能属于同一序列。
  所以:如果要传输的序列使用不同的总线并且启用了参数SPI_SUPPORT_CONCURRENT_SYNC_TRANSMIT,则LEVEL 0 SPI Handler/Driver应接受并发Spi_SyncTransmit。默认情况下应禁用此功能。这意味着在一个序列正在进行的传输期间,所有传输另一个序列的请求都将被拒绝。
  LEVEL 0 SPI Handler/Driver行为应包括共同特征:选中Allowed Channel Buffers。如果不同的作业(以及序列)具有公共通道,则 SPI Handler/Driver环境应确保读取和/或传输过程中不会调用写入函数。当检测到硬件错误时, SPI Handler/Driver应停止当前序列,按照配置向DEM报告错误,并将作业状态设置为SPI_JOB_FAILED,将序列状态设置为SPI_SEQ_FAILED。
  Channel数据传输时,读写功能不能保证数据的完整性。

7.2.3 第 1 级,基本异步行为

  此功能级别的目的是为处理程序/驱动程序提供一组减少的服务,以仅处理异步传输。对于具有与具有不同优先级的SPI网络相关的功能的ECU以及使用低速外部设备的ECU来说,通常都是这种情况。异步传输是指在传输过程中,调用传输服务的用户不会被阻塞。此外,可以在传输结束时通知用户。通常,根据软件设计,可以通过轮询或中断机制来检测异步结束传输。此级别的功能提出了在执行期间可选择的两种机制。
  轮询机制和中断机制模式SPI总线应在执行期间可选择。LEVEL 1 SPI Handler/Driver应为SPI总线提供异步传输服务。异步传输意味着当传输正在进行时,调用传输服务的用户不会被阻塞。
  LEVEL 1下的 SPI Handler/Driver应为SPI总线提供异步传输服务。此外,还可以在传输结束时通知用户。对于在LEVEL 1下运行的 SPI Handler/Driver,当没有正在进行的序列传输时, SPI Handler/Driver应处于空闲状态。该处理程序/驱动程序将由多个软件模块使用,这些软件模块可以彼此独立,也可以属于不同的层。因此,将为作业分配优先级,以便找出多重访问的具体情况。
  这些情况通常发生在基于异步机制的实时系统中。作业已分配优先级。序列中链接的作业应具有相同或递减的优先级。这意味着第一个作业应具有序列中所有作业的同等优先级或最高优先级。作业的优先级顺序应从低值到高值定义,值越高优先级越高(从0到4,限制为4个优先级)。
  参考作业优先级,该处理程序/驱动程序需要规则来在这些特定的多次访问情况下做出决定。 SPI Handler/Driver调度方法应调度作业为了首先发送最高优先级的作业。该单片SPI处理程序/驱动器能够根据所使用的微控制器处理1到n条SPI总线。但SPI总线分配给作业而不是序列。
  因此,不同SPI总线上的作业可能属于同一序列。所以:LEVEL 1 SPI Handler/Driver可能允许同时传输多个序列。这意味着在序列传输期间,应评估所有传输另一个序列的请求,以便接受开始新序列或根据主导作业拒绝它。
  LEVEL 1 SPI Handler/Driver行为应包括公共功能:已选择的允许通道缓冲区,以及配置的异步功能:可中断序列。
  检测到硬件错误时, SPI Handler/Driver应停止当前序列,按照配置向DEM报告错误,并将作业状态设置为SPI_JOB_FAILED,将序列状态设置为SPI_SEQ_FAILED。
  如果作业配置了特定的结束通知函数,则 SPI Handler/Driver应在作业传输结束时调用此通知函数任务。如果序列配置了特定的结束通知函数,则 SPI Handler/Driver应在序列传输结束时调用此通知函数。

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

  当配置了有效的通知函数指针时, SPI Handler/Driver应在作业传输结束时调用此通知函数,无论作业传输的结果是SPI_JOB_FAILED还是SPI_JOB_OK(避免死锁或无限循环)。当配置了有效的通知函数指针时, SPI Handler/Driver应在序列传输结束时调用此通知函数,无论序列传输的结果是SPI_SEQ_FAILED、SPI_SEQ_OK或SPI_SEQ_CANCELLED。为了允许利用异步传输机制,该 SPI Handler/Driver的级别1和级别2具有关于暂停序列传输的可选功能。
  因此,可以通过配置使用两种主要的序列:

  • 不可中断序列,每个启动的序列传输不会被处理程序/驱动程序暂停,直到传输结束。
  • 混合序列,根据其配置,开始的序列传输可能会被处理程序/驱动程序在两个连续作业之间暂停。

   SPI Handler/Driver的环境应配置Spi‑InterruptibleSeqAllowed参数(ON/OFF),以便选择 SPI Handler/Driver管理哪种序列。

7.2.4.1 不可中断序列的行为

  不可中断序列功能的目的是在仅使用非阻塞传输的情况下提供基于基本异步机制的简单软件模块。当SpiInterruptibleSeqAllowed参数关闭(即配置值“OFF”)时, SPI Handler/Driver的级别1和2内不允许可中断序列。当 SPI Handler/Driver配置为不允许可中断序列时,所有声明的序列均被视为不可中断序列1。
  当 SPI Handler/Driver配置为不允许可中断序列时,可以省略其专用参数SpiInterruptibleSequence或应使用FALSE值作为默认值。
  根据要求,不允许 SPI Handler/Driver暂停已开始的序列传输以支持另一个序列。

7.2.4.2 混合序列的行为

  混合序列功能的目的是提供具有特定异步机制的软件模块,例如,如果使用可以或应该被具有更高优先级的其他序列挂起的非常长的序列。当SpiInterruptibleSeqAllowed参数打开(即配置为值“ON”)时, SPI Handler/Driver的级别1和2内允许可中断序列。当 SPI Handler/Driver配置为允许中断时序列,所有声明的序列都应有其专用参数Spi‑InterruptibleSequence来标识是否序列在传输过程中可以暂停。
  如果序列配置为可中断序列并根据要求,则允许 SPI Handler/Driver暂停已启动的序列传输,以支持另一个具有更高优先级作业的序列。这意味着,在作业传输(属于可中断序列)结束时,另一个序列传输请求待处理, SPI Handler/Driver应执行重新调度,以选择下一个要传输的作业。如果序列配置为不可中断序列并根据要求,则不允许 SPI Handler/Driver暂停此已启动的序列传输以支持其他序列。使用可中断序列时,调用者必须注意,如果多个序列访问相同的通道,这些通道的数据可能会被访问每个通道的最高优先级作业覆盖。

7.2.5 级别 2,增强行为

  此功能级别的目的是为Handler/Driver提供一整套服务来处理同步和异步传输。对于具有许多与具有不同优先级的SPI网络相关的功能的ECU来说,情况可能如此,而且对于使用具有不同速度的外部设备的ECU来说也是如此。通常,根据软件设计,可以通过轮询或中断机制来检测异步结束传输。此级别的功能提出了在执行期间可选择的两种机制。LEVEL 0的要求适用于同步行为。LEVEL 1的要求适用于异步行为。
  LEVEL 2 SPI Handler/Driver应提供异步nous传输服务和SPI总线的同步传输服务。在LEVEL 2中,如果没有正在进行的序列传输,则 SPI Handler/Driver应处于空闲状态(SPI_IDLE)。

7.3 调度建议

  对于异步级别(LEVEL 1和LEVEL 2), SPI Handler/Driver可以在作业和/或序列传输结束时调用结束通知函数。在可中断序列的情况下(可以挂起),如果另一个序列传输请求处于待处理状态,则 SPI Handler/Driver也会进行重新调度,以便选择下一个要传输的作业(请参阅)。对于异步级别,LEVEL 1和LEVEL 2,SPI Handler/Driver可以在Job结束时调用结束通知函数。对于异步级别,LEVEL 1和LEVEL 2, SPI Handler/Driver可以在序列传输结束时调用结束通知函数。
  对于异步级别,在不可中断序列的情况下为级别1和级别2,如果另一个序列传输请求待处理,则 SPI Handler/Driver也会重新调度,以便选择下一个作业来执行发送。如果呼叫结束通知函数和重新调度完全由软件完成,则它们之间的顺序应是先调度,然后执行结束通知函数的调用。

7.4 错误分类

"General Specification of Basic Software Modules文档的7.2“"Error Handling”章节详细描述了基本软件的错误处理。最重要的是,它构成了一个由BSW模块中可能出现的五种错误类型组成的分类方案。基于此基础,以下部分详细说明了下面各个小节中排列的特定错误。

7.4.1 开发错误

在这里插入图片描述

7.4.2 运行时错误

在这里插入图片描述

7.4.3 瞬时故障

  不存在瞬态故障。

7.4.4 生产错误

  不存在生产错误。

7.4.5 扩展生产错误

在这里插入图片描述
  当SPI发送状态寄存器内的任何错误位被置位时,SPI发送状态寄存器信息应报告给DEM(SPI_E_HARDWARE_ERROR、DEM_EVENT_STATUS_FAILED)。
  当SPI发送状态寄存器内没有错误位被置位时,SPI发送状态寄存器信息应报告给DEM(SPI_E_HARDWARE_ERROR、DEM_EVENT_STATUS_PASSED)

8 API规范

8.1 导入类型

本章列出了以下模块中包含的所有类型:
在这里插入图片描述

8.2 类型定义

8.2.1 Spi_ConfigType

在这里插入图片描述

8.2.2 Spi_StatusType

在这里插入图片描述

  类型Spi_StatusType定义了 SPI Handler/Driver的一系列特定状态。它通知 SPI Handler/Driver状态或指定的SPI硬件微控制器外设。
  Spi_StatusType类型可以调用API服务Spi_GetStatus。复位后,类型Spi_StatusType应具有默认值SPI_UNINIT。
  API服务Spi_GetStatus应在以下情况下返回SPI_UNINIT: SPI Handler/Driver未初始化或不可用。API服务Spi_GetStatus应在SPI发生时返回SPI_IDLE处理程序/驱动程序当前未传输任何作业。
  API服务在SPI Handler/Driver正在执行SPI作业传输时Spi_GetStatus应返回SPI_BUSY 。当前未传输任何作业时Spi_GetHWUnitStatus函数应返回SPI_IDLESPI。当SPI正在执行SPI作业传输时,Spi_GetHWUnitStatus函数应返回SPI_BUSY。

8.2.3 Spi_JobResultType

在这里插入图片描述

  类型Spi_JobResultType定义了一系列特定的Job SPI Handler/Driver的状态。
  Spi_JobResultType类型,它通知 SPI Handler/Driver作业状态,并且可以使用作业ID调用API服务Spi_GetJobResult来获取。复位后,类型Spi_JobResultType应具有默认值SPI_JOB_OK。函数Spi_GetJobResult应返回SPI_JOB_OK表示最后一次作业传输已成功完成。

8.2.4 Spi_SeqResultType

在这里插入图片描述

  类型Spi_SeqResultType为SPI Handler/Driver定义了一系列特定的序列状态,可以调用API服务Spi_GetSequenceResult来获取,应提供给外部使用。类型 Spi_SeqResultType 定义了 SPI Handler 的具体 Sequences 状态的范围。
  类型Spi_SeqResultType定义有关 SPI Handler/Driver序列状态的信息,可以使用序列ID调用API服务Spi_GetSequenceResult来获取。复位后,类型Spi_SeqResultType应具有默认值SPI_SEQ_OK。Spi_GetSequenceResult函数在序列的最后一次传输成功完成时应返回SPI_SEQ_OK。
  当 SPI Handler/Driver执行SPI序列时,Spi_GetSequenceResult函数应返回SPI_SEQ_PENDING。该状态的含义等同于SPI_BUSY。Spi_GetSequenceResult函数在序列的最后一次传输失败时应返回SPI_SEQ_FAILED。

8.2.5 Spi_DataBuffer类型

在这里插入图片描述

  Spi_DataBufferType定义应用数据缓冲区的类型元素。类型为uint8。对数据的访问是动态选择的,数据缓冲区必须对齐到32位。Spi_DataBufferType指的是应用程序数据缓冲区。

8.2.6 Spi_NumberOfDataType

在这里插入图片描述

Spi_NumberOfDataType 用于定义 Channel 发送和/或接收的指定类型的数据元素的数量。

8.2.7 Spi_ChannelType

在这里插入图片描述

  Spi_ChannelType用于指定Channel的标识(ID)。

8.2.8 Spi_JobType

在这里插入图片描述

  类型Spi_JobType用于指定标识Job的(ID)。

8.2.9 Spi_SequenceType

在这里插入图片描述

  类型Spi_SequenceType用于指定标识作业序列的fication(ID)。

8.2.10 Spi_HWUnitType

在这里插入图片描述

  类型Spi_HWUnitType用于指定标识SPI硬件微控制器外设(单元)的灰(ID)。

8.2.11 Spi_AsyncMode类型

在这里插入图片描述

  Spi_AsyncModeType用于指定异步异步处理SPI总线的同步机制模式。类型Spi_AsyncModeType是否可用取决于预编译时参数SpiLevelDelivered。这与LEVEL 1和LEVEL 2相关。
  如果通过参数值SPI_POLLING_MODE调用API Spi_SetAsyncMode函数,则通过轮询确保异步机制。因此与异步处理的SPI总线相关的中断被禁用。
  如果通过参数值SPI_INTERRUPT_MODE调用API Spi_SetAsyncMode函数,异步机制是通过中断来保证的,因此与异步处理的SPI总线相关的中断被使能。

8.3 函数定义

8.3.1 Spi_Init

在这里插入图片描述

  Spi_Init操作是不可重入的。函数Spi_Init提供SPI初始化服务化。
  函数Spi_Init应使用参数ConfigPtr的结构体的值初始化所有SPI相关寄存器。指针使用函数Spi_Init初始化模块后, SPI Handler/Driver应将其状态设置为SPI_IDLE,将序列结果设置为SPI_SEQ_OK,将作业结果设置为SPI_JOB_OK。
  对于LEVEL 2(参见第7.2.5章),该函数Spi_Init应将SPI Handler/Driver异步机制模式设置为默认为SPI_POLLING_MODE。与SPI总线相关的中断应被禁用。通过执行Spi_Init函数重新初始化 SPI Handler/Driver需要在执行Spi_DeInit之前进行取消初始化。
  应按照 API 参数检查部分中的说明检查函数 Spi_Init 的参数。

8.3.2 Spi_DeInit

在这里插入图片描述

  当API Spi_DeInit已接受返回值该函数应为E_OK。当API Spi_DeInit尚未被接受时,返回值该函数的ue应为E_NOT_OK。
  函数Spi_DeInit提供SPI反初始化。函数Spi_DeInit将取消初始化SPI。
  如果 SPI Handler/Driver状态不是SPI_BUSY,则去初始化函数应将所有已初始化的微控制器SPI外设置于相同状态,例如上电复位。
  如果SPI Handler/Driver的状态为SPI_BUSY,则函数调用Spi_DeInit将被拒绝。使用函数Spi_DeInit进行模块去初始化后, SPI Handler/Driver应将其状态设置为SPI_UNINIT。
  SPI Handler/Driver应在函数Spi_DeInit之前调用。

8.3.3 Spi_WriteIB

在这里插入图片描述

  Spi_WriteIB操作是可重入的。
  当API Spi_WriteIB命令已被接受时函数返回值E_OK。当API Spi_WriteIB命令尚未被接受时该函数返回值E_NOT_OK。函数Spi_WriteIB提供通过相应参数将一个或多个数据写入IB SPI通道的服务。
  函数Spi_WriteIB将接管给定的参数,并将指向的数据保存到由函数Spi_Init定义的内部缓冲区中。如果给定参数“DataBufferPtr”为空,则函数Spi_WriteIB应假定要传输的数据不相关,并应使用给定通道的默认传输值。函数Spi_WriteIB应可通过参数SpiChannelBuffersAllowed进行预编译时配置。此函数仅与具有IB的通道相关。
  应按照API参数检查部分中的说明检查函数Spi_WriteIB的参数。 SPI Handler/Driver应在函数Spi_WriteIB之前初始化被调用。

8.3.4 Spi_AsyncTransmit

在这里插入图片描述

  Std_ReturnType Spi_AsyncTransmit(Spi_SequenceType Sequence)是可重入的。
  当API Spi_AsyncTransmit命令被接受时函数应返回值E_OK。当API Spi_AsyncTransmit命令尚未执行时接受该函数应返回值E_NOT_OK。函数Spi_AsyncTransmit提供传输服务SPI总线上的数据。
  函数Spi_AsyncTransmit应接管给定的参数,启动传输,将 SPI Handler/Driver状态设置为SPI_BUSY,将序列结果设置为SPI_SEQ_PENDING并返回。
  调用函数Spi_AsyncTransmit时,应接管给定的参数并将Job状态设置为SPI_JOB_QUEUED,可以通过调用API服务Spi_GetJobResult获取其工作状态。当调用函数Spi_AsyncTransmit时, SPI Handler/Driver应处理Job结果,当开始传输时,结果应为SPI_JOB_PENDING。
  当调用函数Spi_AsyncTransmit时, SPI Handler/Driver应处理作业结果。当作业传输成功时,结果应为SPI_JOB_OK。当调用函数Spi_AsyncTransmit时, SPI Handler/Driver应处理作业结果。当作业传输失败时,结果应为SPI_JOB_FAILED。
  当调用函数Spi_AsyncTransmit并且请求的序列已处于状态SPI_SEQ_PENDING时, SPI Handler/Driver不应考虑此新请求,并且此函数应返回值E_NOT_OK。当调用Spi_AsyncTransmit函数并且请求的序列已处于SPI_SEQ_PENDING状态时, SPI Handler/Driver应根据和报告SPI E SEQ_PENDING错误。
  当调用函数Spi_AsyncTransmit并且请求的序列与处于SPI_SEQ_PENDING状态的另一个序列共享作业时, SPI Handler/Driver不应考虑此新请求,并且此函数应返回值E_NOT_OK。根据要求, SPI Handler/Driver应报告SPI E SEQ_PENDING错误。
  当函数Spi_AsyncTransmit与EB一起使用并且使用Spi_SetupEB方法将源数据指针设置为NULL时,应传输为每个通道配置的默认传输数据。当函数Spi_AsyncTransmit与EB一起使用并且使用Spi_SetupEB将目标数据指针提供为NULL时方法中, SPI Handler/Driver应忽略接收数据。
  当函数Spi_AsyncTransmit用于具有链接作业的序列时,该函数应从序列中的第一个作业传输到最后一个作业。
  在由Spi_AsyncTransmit函数启动的序列传输结束时,如果已配置,则 SPI Handler/Driver应在最后一个作业结束通知后调用序列通知回调函数(如果配置了该功能),函数Spi_AsyncTransmit可以通过配置参数SpiLevelDelivered在预编译时进行选择。此功能仅与LEVEL 1和LEVEL 2相关。 SPI Handler/Driver的环境应在EB通道的Spi_SetupEB函数调用之后或IB通道的Spi_WriteIB函数调用之后但在函数调用Spi_ReadIB之前调用Spi_AsyncTransmit函数。
  应按照API参数检查部分中的说明检查函数Spi_AsyncTransmit的参数, SPI Handler/Driver应在调用函数Spi_AsyncTransmit之前初始化。

8.3.5 Spi_ReadIB

在这里插入图片描述

  Spi_ReadIB操作是可重入的。
  函数Spi_ReadIB提供从参数指定的IB SPI Handler/Driver通道同步读取一个或多个数据的服务。
   SPI Handler/Driver的环境应在调用Transmit方法后调用函数Spi_ReadIB,以在IB通道内获取相关数据。函数Spi_ReadIB是通过参数SpiChannelBuffersAllowed进行预编译时配置的。此函数仅与具有IB的通道相关。
   应按照API参数检查部分中的说明检查函数Spi_ReadIB的参数。SPI Handler/Driver应在函数Spi_ReadIB之前初始化被调用。

8.3.6 Spi_SetupEB

在这里插入图片描述

  Spi_SetupEB操作是可重入的。函数Spi_SetupEB的返回值为E_OK:Setup命令已被接受,E_NOT_OK:Setup命令尚未被接受。函数Spi_SetupEB提供设置服务指定EB SPI Handler/Driver通道的缓冲区和数据长度。
  函数Spi_SetupEB应为特定EB SPI Handler/Driver通道设置缓冲区和数据长度。函数Spi_SetupEB应使用提供的值更新指定通道的缓冲区指针和长度属性。由于这些属性是持久的,因此它们将用于对Transmit方法(针对指定的Channel)的所有后续调用。
  当 SPI Handler/Driver的环境正在调用函数Spi_SetupEB且参数SrcDataBufferPtr为空指针时,该函数应在请求Transmit方法后传输为通道配置的默认传输值。当使用参数调用函数Spi_SetupEB时DesDataBufferPtr是一个空指针, SPI Handler/Driver应在请求传输方法后忽略接收到的数据。
  SPI Handler/Driver的环境应在 SPI Handler/Driver的环境调用Transmit方法之前为声明了EB的每个通道调用一次Spi_SetupEB函数。
  函数Spi_SetupEB是通过参数SpiChannelBuffersAllowed进行预编译时配置的。此函数仅与具有EB的通道相关。
  应按照API参数检查部分中的说明检查函数Spi_SetupEB的参数。 SPI Handler/Driver应在函数Spi_SetupEB之前初始化被调用。

8.3.7 Spi_GetStatus

在这里插入图片描述

  Spi_GetStatus操作是可重入的。函数Spi_GetStatus返回 SPI Handler/Driver软件模块状态。

8.3.8 Spi_GetJobResult

在这里插入图片描述

  操作Spi_GetJobResult是可重入的。函数Spi_GetJobResult服务返回指定Job的最后一次传输结果。
  SPI Handler/Driver环境应调用函数Spi_GetJobResult来查询Job传输成功(SPI__JOB_OK)或失败(SPI__JOB_FAILED)。
  注意: SPI Handler/Driver接受的每个新传输作业都会使用SPI_JOB_QUEUED或SPI_JOB_PENDING覆盖先前的作业结果。
  应按照API参数检查部分中的说明检查函数Spi_GetJobResult的参数。如果在调用函数Spi_GetJobResult之前尚未初始化SPI Handler/Driver,则返回值未定义。

8.3.9 Spi_GetSequenceResult

在这里插入图片描述

  Spi_GetSequenceResult是可重入的。函数Spi_GetSequenceResult应返回指定Sequence的最后一次传输结果。SPI Handler/Driver环境应调用函数Spi_GetSequenceResult来查询完整的Sequence传输是成功(SPI_SEQ_OK)还是失败(SPI_SEQ_FAILED)。
  注意:

  • SPI 已接受的每个新传输序列都会使用SPI_SEQ_PENDING覆盖先前的序列结果。
  • 如果在调用函数Spi_GetSequenceResult之前尚未初始化 SPI Handler/Driver,则返回值未定义。

  应按照API参数检查部分中的说明检查函数Spi_GetSequenceResult的参数。

8.3.10 Spi_GetVersionInfo

在这里插入图片描述

  如果启用Det,则应检查参数versioninfo是否为NULL。如果值为NULL指针,将报告错误SPI E PARAM_POINTER。

8.3.11 Spi_SyncTransmit

在这里插入图片描述

  Spi_SyncTransmit操作是可重入的。
  如果传输请求成功,则函数Spi_SyncTransmit返回E_OK。如果传输请求失败,函数Spi_SyncTransmit返回E_NOT_OK。函数Spi_SyncTransmit提供传输服务SPI总线上的数据。
  当调用Spi_SyncTransmit函数时,应接管给定的参数并将SPI Handler/Driver状态设置为SPI_BUSY。其状态可以通过调用API服务SPI_GetStatus获得。
  调用函数Spi_SyncTransmit时,应接管给定的参数并将Sequence状态设置为SPI_SEQ_PENDING,可以通过调用API服务Spi_GetSequenceResult获得。
  调用函数Spi_SyncTransmit时,应接管给定的参数并将Job状态设置为SPI_JOB_PENDING,可以通过调用API服务Spi_GetJobResult获得。
  当序列正在传输且SPI_SUPPORT_CONCURRENT_SYNC_TRANSMIT被禁用时,调用函数Spi_SyncTransmit或同一总线上正在传输另一个序列时, SPI Handler/Driver不应考虑此新的传输请求,并且函数应返回值E_NOT_OK。在这种情况下, SPI Handler/Driver应根据要求报告SPI_E_SEQ_IN_PROCESS错误。函数Spi_SyncTransmit可以通过配置参数SpiLevelDelivered在预编译时进行选择。此功能仅与LEVEL 0和LEVEL 2相关。
  应按照API参数检查部分中的说明检查函数Spi_SyncTransmit的参数。

8.3.12 Spi_GetHWUnitStatus

在这里插入图片描述

  Spi_GetHWUnitStatus是可重入的。
  函数Spi_GetHWUnitStatus服务返回指定SPI硬件微控制器外设的状态。函数Spi_GetHWUnitStatus应返回指定的SPI硬件微控制器外设。
   SPI Handler/Driver环境应调用此函数来查询指定的SPI硬件微控制器外设是SPI_IDLE还是SPI_BUSY。函数 Spi_GetHWUnitStatus 可以通过配置参数 SpiHwStatusApi 在预编译时配置 On/Off。
   如果在调用函数Spi_GetHWUnitStatus之前尚未初始化 SPI Handler/Driver,则返回值未定义。

8.3.13 Spi_Cancel

在这里插入图片描述

  函数Spi_Cancel服务取消指定的正在进行的顺序传输,而不取消任何作业传输,并将序列结果设置为SPI_SEQ_CANCELLED。换句话说,Spi_Cancel函数在(可能的)传输作业结束之后和(潜在的)下一个作业传输开始之前停止序列传输。
  当通过函数Spi_Cancel取消序列时如果配置, SPI Handler/Driver应调用序列通知回调函数,而不是启动属于它的潜在下一个作业。函数Spi_Cancel在预编译时可通过参数SpiCancelApi配置开/关。 SPI Handler/Driver对由于取消序列传输而导致的外部设备损坏或未定义状态不承担责任。

8.3.14 Spi_SetAsyncMode

在这里插入图片描述

  Spi_SetAsyncMode是不可重入的。
  函数Spi_SetAsyncMode返回值为E_OK和E_NOT_OK。
  函数Spi_SetAsyncMode服务设置异步异步处理SPI总线的nous机制模式。如果在 SPI Handler/Driver状态为SPI_BUSY且异步传输正在进行时调用Spi_SetAsyncMode函数,则 SPI Handler/Driver不应更改AsyncModeType并保持模式类型不变。如果在同步传输正在进行时调用Spi_SetAsyncMode,则 SPI Handler/Driver应根据参数“Mode”设置AsyncModeType,即使 SPI Handler/Driver状态为SPI_BUSY。
  函数Spi_SetAsyncMode可以通过配置参数SpiLevelDelivered在预编译时进行选择。此功能仅与LEVEL 1和2相关。

8.4 回调通知

  SPI Handler/Driver模块属于AUTOSAR软件架构的最低层,因此该模块规范未标识任何回调函数。

8.5 预定功能

  本章列出了 SPI Handler/Driver提供并由基本软件模块调度程序直接调用的所有函数。
  SPI Handler/Driver模块需要一个调度函数来管理通过轮询管理的异步模式。下面指定的函数举例说明了如何在需要时实现它们。

8.5.1 Spi_MainFunction_Handling

在这里插入图片描述

  该函数应轮询链接到分配给SPI序列传输的HW单元的SPI中断,以启用传输状态机的演变。

8.6 预期接口

  本章列出了 SPI Handler/Driver需要其他模块提供的所有功能。

8.6.1 强制接口

在这里插入图片描述

   SPI Handler/Driver模块需要一些接口来实现其核心功能。

8.6.2 可选接口

  本章定义了实现 SPI Handler/Driver模块的可选功能所需的所有接口。
在这里插入图片描述

8.6.3 可配置接口

  本章列出了可以配置目标功能的所有接口。
  目标函数通常是回调函数。这些接口的名称不固定,因为它们是可配置的。
  SPI Handler/Driver应使用回调例程Spi_JobEndNotification通知其他软件模块有关某些状态或状态更改的信息。 SPI Handler/Driver应使用回调例程Spi_SeqEndNotification通知其他软件模块有关某些状态或状态更改的信息。
  为了实现回调功能,需要其他模块以预期的方式提供例程。 SPI Handler/Driver的实现者必须将回调通知和Spi_JobEndNotification Spi_SeqEndNotification实现为初始化数据结构((SSpRiSCiLgT2p0e6中)定义的函数指针。回调通知Spi_JobEndNotification和Spi_SeqEndNotification应无参数且无返回值。如果回调通知配置为空指针,则不回调应被执行。
  允许在SPI回调通知中使用以下API调用:

  • Spi_ReadIB
  • Spi_WriteIB
  • Spi_SetupEB
  • Spi_GetJobResult
  • Spi_GetSequenceResult
  • Spi_GetHWUnitStatus
  • Spi_Cancel

不允许所有其他 SPI Handler/DriverAPI调用。

8.6.3.1 Spi_JobEndNotification

在这里插入图片描述

  SpiJobEndNotification是可重入的。
  如果配置了SpiJobEndNotification(即不是空指针),则 SPI Handler/Driver应在作业传输结束时调用配置的回调通知。
  注意:该例程可能在中断级别调用,具体取决于调用函数。

8.6.3.2 Spi_SeqEndNotification

在这里插入图片描述

  SpiSeqEndNotification是可重入的。
  如果配置了SpiSeqEndNotification(即不是空指针),则 SPI Handler/Driver应在序列传输结束时调用配置的回调通知。
  注意:该例程可能在中断级别调用,具体取决于调用函数。

8.7 错误检测

8.7.1 API参数检查

   当使用错误参数调用 API 服务时,SPI应能够检测到错误 SPI_E_PARAM_CHANNEL。 当使用错误参数调用 API 服务时,SPI 应能够检测到错误 SPI_E_PARAM_JOB。
   当使用错误参数调用 API 服务时,SPI 处理程序/驱动程序应能够检测到错误 SPI_E_PARAM_SEQ。当使用错误参数调用 API 服务时,SPI 处理程序/驱动程序应能够检测到错误 SPI_E_PARAM_LENGTH。
   当使用错误参数调用API服务时SPI Handler/Driver应能够检测到错误SPI E PARAM_UNIT。API参数Channel应在初始化数据结构中定义的通道内具有一个值,并且必须与服务一起使用正确的通道类型(IB或EB)。相关错误值为SPI E PARAM_CHANNEL。否则,返回E_NOT_OK表示服务未完成。
  API参数Sequence和Job的值应在指定的值范围内。相关错误值:SPI E PARAM_SEQ或SPI E PARAM_JOB。
  API参数数据长度应具有指定缓冲区值内的值。相关错误值:SPI E PARAM_LENGTH。如果API参数Length相关服务未完成,返回值为E_NOT_OK。
  API参数HWUnit应具有指定范围内的值字段值范围。相关错误值:SPI E PARAM_UNIT。如果没有完成HWUnit相关服务,则返回SPI_UNINIT。如果不合适,SPI 处理程序/驱动程序模块的环境应将 NULL 指针传递给函数 Spi_Init。

8.7.2 SPI 状态检查

   当API服务在没有模块初始化的情况下使用时,SPI Handler/Driver应能够检测到错误SPI_E_UNINIT。如果启用了SPI模块的开发错误检测,并且 SPI Handler/Driver的环境在初始化之前调用任何API函数,应根据配置向DET报告错误,错误值为SPI_E_UNINIT。
   当SPI驱动程序已初始化且调用API SPI_Init服务时,SPI Handler/Driver应能够检测到错误SPI_E_ALREADY_INITIALIZED。如果启用了SPI模块的开发错误检测,则在SPI初始化将导致开发错误SPI_E_ALREADY_INITIALIZED,并且功能应保持不变。

8.7.3 SPI 运行时检查

   当服务以错误的顺序调用时,SPI Handler/Driver应能够检测到SPI_E_SEQ_PENDING错误。 SPI Handler/Driver应能够在错误时间调用同步传输服务时检测到错误SPI_E_SEQ_IN_PROCESS。 SPI Handler/Driver应能够在异步或同步传输期间发生硬件错误时检测到错误SPI_E_HARDWARE_ERROR。
   如果序列和作业相关服务未完成,并且根据服务的不同,返回值应为E_NOT_OK或失败结果(SPI__JOB_FAILED或SPI_SEQ_FAILED)。 SPI Handler/Driver不应处理调用的函数,但根据调用的函数,应返回E_NOT_OK或失败(SPI__JOB_FAILED或SPI_SEQ_FAILED)。

9 时序图

9.1 初始化

9.2 模式转换

  以下序列图显示了运行模式转换的Init/DeInit调用的示例。

在这里插入图片描述

9.3 写/异步传输/读(IB)

9.3.1 一个通道,一个作业,一个序列

  下面的序列图显示了Spi_WriteIB/Spi_AsyncTransmit/Spi_ReadIB调用仅由一个Channel组成的一个Job进行Sequence传输的示例。当作业分别只是读取或写入时,可以跳过写入或读取步骤。
  示例:通道ID 2属于作业ID 1,作业ID 1属于序列ID 0
在这里插入图片描述
在这里插入图片描述

9.3.2 多个通道,一项作业,一组序列

  下面的序列图显示了Spi_WriteIB/Spi_AsyncTransmit/Spi_ReadIB调用Sequence传输的示例,其中一个Job由多个Channel组成。当作业分别只是读取或写入时,可以跳过写入或读取步骤。
  示例:通道ID 2和3属于作业ID 1,作业ID 1属于序列ID 0
在这里插入图片描述
在这里插入图片描述

9.3.3 多个通道、多个作业和一个序列

  以下序列图显示了Spi_WriteIB/Spi_AsyncTransmit/Spi_ReadIB调用链接作业的序列传输的示例。当作业分别只是读取或写入时,可以跳过写入或读取步骤。
  示例:通道ID 0至3属于作业ID 1(较高优先级),通道ID 4至10属于作业ID 2(较低优先级),该作业没有结束通知功能。这些作业属于同一个序列ID 0
在这里插入图片描述
在这里插入图片描述

9.3.4 多通道、多作业、多序列

  以下序列图显示了用于序列传输的Spi_WriteIB/Spi_AsyncTransmit/Spi_ReadIB调用的示例。当作业分别只是读取或写入时,可以跳过写入或读取步骤。
  示例:通道ID 0至3属于作业ID 1(高优先级2),通道ID 4至10属于作业ID 2(低优先级1),该作业没有结束通知功能。这些作业属于同一个序列ID 0,该序列ID被配置为可中断。通道ID 11至13属于作业ID 0(较高优先级3),该作业ID属于配置为不可中断的序列ID 1。
在这里插入图片描述
在这里插入图片描述

9.4 设置/异步传输 (EB)

9.4.1 可变数据数/恒定数据数

  要传输可变数量的数据,必须在每次Spi_AsyncTransmit函数调用之前调用Spi_SetupEB函数并将新参数存储在 SPI Handler/Driver中。要传输恒定数量的数据,只需在第一次Spi_AsyncTransmit函数调用之前调用Spi_SetupEB函数将参数存储在 SPI Handler/Driver中即可。

9.4.2 一个通道,一个作业,一个序列

  下面的序列图显示了Spi_SetupEB/Spi_AsyncTransmit调用仅由一个Channel组成的一个Job进行Sequence传输的示例。写入或读取访问是“User Dependant”,并且当作业分别只是读取或写入时可以跳过。
  示例:通道ID 2属于作业ID 1,作业ID 1属于序列ID 0

在这里插入图片描述
在这里插入图片描述

9.4.3 多个通道,一个作业,一个序列

  下面的序列图显示了Spi_SetupEB/Spi_AsyncTransmit调用Sequence传输的示例,其中只有一个由多个Channel组成的Job。写入或读取访问是“用户相关的”,并且当作业分别只是读取或写入时可以跳过。
  示例:通道ID 2和3属于作业ID 1,作业ID 1属于序列ID 0

在这里插入图片描述
在这里插入图片描述

9.4.4 多个通道、多个作业和一个序列

  以下序列图显示了Spi_SetupEB/Spi_AsyncTransmit调用链接作业的序列传输的示例。写入或读取访问是“User Dependant”,并且当作业分别只是读取或写入时可以跳过。
  示例:通道ID 0至3属于作业ID 1(较高优先级),通道ID 4至10属于作业ID 2(较低优先级),该作业没有结束通知功能。这些作业属于同一个序列ID 0
在这里插入图片描述
在这里插入图片描述

9.4.5 多个通道、多个作业和多个序列

  以下序列图显示了Spi_SetupEB/Spi_AsyncTransmit调用序列传输的示例。写入或读取访问是“User Dependant” ,并且当作业分别只是读取或写入时可以跳过。
  示例:通道ID 0至3属于作业ID 1(高优先级2),通道ID 4至10属于作业ID 2(低优先级1),该作业没有结束通知功能。这些作业属于同一个序列ID 0,该序列ID被配置为可中断。通道ID 11至13属于作业ID 0(较高优先级3),该作业ID属于配置为不可中断的序列ID 1。
在这里插入图片描述
在这里插入图片描述

9.5 混合作业传输

  根据通道配置和序列内的优先级要求,所有类型的混合作业传输都是可能的。用户知道哪些通道正在使用。然后根据这些Channel的类型,调用相应的方法。

9.6 LEVEL 0 同步传输图

9.6.1 写入/同步传输/读取 (IB):多个通道、多个作业和一个序列

  以下序列图显示了Spi_WriteIB/Spi_SyncTransmit/Spi_ReadIB调用链接作业的序列传输的示例。当作业分别只是读取或写入时,可以跳过写入或读取步骤。
  示例:通道ID 0到3属于作业ID 1(较高优先级),通道ID 4到10属于作业ID 2(较低优先级)。这些作业属于同一个序列ID 0

在这里插入图片描述
在这里插入图片描述

9.6.2 设置/同步传输 (EB):多个通道、多个作业和一个序列

  以下序列图显示了Spi_SetupEB/Spi_SyncTransmit调用链接作业的序列传输的示例。写入或读取访问是“User Dependant”,并且当作业分别只是读取或写入时可以跳过。
  示例:通道ID 0到3属于作业ID 1(较高优先级),通道ID 4到10属于作业ID 2(较低优先级)。这些作业属于同一个序列ID 0
在这里插入图片描述
在这里插入图片描述

10 配置规范

10.1如何阅读本章

  详细信息请参考SWS_BSWGeneral中的10.1 “Introduction to configuration specification”。

10.2容器及配置参数

  以下章节总结了所有配置参数。参数的详细含义在第7章和第8章中描述。如有必要,可以添加更多硬件/实现特定参数。SPI模块应拒绝具有不受实现支持的分区映射配置。

10.2.1 SPI

在这里插入图片描述
在这里插入图片描述

10.2.2 SpiDemEventParameterRefs

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2.3 SpiGeneral

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  SpiKernelEcucPartitionRef引用的ECUC分区应是SpiEcucPartitionRef引用的ECUC分区的子集。
  如果SpiEcucPartitionRef引用一个或多个ECUC分区,则SpiKernelEcucPartitionRef的重数应为1,并且也引用这些ECUC分区之一。

10.2.4 SpiSequence

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

10.2.5 SpiChannel

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2.6 SpiChannelList

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2.7 SpiJob

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2.8 SpiExternalDevice

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  SpiDeviceEcucPartitionRef引用的ECUC分区应是SpiEcucPartitionRef引用的ECUC分区的子集。
  如果SpiEcucPartitionRef引用一个或多个ECUC分区,则SpiDeviceEcucPartitionRef应具有大于零的重数,并引用这些ECUC分区中的一个或多个。

10.2.9 SpiDriver

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2.10 SpiPublishedInformation

在这里插入图片描述

10.3公开信息

  详细信息请参阅SWS_BSWGeneral中的第10.3章“Published Information”

10.4 配置概念

   SPI Handler/Driver模块和使用它的模块之间存在某种关系。这种关系在配置阶段得到解决,其结果会影响这些模块之间API行为。用户需要向 SPI Handler/Driver提供部分配置,以使其适应其需要。 SPI Handler/Driver应采用此配置并向用户提供所需的工具。该图显示了 SPI Handler/Driver配置期间的信息流。它仅针对一个用户显示,例如使用外部EEPROM驱动程序,但这种情况对于 SPI Handler/Driver的所有用户都很常见。为了突出更多用户受到影响的情况,绘制了几个重叠的文档。

在这里插入图片描述

图中的步骤是:

  1. SPI Handler/Driver的用户(外部EEPROM驱动程序)编辑XML配置文件。该XML配置文件与用户用来生成自己的配置的文件相同。
  2. 对于每个ECU,XML硬件配置文档包含配置某些参数时应使用的信息。
  3. “SPI generation tool”。SPI generation tool(这里仅反映生成SPI使用代码的部分)应生成要导出的句柄和配置集的实例。在此步骤中,软件集成商将提供缺失的信息。
  4. SPI实例配置文件。生成后,用户所需的所有符号处理程序都包含在 SPI Handler/Driver的配置头文件中。
  5. 用户获取处理程序的符号名称。用户导入生成的句柄以按照其XML配置文件的请求使用它们。

11 不适用的要求

   这些要求不适用于本规范。(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)

12 附录

   下一页显示的表格只是一个示例,旨在帮助将来必须配置软件模块以使用 SPI Handler/Driver的用户(和/或开发人员)。该表独立于Spi_ConfigType结构,但包含所有元素和聚合,例如通道、作业和序列。
在这里插入图片描述
在这里插入图片描述

注:本文源自文件AUTOSAR_SWS_SPIHandlerDriver.pdf

【完】

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
SPI(Serial Peripheral Interface)是一种串行外设接口,用于在微控制器、存储器和其他外设之间进行通信。AUTOSARAutomotive Open System Architecture)是一种在汽车电子系统中广泛应用的标准化软件架构。 AUTOSAR SPI传输是指在AUTOSAR架构中使用SPI接口进行数据传输。SPI传输在汽车电子系统中具有重要作用,可用于连接各种外设,如传感器、执行器和存储器等。SPI接口通过主从模式进行通信,其中一个设备作为主设备控制通信过程,而其他设备则作为从设备接收和发送数据。 在AUTOSAR架构中,SPI传输通常是通过驱动程序来实现的。驱动程序负责配置和控制SPI接口的各种参数,如时钟频率、传输位数和传输模式等。SPI传输的数据可以是单向的,主设备向从设备发送数据,也可以是双向的,主设备和从设备之间进行数据的双向传输。 AUTOSAR SPI传输的主要优点包括高速传输、可靠性和灵活性。SPI接口可以以高速率进行数据传输,适用于对实时性要求较高的应用场景。此外,SPI传输也具有较低的传输延迟和较小的系统开销。AUTOSAR架构还允许SPI接口的配置和扩展,以满足不同外设的需求。 然而,AUTOSAR SPI传输也面临一些挑战。首先,SPI接口不具备数据包传输机制,需要在协议层上进行数据包的封装和解析。其次,SPI传输的线路长度受限,通常适用于近距离的设备连接。最后,SPI传输也存在数据安全性和冲突的问题,需要在设计阶段进行充分考虑。 总之,AUTOSAR SPI传输是一种在AUTOSAR架构中使用SPI接口进行数据传输的方法。它可以实现高速、可靠和灵活的数据传输,广泛应用于汽车电子系统中。对于开发人员来说,了解和理解SPI传输的原理和使用方法,对于设计和实现汽车电子系统具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟寒凌风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值