作者:Stephen Du

免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性。
所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准)。
复制/转发请注明来源/作者。

欢迎添加微信交流学习。

本文将详细介绍AUTOSAR MCAL SPI模块的知识点及注意事项,本模块的配置会在其他文章进行分享。本文大部分内容来源于标准,并参照了NXP S32K1系列的 MCAL SPI的代码。
耐心看完本文后,你就对AUTOSAR MCAL SPI有了非常深入的了解。
内容较长,该模块拆分为两篇来讲,这是第二篇。如果没有阅读果第一篇,建议先看第一篇

如对AUTOSAR感兴趣,可添加关注或加好友交流

文章目录

  • 5. MCAL SPI模式分类
  • 6. SPI Buffer
  • 7. SPI其他重要机制
  • 8. 注意事项

5. MCAL SPI模式分类

SPI_LEVEL_ DELIVERED
API等级
Sync Mode
同步模式
Async Mode
异步模式
Spi_Set AsyncMode
(函数)
Sync Concurrent
Polling Mode
轮询模式
Interrupt Mode
中断模式
Level 0 x x x
Level 1 x x x x
Level 2 √(default)

√: support/available x: not support/unavailable IB/EB: 请见后文

LEVEL 0: 提供一组简化的服务,只处理简单的同步传输。对于包含简单SPI网络的ECU来说,这种情况经常发生,即便对于使用高速外部设备的ECU来说也是如此。

同步传输意味着一旦调用了传输服务函数,在该传输请求完成之前,程序将会一直被阻塞(一个好的代码实现,通常也会有超时监控机制,超时后也会释放CPU)。

LEVEL 1: 提供一组简化的服务,只处理异步传输。对于那些使用SPI且定义了不同优先级的功能来说,异步传输经常被用到。还有一些低速外设也同样适合该异步模式。

异步传输意味着当传输正在进行时,调用传输服务的用户不会被阻塞。驱动程序可以在传输结束时通知用户(可由用户进行配置)。异步传输模式又可以分为通过轮询或中断来实现。

LEVEL 2: 前面两种的组合。包含全部功能。可满足不同速率,不同优先级等复杂需求场景。是为那些需要单独提供至少两路SPI总线的芯片而指定的。 否则,使用这种级别的功能没有意义。

如果配置为(异步)轮询模式(仅在API等级为Level 2时有效),需要周期调用:Spi_MainFunction。

Configure/Feature
配置项/功能
Sync Mode
同步模式
Async Mode
异步模式
Comments
注释
Polling Mode
轮询模式
Interrupt Mode
中断模式
SpiPhyUnitSync Check
勾上
Uncheck(default)
不勾(默认)
EB配置项
DMA 不支持 支持 功能/EB配置项
FIFO 支持 支持 功能/EB配置项

由上表可以看到,DMA只有在异步模式(Async Mode)下才有效。

6. SPI Buffer

类型 优/缺点 建议使用场景
IB · 一个很抽象的概念,Buffer机制是隐藏的。
· 硬件Buffer(给定的256字节大小基本涵盖了当前的需求)。
· 菊花链实现。
· 小型数据传输设备(最多10字节)。
EB · 支持大流量通信的高效机制。
· 从ROM表和备用RAM中发送常量数据。
· 可用于不同设备的各种数据表(具有多个集成外围设备的高度复杂的ASICS,或混合信号类型,这种可能超过IB HW Buffer大小)。
· 大流量通信。
· EEPROM通信。
· 复杂硬件芯片控制。
Spi Channel Buffers Allowed Spi Channel Buffers Type
0 IB
1 EB
2 IB/EB

IB: Internal Buffers EB: External Buffers

上表中的优缺点来自于标准文档的翻译,有些语句不太通顺,请看下面文字描述。不影响你理解。

IB: 静态分配。 EB: 可以是静态分配,也可以是动态分配,取决于用户的使用环境。

有些硬件层面提供了比较大的Buffer,这种情况IB类型可以充分发挥硬件特性,提高其性能(这是IB Buffer的设计初衷)(注意,如果有多个channel同时挂到一个device上面,则该功能使用有限制)。如果硬件没有Buffer,则需要软件来模拟实现。

IB类型的Buffer其大小是固定的。EB类型Buffer可以通过API进行设置。

SPI驱动不负责保证IB Buffer里数据的连续性。如果某个Channel被多个Job/Seq使用,SPI驱动也不负责维护该Buffer被多个Job/Seq重写这种场景。

但是发送和接收的Buffer是分开独立的。也就是发送Buffer不会被接收的数据覆盖。

