目录
前言
汽车电子嵌入式开始更新全新的AUTOSAR项目实战专栏内容,从0到1搭建一个AUTOSAR工程,内容会覆盖AUTOSAR通信协议栈、存储协议栈、诊断协议栈、MCAL、系统服务、标定、Bootloader、复杂驱动、功能安全等所有常见功能和模块,全网同步更新开发设计文档(后期也会更新视频内容)。本文为MCAL系列配置-Port及Dio模块配置实践。
《AUTOSAR项目实战(5)-MCU模块配置实践》一文我们实现了MCU模块的配置,本文将实现Port及Dio模块的配置,配置了这三个模块后,理论上我们的MCU芯片就能正常跑起来了,能完成最简单的LED点灯的功能了!
环境
AUTOSAR BSW Tool:Vector
AUTOSAR MCAL Tool:EB
Hardware Platform: Infineon Tricore TC387
Build Tool: Tasking
Debug Tool: UDE
AUTOSAR项目实战系类文章
AUTOSAR项目实战(1)-数据地址访问对齐问题分析
AUTOSAR项目实战(2)-内存访问异常问题分析
AUTOSAR项目实战(4)-系统总线及外设错误问题分析
AUTOSAR项目实战(3)-OsCounter访问权限问题分析
AUTOSAR项目实战(5)-MCU模块配置实践
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
如下图所示,我们的开发板使用了TC387芯片的很多Port引脚,但是,无论哪一个Port引脚要么是输入引脚,要么就是输出引脚。所以,我们选了一个输入引脚(CAN Rx, P20.7)和已给输出引脚(CAN Tx, P20.8)作为本文的示例来讲解,其他的Port引脚配置类似。
确定要配置的Port Pin引脚后,我们需要查看对应芯片手册(Infineon-AURIX_TC38x-UserManual-v02_00-EN.pdf)的引脚信息。
配置Port Pin的时候需要上图的信息。
对于输入Pin脚,主要配置以下两个参数:
PortInInputPullResistor: 配置输出引脚是否需要MCU内部上拉还是下拉,还是不需要上下拉。
至于MCU的输入引脚什么时候需要上下拉,什么时候不需要上下拉,我们可以尝试问问ChatGPT.
问题1:MCU的Port引脚为输入引脚时,什么时候要配置为上拉,什么时候要配置为下拉,什么时候配置为没有上下拉?
ChatGPT回答:
在 MCU 设计中,将 Port 引脚配置为输入模式 时,是否需要上拉、下拉或无上下拉,取决于具体应用场景。以下是不同情况下的选择依据:
1. 配置为上拉(Pull-up)
适用情况:
·默认输入为高电平(逻辑 1),防止浮空状态。
·开关按键、拨动开关等:通常一端接地,按下时接地,不按时需要上拉到高电平。
·I²C 总线(SDA、SCL):I²C 规范要求必须有上拉电阻,否则通信无法正常工作。
·外部信号可能是开漏(Open-Drain)或集电极开路(Open-Collector)输出,需要上拉提供逻辑 1。
·低功耗应用:上拉比下拉通常消耗更少的功耗,减少电流泄漏。
示例:
·按键输入(按下接地,松开为高电平):
o配置 MCU 内部上拉
o或使用外部上拉电阻(如 10kΩ)
MCU Pin ----[10kΩ]---- VCC
|
[SW]
|
GND
2. 配置为下拉(Pull-down)
适用情况:
·默认输入为低电平(逻辑 0),防止浮空状态。
·开关按键、拨动开关等:通常一端接 VCC,按下时接 VCC,不按时需要下拉到低电平。
·某些总线或协议要求默认低电平,如部分 SPI 片选信号(CS)。
·MCU 的特殊功能要求默认低电平,例如 Boot 模式选择(某些芯片上电时通过某个引脚的状态决定启动模式)。
示例:
·按键输入(按下为高电平):
o配置 MCU 内部下拉
o或使用外部下拉电阻(如 10kΩ)
VCC
|
[SW]
|
MCU Pin ----[10kΩ]---- GND
3. 无上下拉(Floating/Hi-Z)
适用情况:
·外部有明确的信号源驱动(如传感器、通信信号等)。
·多设备共用一个信号线,不应强制上拉或下拉,例如 UART RX 引脚、SPI MISO(主机输入)。
·高阻态(Hi-Z)应用,如多设备共用某个 I/O 端口(总线),需要避免影响其他设备驱动信号。
·某些低功耗模式下,避免不必要的电流消耗(避免上拉或下拉导致漏电流)。
示例:
·UART RX 引脚(由外部设备驱动,不需要内部上拉/下拉)
·SPI MISO(主机输入)
·外部传感器数据输入端(由传感器提供高低电平)
·ADC(模拟输入),通常不使用上拉/下拉,以免影响测量准确性
4. 何时避免浮空(未定义状态)
如果输入引脚未连接到明确的高/低电平(悬空),可能会导致:
·电平不稳定(受环境噪声影响),误触发中断或错误读取数据。
·不必要的功耗,由于 CMOS 输入级在悬空时可能进入高阻状态,导致输入级 MOS 管部分导通,产生漏电流。
一般情况下,不建议让输入引脚悬空,除非有特定应用需要(如 ADC 模拟输入)。
5.总结
场景 | 配置 |
按键(常开,按下接地) | 上拉 |
按键(常开,按下接 VCC) | 下拉 |
I²C 总线(SCL/SDA) | 上拉(必须) |
SPI MISO(主设备输入) | 无上下拉 |
UART RX | 无上下拉 |
传感器数据输入 | 无上下拉(通常由传感器驱动) |
低功耗应用 | 无上下拉或根据需要选择最优方案 |
需要默认高电平 | 上拉 |
需要默认低电平 | 下拉 |
场景 | 配置 |
如果不确定,可以:
1.查看设备手册(Datasheet),看是否推荐上拉/下拉。
2.观察信号是否悬空,如果 MCU 读到不稳定值(0/1 交替),通常需要上拉或下拉。
3.考虑功耗,在低功耗应用中,选择合适的上下拉方式以减少电流损耗。
问题2:MCU的CAN控制器的Rx输入引脚,应该配置为上拉还是下来,还是不需要配置上下拉?
ChatGPT回答:MCU 的 CAN 控制器 RX(接收)引脚 通常不需要配置上下拉,即保持浮空(Hi-Z)。
原因分析
1.CAN 总线是差分信号:
oCAN 通信使用 CAN_H(高电平) 和 CAN_L(低电平) 两根信号线进行差分传输,而 Rx 直接接收 CAN 收发器(CAN Transceiver)的输出,其信号是由收发器决定的。
o由于 CAN 本质上是一个 物理层收发器驱动的信号,MCU 不需要内部上拉或下拉 来维持电平。
2.CAN 收发器的输出已被设计为有效信号:
oCAN 接收器(PHY,如 TJA1050、SN65HVD230)的 RX 引脚是推挽输出(Push-Pull),信号稳定,不需要 MCU 额外提供上拉/下拉。
o外部 CAN 收发器已经决定了 CAN RX 的逻辑电平,如果 MCU 再加上拉或下拉,可能会影响通信质量。
3.错误配置可能导致的问题:
o上拉(Pull-up):会影响 RX 信号,可能使接收到的信号失真或增加不必要的电流消耗。
o下拉(Pull-down):可能导致 CAN_RX 低电平滞留,影响数据接收,甚至影响 CAN 总线的正常通信。
正确的配置
·MCU 的 CAN RX 引脚应配置为输入模式(Input Floating / Hi-Z),不加内部上拉或下拉。
·需要一个 外部 CAN 收发器(如 TJA1050、SN65HVD230、MCP2551),收发器的 RX 输出直接连 MCU RX,它已经提供了稳定的信号。
CAN 总线 ---> CAN 收发器(TJA1050) ---> MCU CAN RX (浮空输入)
CAN_H ---+
| 差分信号
CAN_L ---+
CAN 收发器
-----------------
TXD <--- MCU CAN TX
RXD ---> MCU CAN RX (无上下拉)
-----------------
总结
✅ MCU 的 CAN RX 引脚应该配置为浮空输入(Hi-Z),不使用上拉或下拉。
✅ CAN 收发器已经提供了稳定的输出信号,不需要额外干预。
❌ 不要配置内部上拉或下拉,否则可能影响 CAN 通信的稳定性。
综上所述,P20.7这个CAN Rx输入引脚的PortInInputPullResistor参数配置为NO PULL.
PortPinInputPadLevel: 配置Pin脚数字电路逻辑电平标准。现在的MCU一般都是用CMOS工艺,所以一般都选着CMOS_AUTOMOTIVE.
对于输出Pin脚,主要配置以下三个参数:
PortPinInitalMode: 这个需要参考第一章节中的引脚分析,MCU的Port引脚一般都具有复用功能,我们使用Pin 20.8作为CAN00的Tx引脚,所以需要选着ALT 5.
PortPinLevelValue: 配置输出引脚的默认电平,这个根据实际需求来配置即可。
PortPinOutPinDriveMode: 配置输出引脚是开漏(Open drain)输出,还是推挽(Push Pull)输出。
问题3:MCU的输入引脚什么时候配置为开漏(Open drain)输出,什么时候配置为推挽(Push Pull)输出?
ChatGPT回答:在 MCU 设计中,开漏(Open-Drain) 和 推挽(Push-Pull) 是两种常见的 GPIO 输出模式。选择哪种模式,取决于具体的应用需求。以下是详细的分析:
1. 开漏输出(Open-Drain)
工作原理
·仅能输出低电平(0),不能主动输出高电平(1)。
·当 MCU 输出 低电平(0) 时,内部 MOSFET 导通,引脚被拉低到 GND。
·当 MCU 输出 高电平(1) 时,内部 MOSFET 关闭,引脚处于高阻态(Hi-Z),需要外部上拉电阻 提供高电平。
·典型的上拉电阻值:4.7kΩ ~ 10kΩ(根据电流需求调整)。
适用场景
场景 | 原因 |
I²C 总线(SDA、SCL) | I²C 需要多设备连接,必须使用 开漏+上拉电阻 形成线与逻辑(Wired-AND)。 |
多个设备共享信号线(如中断 INT、复位 RESET) | 确保多个设备能共同拉低信号线,而不会发生短路。 |
外部晶体管驱动电路(如驱动继电器、LED) | 通过外部上拉到较高电压(如 12V),从而控制更大电流。 |
异步通讯接口,如 SMBus、1-Wire | 需要开漏以支持线与逻辑和双向通信。 |
外部设备要求开漏(如某些 EEPROM 或 LCD 驱动) | 设备数据手册要求使用开漏。 |
电路示意
MCU GPIO ----+---- 4.7kΩ ---- VCC
|
[设备]
|
GND
2. 推挽输出(Push-Pull)
工作原理
·能够主动输出高电平(1)和低电平(0)。
·内部有两个 MOSFET(一个 P-MOS 负责输出高电平,一个 N-MOS 负责输出低电平)。
·无需外部上拉电阻,输出电流能力更强。
适用场景
场景 | 原因 |
普通 GPIO 控制(如 LED、蜂鸣器) | 直接驱动负载,无需额外上拉电阻。 |
SPI、UART、CAN 等高速通讯接口 | 需要稳定的高低电平转换,提高信号质量。 |
PWM 输出(驱动马达、伺服等) | 推挽输出可以直接驱动负载,提高效率。 |
片选信号(CS)和控制信号(如 RESET, ENABLE) | 需要快速、可靠的高低电平切换,避免悬空状态。 |
高速信号传输(如时钟信号) | 推挽模式提供更强的驱动能力,提高信号完整性 |
电路示意
MCU GPIO ---- 设备输入
无需额外电阻,直接连接目标设备。
3.选择开漏还是推挽?
场景 | 推荐模式 |
I²C 通信(SDA, SCL) | 开漏 + 上拉 |
多设备共享信号(如外部中断) | 开漏 + 上拉 |
控制 LED、蜂鸣器 | 推挽 |
SPI、UART、CAN、PWM 等高速信号 | 推挽 |
复位信号 RESET | 开漏 + 上拉 |
外部晶体管或功率驱动(MOSFET, 继电器) | 开漏 + 上拉 |
总结
·开漏输出(Open-Drain)
o适用于 多个设备共享信号线、I²C、低速信号
o必须外接上拉电阻
o仅能主动输出 低电平(0),高电平由外部上拉提供
·推挽输出(Push-Pull)
o适用于 普通 GPIO、SPI、UART、PWM、高速信号
o无需上拉电阻
o能主动输出高低电平,驱动能力强
综上所述,我们的P20.8 CAN Tx应该配置为推挽输出,一般没有特殊功能或者用途都默认配置为推挽输出。开漏输出需要外部上拉电路支持。
Dio封装了Port模块,配置也很简单,如上图所示,按照Port组(e.g. DioPort_20)依次配置需要的Channel即可。
CAN00_RX这个Dio Chanel就对应 --> P 20.7这个输入引脚。
CAN00_TX这个Dio Channel就对应 --> P 20.8 这个输入引脚。
在Dio配置生成代码Dio_Cfg.h中就会有Dio Channel的宏定义,我们在使用Dio_ReadChannel和Dio_WriteChannel读写Port口的时候,需要用到Channel号。
AUTOSAR架构下Dio模块的使用一般有两种方式。
如下图所示,CanTrcv模块需要配置Can Rx引脚,引用的就是Dio模块的CAN00_Rx Channel.
CanTrcv的静态代码会直接调用Dio_ReadChannel读取CAN Rx的电平信号。
如果用户需要直接读写Port引脚,就会使用IoHwAb模块封装Dio接口。
Example
#include “Dio.h”
void IoHwAb_Write_CAN00_Tx(Dio_LevelType Level)
{
Dio_WriteChannel(DioConf_DioChannel_CAN02_TX, Level);
}
注意:AUTOSAR架构软件,SWC调用IoHwAb的接口需要经过RTE接口,这些AUTOSAR方法论的内容,我们后面再讲解。
如下图所示,CanTrcv会使用到Dio_ReadChannel和Dio_WriteChannel读写Port引脚。
在使用Dio, Port模块的实际工程中经常会遇到这样的问题:
SWC开发工程师抱怨:我读不到Port引脚的高低电平啊?我控制不了Port引脚的电平啊?
这个时候,除了需要排查SWC的控制逻辑和调用接口是否正确外,我们可以通过观测Port引脚模块的寄存器直接看Port的输入输出是否符合我们的要求,这比使用万用表外部测量电平要简单点,当然,前提是有调试仿真环境。
本文详细介绍了AUTSOAR架构下的Port和Dio模块的配置和使用,看起来好像很简单,实际工程在bringup的时候,Port模块的配置至关重要,Port模块没有配置正确就会导致各种CAN, LIN, ETH, SPI等模块功能异常,极大的影响开发进度,所以需要我们真正理解Port模块的配置和调试。
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
汽车电子嵌入式精彩文章汇总第3期
【OS】AUTOSAR OS Event实现原理
【OS】AUTOSAR OS Spinlock实现原理(下篇)
【OS】AUTOSAR OS Spinlock实现原理(上篇)
CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗
TC3xx芯片CAN模块详解
AUTOSAR OS Alarm实现原理
AUTOSAR OsTask切换原理
TC3xx 芯片SPI模块详解
AUTSOAR ComStack如何实现PDU只收不发的
AUTOSAR OsStack监控原理
AUTOSAR架构下ICU唤醒详解
CanNm报文的触发发送详解
Can报文能发不能收问题分析
TC3xx芯片PFlash的ECC校验问题补充
AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解
什么是Copy Table及如何使用Copy Table
AUTOSAR架构下EcuM_StartupTwo函数功能详解
符合AUTOSAR标准的RTAOS-Schedule Tables详解(上篇)
AUTOSAR OS Schedule Table实现原理
符合AUTOSAR标准的RTAOS-Schedule Tables详解(下篇)
TJA1145收发器重要功能介绍
AUTOSAR架构下基于TJA1145收发器通信丢失问题分析
AUTOSAR架构下LIN报文发送失败问题分析
AUTOSAR项目实战(1)-数据地址访问对齐问题分析
AUTOSAR项目实战(2)-内存访问异常问题分析
AUTOSAR项目实战(4)-系统总线及外设错误问题分析
AUTOSAR项目实战(3)-OsCounter访问权限问题分析
AUTOSAR项目实战(5)-MCU模块配置实践
AUTOSAR架构下的Interrupt详解(上篇)
AUTOSAR架构下的Interrupt详解(下篇)
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号