提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 1、模块介绍
- 2、功能介绍
- 2.1.特性介绍
- 2.2.Port内部结构
- 2.3.Port控制寄存器
- 2.3.1.输入输出控制寄存器(Port Input/Output Control Registers,IOCR)
- 2.3.2 驱动模式寄存器(Pad Driver Mode Register,PDR)
- 2.3.3 差分控制寄存器(LVDS Pad Control Register,LPCR)
- 2.3.4 Pin脚AD功能选择寄存器(Pin Function Decision Control Register,PDISC)
- 2.3.5 Pin脚控制选择寄存器(Pin Controller Select Register,PCSR)
- 2.3.6 Port输出寄存器(Port Output Register,OUT)
- 2.3.7 Port输出修改寄存器(Port Output Modification Register,OMR)
- 2.3.8 Port输出修改置位寄存器(Port Output Modification Set Register,OMSR)
- 2.3.9 Port输出修改清除寄存器(Port Output Modification Clear Register,OMCR)
- 2.3.10 急停开关寄存器(Emergency Stop Register,ESR)
- 2.3.11 Port输入寄存器(Port Input Register,IN)
- 2.3.12 寄存器总结
- 3.使用示例
前言
本文主要介绍Infineon Aurix2G TC3XX系列芯片Port和Dio模块硬件原理、MCAL相关配置和部分代码实现。
1、模块介绍
任何一款芯片,都有几十上百个引脚,也就是我们常说的I/O(Input/Output),这些引脚形成了芯片和控制板之间的连接。芯片的供电、调试、晶振输入以及板级外设的连接,都要依赖这些引脚。在这些引脚种类中,Port(端口)是芯片与板上其他外设或逻辑电路交互的重要引脚,用于芯片发出控制信号或接收外部信号。通过GPIO模式或各类通讯模式,对板载设备进行控制,比如通过GPIO模式进行板载设备的供电使能,通过SPI协议访问板上的其他外设芯片,通过RGMII协议与以太网收发器进行数据交互等。这里提一下,引脚一般只能负责主板之内的通信,跨板级的通信由于信号传输能力的问题,一般是通过收发器与外界进行交互,比如MCU将以太网数据通过引脚传输给板上的以太网收发器芯片Phy,Phy再通过网线将数据传输出去。Aurix TC3XX系列芯片具有丰富的Port连接,而且每个Pin脚具有多种功能复用,提供了丰富的实现方式,支持多种几乎所有板级引脚通讯协议。当我们需要使用某些引脚的时候,只需要进行相关的Port配置,在外设中就可以直接使用了。下面我们就来介绍Aurix TC3XX系列芯片的Port内部原理,各个控制寄存器,以及如何通过MCAL进行引脚功能配置。
2、功能介绍
2.1.特性介绍
TC3XX系列中引脚是分组的,一组引脚称为Port,每个Port有最多16个Pin脚。具体的引脚资源情况要参考对应芯片选型的DataSheet手册,下图是TC397的引脚Map图。
TC3XX的Port具有如下特性:
1.每个Port控制最多16个Pin脚;
2.软件能够控制每个Pin脚的输出;
3.输出修改寄存器易于清除,设置和切换单Pin脚和Pin脚的波形不影响其他Pin脚的状态;
4.软件能够读取每个Pin脚的输入值;
5.多路复用多达7个输出模式;
6.支持外设直接控制;
7.控制Pin脚的驱动特性,如驱动强度,偏移率,上拉/下拉,推挽或开路漏极操作,选择TTL或CMOS/自动输入电平;
8.紧急停止功能允许SMU或通过Pin关闭Pin脚输出;
9.对于具有LVDS功能的Pad对,它可以控制LVDS特性,并允许在LVDS和CMOS之间切换模式;
10.在减少引脚数的封装中,端口模块可以禁用所选引脚;
2.2.Port内部结构
TC3XX系列有多组Port(比如TC397有14组),每组Port有最多16个Pin,每个Pin的输入输出以及控制模式都可独立配置。每个Pin脚内部结构如下图。
从图中我们可以看到,每个Pin脚包括一个Port Slice用于对引脚进行模式和输出控制,一个PAD用于与外界进行输入输出。每个Pin脚都可以被配置为输入或者输出,通过Pn_IOCR寄存器进行切换。当配置为输入时,输出连接将被切断,可通过Pn_IN寄存器读取Pin脚的状态值;当配置为输出时,根据对应的输出模式(GPIO,HW_OUT,ALT1,ALT2…等),进行对应的输出连接。输入端是直连的,也就是说无论输出还是输入模式,都可以通过输入端读取Pin脚的状态。当引脚配置为输出时,可通过配置多路复用选择器,同样也是通过配置Pn_IOCR寄存器进行输出模式控制。当输出模式配置为GPIO时,可通过Pn_OUT寄存器来控制Pin脚状态;当配置为ALT1~ALT7任意一种时,则根据该Pin脚的实际输出连接,由外设进行控制,比如TC375 DataSheet中P00.0,配置为ALT1为GTM控制;还有一种输出模式比较特殊,即最下边的HW_OUT控制模式,当Pin脚配置为该输出时,由外设直接控制,比如RGMII/RMII/MII信号,AD输出信号,与ALT不同的是,需要额外通过PCSR寄存器使能。
另外当输出模式设置为GPIO时,还可以通过位操作寄存器来进行设置。包括位设置寄存器Pn_OMSR和Pn_OMSRx(x=0,4,8,12),位清除寄存器Pn_OMCR和Pn_OMCRx(x=0,4,8,12),以及位位操作寄存器Pn_OMR。其中位设置寄存器只能对输出位进行置位,也就是Pin脚拉高,位清除寄存器只能进行拉低。位操作寄存器除了能够进行拉高拉低,还能进行翻转操作(toggle),就不需要预先读取引脚状态。
大部分引脚还有紧急停止功能(Emergency Stop),能够在紧急情况下与输出连接断开,成为一个输入引脚。急停功能由System Control Unit(SCR),负责控制,可选择Safety Management Unit(SMU)或者P33.8(A)、 P21.2(B)作为急停触发源,急停触发后所有配置急停使能的引脚都会执行急停操作,关闭输出。SCU内部关于急停的功能框图如下。
2.3.Port控制寄存器
关于Port的原理部分其实内容比较简单,大致就是输入和输出,以及输出功能的配置,但是在使用过程中还是存在一些坑的,尤其是在使用高速SPI、RGMII/RMII/MII时,信号驱动能力和EMC等问题较难处理。下面我们就来介绍Port控制寄存器,并详细说明其控制功能。
2.3.1.输入输出控制寄存器(Port Input/Output Control Registers,IOCR)
首先是Port的输入输出控制寄存器,该寄存器控制的功能比较多,包括Pin脚输入输出方向、输入上下拉配置、输出推挽或开漏配置、输出功能选择配置等。每个Port端口具有4个IOCR寄存器,对应Pin脚关系如下:
1.Pn_IOCR0: Pn.[3:0]
2.Pn_IOCR4: Pn.[7:4]
3.Pn_IOCR8: Pn.[11:8]
4.Pn_IOCR12: Pn.[15:12]
我们以Pn_IOCR0为示例,说明寄存器结构和内容。
我们可以看到每个IOCR寄存器有4个位域,分别对应其控制的4个Pin脚,每个位域有5位,这5位表征的值参见下表。
从表中我们可以看出:
1.位域的最高位PCx[4]为1时,则为输出,为0则该Pin脚为输入;
2.当Pin脚为输入时
3.PCx[1:0]表征该Pin脚的上下拉状态;
4.当Pin脚为输出时
5.PCx[3]表征该Pin脚的输出方式,0表示推挽输出,1表示开漏输出;
6.PCx[0:2]表征该Pin脚的输出功能选择,0表示GPIO功能17分别对应ALT1ALT7;
这里有些地方需要注意,如果配置为输入上拉,在外部阻抗较小的情况下是可能输出虚高电平的,如果硬件明确该引脚需要输出低,则就会出现问题。另外对于一些硬件场景,比如使用I2C通讯时,对于所有主从设备,一般外部是有公共上拉的,因此这时候MCU作为主机,输出如果配置为推挽,就会导致通讯失败,需要配置为开漏。
2.3.2 驱动模式寄存器(Pad Driver Mode Register,PDR)
驱动模式寄存器负责控制输出时的驱动强度、翻转速度以及输入上下拉的电源电阻。每个Port端口有两个PDR寄存器,其中PDR0对应Pin0-PIN7,PDR1对应Pin8~Pin15。每个PDR寄存器中包括两部分内容,分别是输出控制的PDx和输入控制的PLx,其寄存器结构如下。
从图中我们可以看到每个Pin脚有一个PDx和一个PLx,都占两个位宽:
其中PDx控制了输出时的驱动强度和翻转能力,驱动强度和翻转能力越高,对抗外部阻抗的能力就越强,信号的波形就越方正,作为牺牲,功耗就会拉高,并且产生的信号辐射和干扰(EMC)就会越高。因此选择怎样的驱动强度和翻转能力,要具体取决于引脚的翻转频率,外部阻抗和EMC需求,比如SPI时钟较高,达到了30MHz,那对应的驱动强度就应该调高,否则信号波形跳变达不到要求,就会导致对端采样出错,通信失败;而对于GMII这样的高速以太网通信,时钟一般高于100MHz,这时候容易产生高辐射,超出EMC要求的标准,反而需要适当降低驱动强度,甚至需要修改硬件电路。
关于驱动强度和翻转能力,TC3XX的不同Pin脚具有不同的驱动速度,包括RFAST、FAST、SLOW,这是硬件资源情况,每个Pin脚类型需要查询对应的DataSheet,比如下图中P00.8为SLOW。
然后对于不同驱动速度的引脚,PDx的含义不同,每个PDx有两个bit位,对应PDx.0和PDx.1,具体情况参考下面对应的表格。比如有一个RFast Pin脚,我想配置位RGMII模式,则PDx=11b。
另外需要注意的是,SpeedGrade越小,表示对应的强度越高,功耗和EMC等级也就越高,RGMII属于例外。
然后我们再回到PAD寄存器的PLx,PLx表征的是输入时的上下拉电源和电阻情况,每个PLx也是两个bit位宽。具体的配置情况查询下表。
2.3.3 差分控制寄存器(LVDS Pad Control Register,LPCR)
TC3XX系列芯片的Port支持差分信号功能,比如通过Hssl协议与外设进行信号交互时,此时数据采用的是差分信号,因此引脚要配置为差分信号模式。
每个Port有8个LPCR寄存器,每个寄存器控制一对Pin脚,相邻的两个Pin组成一对差分Pin脚。差分信号控制寄存器中,[07]位为输入差分控制,[715]位为输出差分控制,位[7]为输入输出公用位。
1.REN_CTRL:输入控制选择,为0时表示普通Pin控制,1表示由HSCT控制,也就是Hssl协议使用;
2.RX_EN:输入控制使能位,为1表示使能接收LVDS,0表示CMOS;
3.TERM:接收接地模式,0表示使用芯片外接电阻接地,1表示内部连接一个100Ω电阻接地;
4.LRXTERM:芯片测试阶段的可编程接地电阻设置,不允许用户修改的;
5.LVDSM:LVDM-M模式使能,0表示默认使用LVDS-H模式,1表示使用LVDS-M模式,可降低数据速率到160Mbps,以降低静态电流;PS:选择该Pin脚对的外部供电Vext,0表示3.3V,1表示5V;
6.TEN_CTRL:输出控制选择,为0时表示普通Pin控制,1表示由HSCT控制,也就是Hssl协议使用;
7.TX_EN:输出控制使能位,为1表示使能接收LVDS,0表示CMOS;
8.VDIFFADJ:LVDS输出幅值调节,可用来调节输出幅值,调节能力参考DataSheet中Vod;
1.VOSDYN:VOS控制静态/动态回环调节,不允许用户修改;
2.VOSEXT:VOS控制内部/外部回环调节,不允许用户修改;
3.TX_PD:TC3XX中未使用该位,TX_EN可表征发送LVDS开关;
4.TX_PWDPD:发送端下电下拉,该功能禁用或启用LVDS下拉电阻;上电时应用程序代码必须禁用TX下拉电阻与;使用5.LVDS下电配置时,如果需要,必须启用下拉功能;
2.3.4 Pin脚AD功能选择寄存器(Pin Function Decision Control Register,PDISC)
TC3XX系列中部分Pin脚是支持AD输入的,也就是将Pin复用为AD采样引脚,比如P40.0复用为AN24。如果复用为AD引脚,那Port端无法再去读取引脚的输入,而是由ADC模块来负责采样读取。
每个Port端口有一个PDISC寄存器,16个位域各控制一个引脚。
PDISx:Pinx的输入控制,0表示数字输入,为普通Pin脚,1表示模拟输入,ADC Pin脚;
2.3.5 Pin脚控制选择寄存器(Pin Controller Select Register,PCSR)
前面我们提到,部分引脚是可以由外设直接控制的,比如RGMII输出,SMU的FSP输出,SCR(standby核)的控制。对于这类引脚,是需要通过配置PCSR寄存器使能的,否则外设无法控制。
每个Port端口有1个PCSR寄存器,其结构如下。
1.SELx:Pinx控制选择,0表示不使能外设控制,1表示使能。
2.LCK:该位是一个只读位,为1时表示数据正在向SCR核传递,无法修改PCSR寄存器,为0则可修改。
PCSR寄存器的使用还是需要注意的,尤其在以太网通信中,输出端Pin脚是需要配置该寄存器为1的。
2.3.6 Port输出寄存器(Port Output Register,OUT)
当Pin脚被设置为GPIO输出时,可直接通过修改输出控制寄存器的值来输出电平,1就是高电平,0就是低电平。每个Port端口有一个OUT寄存器,16个位域对应16个Pin脚。
2.3.7 Port输出修改寄存器(Port Output Modification Register,OMR)
如果我们需要修改某一个Pin脚,一般是希望Port中的其他Pin脚保持不变的,这时候如果使用OUT寄存器则需要先回读OUT的状态,再修改我们需要修改的位。但是这样未免有点浪费资源,因此我们可以通过操作OMR寄存器,只操作我们的目标位,其他位不进行修改。
每个Port有一个OMR寄存器,包括16个Set位和16个Clear位,分别对应16个Pin脚。
关于OMR的Pin脚具体操作,我们通过查询下表可知,如果要拉高某个Pin脚,就将PSx置1,拉低则将PCLx置1,如果要翻转两个都置1,而其他没有设置位的Pin脚则不会受影响。
然后这个修改是直接作用于OUT寄存器的,因此不用担心OUT不同步的问题,另外该寄存器是虚拟的,没有存储位的,也就是说写这个寄存器相当于执行一种操作,而不是修改某个值,回读的话也是0。
2.3.8 Port输出修改置位寄存器(Port Output Modification Set Register,OMSR)
除了OMR寄存器,TC3XX还支持置位寄存器OMSR,它和OMR功能一样是虚拟寄存器,只不过是置位功能。每个Port端口有一个MOSR,16个位域对于16个Pin脚。
PSx:Pinx置位,1表示将该Pin脚拉高,0表示无操作;
同样的,OMSR的功能是将对应的OUT寄存器的位拉高,其他位则不进行操作。回读该寄存器的值为0.
另外TC3XX还提供了4个OMSRx寄存器,同样是虚拟寄存器,区别在于每个寄存器只控制4个Pin脚,这里就不展开介绍了。
2.3.9 Port输出修改清除寄存器(Port Output Modification Clear Register,OMCR)
和输出修改置位寄存器的功能相反,修改清除寄存器OMCR的功能是将目标位清零,其他位不作修改。每个Port端口有一个OMCR寄存器,和4个OMCRx寄存器,每个位域对应一个Pin脚。
PCLx:Pinx清除位,1表示将该Pin脚拉低,0表示无操作;
2.3.10 急停开关寄存器(Emergency Stop Register,ESR)
急停开关寄存器用于控制急停功能的使能,注意这里仅仅是使能,急停的触发在SCU模块内配置。每个Port端口有一个ESR寄存器,16个位域对应16个Pin脚。
ENx:Pinx急停开关使能位,0表示不使能,1表示使能;
2.3.11 Port输入寄存器(Port Input Register,IN)
Port输入寄存器可以用来读取Pin脚当前的状态,无论Pin脚处于输入还是输出,都可以通过IN寄存器读取Pin脚的高低电平。每个Port端口有一个IN寄存器,16个位域分别对应16个Pin脚。
Px:Pin脚读取状态,0表示低电平,1表示高电平;
2.3.12 寄存器总结
Port的内部逻辑其实不复杂,这里对控制寄存器做下总结:
Port需要设置输入输出,包括输入上下拉,输出推挽等,使用输入输出控制寄存器IOCR;
驱动模式需要调整以适配不同的硬件需求,使用驱动模式寄存器PDR;
Pin脚如果复用为ADC,使用Pin脚AD功能寄存器PDISC;
Pin脚如果需要被外设控制例如使用RGMII接口,使用Pin脚控制选择寄存器PCSR;
Pin脚如果需要修改GPIO输出,可使用OUT、OMR、OMSR、OMCR;
读取Pin脚状态使用IN寄存器;
3.使用示例
介绍完了内部原理及寄存器,下面我们基于Aurix 2G的官方MCAL,使用EB Tresos工具来进行配置。通过两个示例来给大家讲解如何进行Port的配置。第一个是一个Dio使用示例,第二个是SPI配置示例。
3.1. GPIO使用示例
Dio配置这里我们做一个Pin脚状态读取和Pin脚状态输出。我这边开发板上P00.7是一个输入按钮,所以输入我选择这个Pin脚,输出的话P00.6有一个LED灯,能够指示输出。软件上循环读取P00.7的状态,并将其值直接输出给P00.6。开发板上按键按下是低电平,LED灯是低电平点亮,所以这里表现应该是按下按键则灯亮。
1.首先我们来到Port这里,打开P00.7界面,这里PortPinSymbolicName输入一下,方便维护;PortPinDirection配置为输入;其他基本不用修改。
。。。。。未完待续