EB Buffer的设计初衷是为了尽量重用外部(这里指用户)Buffer,因为很多情况下,用户已经有了一个Buffer,那么使用EB类型Buffer,只需要将用户Buffer的指针提供给SPI驱动以达到共用的目的。所以SPI驱动也是无法对该Buffer管理的,需要用户来保证其一致性。还有一种场景是,有时候我们的Buffer大小是变化的(比如多个使用者的需求可能不同,或者一个使用者数据长度是变化的),这种情况也需要使用EB类型Buffer来解决(因为IB类型Buffer是固定大小的)。当然EB类型Buffer也可以是固定大小。但是Buffer大小的最大值需要静态配置。总的来说EB类型Buffer使用更灵活。

Channel传输有自己的参数(Spi_SetupEB),但参数(source/target)也可以是NULL,如果发送的时候Source为NULL,则会使用默认参数传输,如果接收的时候Target为NULL,则会忽略接收到的数据。每个Channel,Spi_SetupEB函数只能在发起传输请求前调用一次,除非有信息需要变更,比如长度信息。

取值范围
DataBufferType uint8, uint16, uint32
SpiDataWidth 8/16/32 bits;8~32bits

如果Data Width也是uint8,uint16,uint32三种类型,由于和Data Buffer Type一致,所以可以直接进行转发。但是如果Data Width是8~32,类型不一致,那需要小心。比如,如果Data Width设置12Bits。Data Buffer Type只能选择uint16,这种情况下,发送的时候只能发送低12Bits,忽略高4位。接收的时候只接收低12位,高4位用0填充。

7. SPI其他重要机制

  • 优先级:数字越小优先级越低
  • Sequence链接的Job应具有相同或递减的优先级
  • Sequence可被中断
  • 并发同步传输

该驱动可能会被多个软件模块同时使用,这些模块可能彼此独立,也可能属于不同的层。为了防止同时访问时发生冲突,因此增加了优先级机制,每个Job将分配一个优先级。这种场景通常发生在基于异步机制的实时系统中。

一个Sequence下面的多个Job,要么这些Job都具有相同的优先级。如果优先级不同,则第一个Job优先级最高,优先级最低的放最后(配置的时候就需要这样做)。尽管驱动内部有基于优先级的调度器,但调度器更多用来处理那些允许被中断的Sequence执行过程中发起了一个新的更高优先级的Sequence任务的调度。

Level 1和Level 2可以配置某个Sequence是否可以被抢占。如果使能被抢占功能,则该Sequence启动传输以后,过程中如果有更高优先级的Job发起传输请求,则会挂起(Suspend)当前Sequence去执行更高优先级的Job,打断是以Job为原子单位进行的,也就是必须等待某个Job执行完,下一次调度点执行的时候才切换,请参照前面的时序图。

如果没有使能抢占功能,则该Sequence一旦开始传输,必须等他传输完成后方可执行其他Sequence的传输请求。

如果某个Sequence被抢占,用户需要清楚是否存在多个Sequence共用同一个Channel的情况,如果有,则自己需要管理好Channel的数据,防止抢占过程中被更高优先级的Job将原来Channel里面的数据覆盖掉(通常不建议这么配置)。

同步传输也是可以同时发起多个不同Sequence传输请求的,但用户必须使能该功能(SPI_SUPPORT_CONCURRENT_SYNC_TRANSMIT :Level 0, Level2下有效);

8. 注意事项

  1. 使用本模块中的服务前,必须先调用Spi _Init()函数初始化。

  2. 如果使用了DMA功能,Spi _Init()函数必须在Port_Init()函数及Mcl_Init()函数之后调用。

  3. 如果配置为(异步)轮询模式(仅在API等级为Level 2时有效),需要周期调用:Spi_MainFunction。

  4. 如果使用固定优先级策略,SpiPhyRxDmaChannel优先级必须大于SpiPhyTxDmaChannel优先级。

  5. 如果配置为(异步)中断模式,且启用了DMA:

    1. 必须使能DMA相应通道中断。

    2. 必须将SPI模块的接收/发送中断函数注册到DMA完成回调函数里,配置见DMA模块配置。

      SPI模块中断函数:Spi_LPspi_IsrRxDma_LPSPI_X/Spi_LPspi_IsrTxDma_LPSPI_X,其中X为通道号。

      以通道0为例,中断函数为:Spi_LPspi_IsrRxDma_LPSPI_0/Spi_LPspi_IsrTxDma_LPSPI_0。

  6. 如果配置为(异步)中断模式,但是使用FIFO,需要将中断函数(Spi_LPspi_IsrTDF_LPSPI_X)注册到中断向量表里面,其中X为通道号。

    由于MCAL本身不提供中断向量表注册功能,可以参照SDK或者MCAL示例工程里的中断注册函数:sys_registerIsrHandler()。

  7. 如果使能DMA传输模式,且D-CACHE使能的情况下,不能使用内部buf(IB)来发送或接收,必须将源地址及目标地址的buf放在NON-CACHE区域以避免数据一致性问题(如果放在CACHE区域可能会发生数据乱的现象)。可以在链接文件(*.ld)里面使用分区指令将需要发送或接收的变量进行隔离。

  8. 在SPI模块的回调函数中只能调用下面这些函数,其他函数不允许在里面调用(协议标准规定):

    1. Spi_ReadIB
    2. Spi_WriteIB
    3. Spi_SetupEB
    4. Spi_GetJobResult
    5. Spi_GetSequenceResult
    6. Spi_GetHWUnitStatus
    7. Spi_Cancel

