Autosar MCAL-ADC详解(一)-基于Tc27x的cfg软件
文章目录
- 前言
- TC27x系列ADC硬件资源
- Autosar ADC模块
- AdcConfigSet
- 系统时钟
- 分频参数
- Analog clock frequency分频参数
- cfg配置fADCI分频值
- Digital clock frequency分频参数
- cfg配置fADCD分频值
- 采样同步信号
- cfg中配置采样同步信号来源
- supply voltage选择
- 预充控制
- 睡眠模式
- 子配置项
- AdcGlobInputClass
- cfg中配置AdcGlobInputClass
- AdcHwUnit
- Arbitration Round Length
- Hw Unit Id
- Post Cal
- Sync Conv Mode
- AdcChannel
- An Channel Num
- Channel High/Low Limit
- Channel Limit Check
- Channel Id
- Channel Range Select
- Channel Ref Voltsrc High
- Channel Ref Voltsrc Low
- Input Class Selection
- 总结
前言
既然谈到MCAL,那必定是与硬件芯片分不开的,但是网上的博客资料大部分都是按照理论知识来分析(也可能有些收费的我看不到。。。)。基于此,本文详细介绍Autosar MCAL中的ADC模块,应用的单片机为TC27x系列。
TC27x系列ADC硬件资源
ADC共有48+12个通道,查看datasheet可知,48为Group0的通道0-7到Group5的通道0-7,12为Group6的0-5到Group7的0-5。后12个引脚来自于Port的复用,前48个部分可以来自于Port的复用,也可以来自于Analog Inputs。ADC共有8个转换器。
截取其中一路通道Group0.0如下图所示:
对于48个模拟输入引脚来说,Analog Input Number(0-47)决定了其所在的Group和Channel.
Autosar ADC模块
在Autosar官方文档中的配置项有如下几个:
AdcConfigSet:此容器包含AUTOSAR Adc模块的配置参数和子容器
AdcGeneral:ADC驱动程序软件模块的一般配置(参数)。
AdcPublishedInformation:“通用”已发布信息未涵盖的其他已发布参数。请注意,这些参数具有“PUBLISHED-INFORMATION”配置类设置,因为它们是发布信息。
基本主要配置的是前两项内容。
AdcConfigSet
系统时钟
配置系统时钟是由McuClockReferencePoint而来,查看芯片手册可知,fVADC时钟由fSPB为基础时钟。本文设为100MHZ
分频参数
分频图:
Analog clock frequency分频参数
datasheet中规定fADCI(转换器时钟)频率最高为20MHZ
cfg配置fADCI分频值
计算得到fADCI频率为100/(4+1)=20MHZ
Digital clock frequency分频参数
cfg配置fADCD分频值
计算得到fADCD频率为100/(3+1)=25MHZ
采样同步信号
采样同步信号由CCU6x的T13生成。
cfg中配置采样同步信号来源
这个地方只是配置了可以由CCU6来触发同步信号,后面还有一个配置是否开启该功能
supply voltage选择
可选5V或3.3V,配置寄存器为GLOBCFG.LOSUP
预充控制
选择是否开启预充控制,此处选择带预充控制。VDDM指的为电源电压。
参考电流可以通过从电源电压VDDM预加载电容场来降低。该特性通过在寄存器GLOBCFG中设置REFPC位来启用。在这种情况下,参考电压和电源电压必须在同一水平上。电容场首先在第一相从VDDM预加载,然后在第二相调整为VAREF。
睡眠模式
选择是否允许睡眠模式,此处选择允许。该项由寄存器CLC.EDIS位控制
子配置项
AdcGlobInputClass
设置全局的采样精度和采样时间,对应的寄存器为GLOBICLASS,时间配置为0时,采样时间为2/fADC.采样精度不用多说,位数越高精度越高,12位对应的值为0-4096。该寄存器有两个一样参数项,参数的可以设置的不一样。
cfg中配置AdcGlobInputClass
EMUX没有用到,暂时不管。
AdcHwUnit
AdcHwUnit是Autosar中规定的标准配置,一个AdcHwUnit对应一个ADC硬件单元(转换器),对于tc27X,最多有8个AdcHwUnit。规范中一个AdcHwUnit中包括AdcChannels,AdcGroups(CFG中扩展了AdcKernelInputClass,为对应ADC组的采样时间和转换精度)
Autosar规范中定义:由于一个AdcChannel可以是多个AdcGroup的一部分,这个容器(AdcChannel)不是作为AdcGroup的子容器实现的,而是作为AdcHwUnit的子容器实现的。也就是说同一个AdcChannel可以存在多个AdcGroup中。但一般在实际使用过程中,都是和硬件Group一一对应的
Arbitration Round Length
该项在用户手册中可以查到,由寄存器GxARBCFG.ARBRND配置。在28.5.3.1章中建议配置为4.
仲裁槽位的持续时间是可配置的。 tSlot = (DIVD+1) / fVADC.因此,一轮仲裁的持续时间为tARB = 4 × tSlot。
cfg中配置如下:
Hw Unit Id
配置所属的硬件单元,
Post Cal
选择是否开启硬件校准,由寄存器GLOBCFG.DPCALx位决定是否禁止硬件校准。
cfg中配置为禁止校准:
Sync Conv Mode
选择ADC内核的运行方式.如果需要同步转换-并行采样的话,这里需要配置ADC内核主机或从机。不需要同步转换的话,配置成STANDALONE即可。
下图显示了ADC0为主机,ADC1和ADC2为从机时的转换过程,对通道3进行同步采样。
主ADC请求对某个通道(对应的通道控制寄存器GxCHCTRy中的SYNC = 1)进行同步转换,连接的从ADC内核也请求同步转换
注意:程序寄存器GxSYNCTR需要在转换组中所有ADC核中的位域GxARBCFG.ANONS = 00B之后设置。之后设置主节点的位域ANONC为11b
AdcChannel
AdcChannel作为Autosar标准中定义的容器,跟硬件ADC通道对应。
An Channel Num
连接每个ADC硬件单元的8个模拟输入
For HWUNIT_ADC0: 0 - 7 for TC27x / TC29x and 0 - 15 for TC26x
For HWUNIT_ADC1: 8 - 15 for TC27x / TC29x and 16 - 31 for TC26x
For HWUNIT_ADC2: 16 - 23 for TC27x / TC29x and 32 - 47 for TC26x
For HWUNIT_ADC3: 24 - 31 for TC27x / TC29x and 48 - 63 for TC26x
For HWUNIT_ADC4: 32 - 39 for TC27x / TC29x
For HWUNIT_ADC5: 40 - 47 for TC27x / TC29x
For HWUNIT_ADC6: 48 - 55 for TC27x / TC29x
For HWUNIT_ADC7: 56 - 63 for TC27x / TC29x
For HWUNIT_ADC8: 64 - 71 for TC29x
For HWUNIT_ADC9: 72 - 79 for TC29x
For HWUNIT_ADC10: 80 - 87 for TC29x
该配置项需要与实际应用对应,与硬件原理图相关。
cfg中配置硬件通道:
Channel High/Low Limit
转换结果最大/小值限制,该值还受limit check开关影响,没有enable limit check时设置无效。
cfg中配置Channel High/Low Limit,实际由于limit check未使能,所以配置没作用
当转换/比较的结果在用户定义的边界内或边界外时,就可以生成通道事件(参见位域CHEVMODE)
Channel Limit Check
enable/disable Limit checking,此处未enable
Channel Id
该ID为名称定义用,不需要与硬件通道ID一致,一般AdcGroup中的Channel Id是顺序的,而对应的An Channel Num可能不是顺序的。
Channel Range Select
这个配置是在Autosar规范中定义的。类型如下:
选项 | 描述 |
---|---|
ADC_RANGE_ALWAYS | 完全范围,独立于通道限制设置 |
ADC_RANGE_BETWEEN | 下限和上限之间的范围-包括高限制值 |
ADC_RANGE_NOT_BETWEEN | 超出上限或低于下限的范围-包括下限值 |
ADC_RANGE_NOT_OVER_HIGH | 范围低于高限值-包括高限值 |
ADC_RANGE_NOT_UNDER_LOW | 范围高于下限值 |
ADC_RANGE_OVER_HIGH | 范围高于上限值 |
ADC_RANGE_UNDER_LOW | 范围低于下限制-包括下限值 |
cfg中配置:(实际查看vector代码,这个配置好像没有起作用,根本没有定义,理论上来说这个应该是软件实现的,tc27x中没有这个相关寄存器配置)
Channel Ref Voltsrc High
通道的上参考电压,可以选择VAREF或CH0。由寄存器GxCHCTRy.REFSEL配置。
cfg中配置:
Channel Ref Voltsrc Low
通道的下参考电压,此处只能配置为VAGAND
Input Class Selection
选择采样时间和精度,TC27x可以选择全局也可以选择组,对应的寄存器为 GxICLASS0,GxICLASS1,GLOBICLASSy(x:0-7,y:0-1)
cfg中配置:(AdcKernelInputClass和AdcGlobInputClass配置项一样)
总结
ADC一篇写不完了,之后再更新后面的配置吧,然后对转换过程进行全局的梳理。大部分配置项都是参考的用户手册和数据手册,主要根据Autosar规范,具体应用到芯片时,会有一些差异和扩展。
参考资料:
Infineon-TC27x_D-step-UM-v02_02-EN.pdf
Infineon-TC27xDC-DataSheet-v01_00-EN.pdf
AURIX™公开课第15讲-逐次逼近模数转换器SAR ADC
若你觉得本文对你有帮助,欢迎点赞,关注,收藏,转发~~~
你的鼓励是对小弟的最大支持~~~
建了一个WX公众h,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~
赞哥哥s: mcal用的2.0.2,跟4.0.0差别挺大的
行百里者做甚: 感谢耐心回复.你说的大致我是明白的,从nvblock这边配置可能更容易生成RTE这块操作接口. 我也参照你这篇文章做了配置,但是bsw nvm始终没有生成新的block配置,然后我尝试生成RTE, 也生成了 但是rte.c中read_block()和write_block()都没有copy这一步,还是有点问题。还是怀疑是没有生成block导致的,所以还是想问下在这块还有没有需要勾选其他哪里配置?另外你说的etas推荐的流程是这样的,这个可以参考哪个文档看看呢?
逛公园第一名: 大佬,官方给的双核demo工程我没有在官网找到,在社区找到了一个22年的rtd2.0.0的demo这个差别大吗,我用的是rtd4.0. 可以问问你这个是哪个吗
赞哥哥s: 1)nvblock就是为了生成bsw的nvm的,除了生成nvm配置外,还会生成操作nvm的接口。 etas推荐的流程是这样的,基本不需要手写多少代码,对应fee的配置也是自动生成的 2)有空我再完善下吧。
行百里者做甚: 博主你好,在看了关于NVM配置这篇文章想问两个问题: 1)从NvBlock配置block和从BSW NVM配置生成NvRam Block有什么不同吗?或者说在哪些情况下要从NvBlock生成啊?一定要在NVM生成block cfg才能执行后续RTE的生成吗? 2)从NvBlock配置block属性这些操作能否再具体些,相信看这些资料都是新手有些操作还不是很清晰(比如如何删除RAM-ELEMENT、 生成NVM、RamBlock Renfence及RomBlock InitValue等) 以上也是在操作过程中遇到的问题,纯属个人理解望不要怪罪,感谢!