AUTOSAR MCAL详解: SPI (2)相关推荐

  1. AUTOSAR MCAL详解:FLS

    作者:Stephen Du 免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性. 所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准). 复制/转发请注明来源 ...

  2. Autosar MCAL-ADC详解(二)-基于Tc27x的cfg软件

    文章目录 前言 AdcHwUnit AdcGroup Channel Emux Select Group Access Mode 配置 结果指针初始化 结果访问 读取buffer中的结果 Group ...

  3. 详解SPI总线和AUTOSAR SPI

    关注汽车工程师谈技术,一起学习技术 目录 1.SPI概述 2.SPI总线的4种模式 3.AUTOSAR SPI ->返回总目录<- 1.SPI概述 SPI(Serial Periphera ...

  4. 搞一下CP AUTOSAR 入门 | 07 CP AUTOSAR ComM 详解

    前言 本系列请点击:<搞一下CP AUTOSAR入门> 所有系列请点击:<汽车电子系列分享> 在上一篇中已经对AutoSAR中模式管理NvM做了详细的介绍,这篇主要介绍的是Au ...

  5. 基于ETAS RTA-OS的Autosar OS详解(一)—— 任务与中断

    目录 任务 任务调度 基本任务和扩展任务 任务状态 任务优先级 队列任务激活 异步任务激活 性能提升 符合类 任务配置 调度策略 队列激活 自动开始任务 栈管理 扩展任务对应的栈工作方式 必需的栈信息 ...

  6. spi四种工作模式时序图_SPI总线协议及SPI时序图详解

    嵌入式linux QQ交流群:175159209,欢迎爱好者加入交流技术问题! SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种 ...

  7. AUTOSAR Port原理概念详解

    温馨提示:关注公众号"嵌入式软件实战派"回复"AUTOSAR"获得整个AUTOSAR实战教程. 在前面的文章<AUTOSAR SWC详解>提到了Po ...

  8. STM32L475 SPI驱动LCD ST7789V2详解

    概述 最近在学习正点原子潘多拉开发板,在此结合原子哥的代码, 对SPI驱动LCD做一个详细介绍. TFTLCD 和 SPI TFTLCD介绍 TFT-LCD 即薄膜晶体管液晶显示器.其英文全称为:Th ...

  9. SPI总线协议及SPI时序图详解

    转贴地址:https://www.cnblogs.com/adylee/p/5399742.html SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设 ...

最新文章

  1. 目前有量子计算机,中国“祖冲之”刚刚成为当前最强大的量子计算机
  2. 配置 LBaaS - 每天5分钟玩转 OpenStack(121)
  3. 科大星云诗社动态20210529
  4. POJ - 2112 Optimal Milking(二分+二分图最大匹配-多重匹配(修改匈牙利实现)+Floyd求最短路)
  5. Java中大规模集合快速求和计算
  6. gogs可以自动化部署吗_效率提升利器:你还害怕自动化部署吗?
  7. css + div + js 制作HTML tab control
  8. RUP---统一软件开发过程
  9. 如何自定义cad线型_百度经验.html,如何找到自己需要的CAD线型?教你怎样自定义CAD线型...
  10. 关于STC-ISP软件程序烧录失败率高的解决办法
  11. 深度置信网络(DBN)在Tensorflow中的实现以及它在MNIST中的应用实例
  12. 图像相似度对比分析软件,图像相似度计算方法
  13. 利用原生node.js连接sql数据库
  14. matlab中进行太阳能电池模型,基于Matlab的光伏发电系统仿真研究
  15. raspberry pi_如何使用Raspberry Pi和RetroPie构建自己的NES或SNES Classic
  16. 阅读笔记:利用Python进行数据分析第2版——第8章 数据规整:聚合、合并和重塑
  17. 分享一个小案例,用HMS Scankit做一个安卓扫码购小应用
  18. lsnrctl监听器的启动和关闭
  19. 微信小程序实名认证接口_人脸核身接口整理
  20. Openshift API调用方法

热门文章

  1. Python爬取雪球7*24小时信息
  2. 将RSA加密应用在ARM-Linux平台
  3. Python--自动将文件分类归入文件夹
  4. svm实现非线性分类(利用smo算法)
  5. 获取Windows操作系统版本和位数
  6. java PDF转换图片(IMG)
  7. 极客日报第 31 期:编写贩卖《和平精英》游戏外挂,5人被判刑;苹果推出轻App码
  8. (玩转zabbix)硬盘硬件健康状态监控,部件寿命监控
  9. QT去除控件被选中后的焦点虚线框
  10. 在 tsx 中使用 react 的 ref 属性