对heziq网友问题的回答
一、前言
heziq网友在《linux kernel的中断子系统之(四):High level irq event handler》文档中提出了若干个问题,由于在回复中无法图形表达,因此单独出一份文档来回答,希望可以有所帮助。当然,由于他提出的问题和硬件电路设计有关,这里我只是表达我自己的观点(毕竟出身是软件工程师),如果有误,请不吝指出。
二、上拉和下来电阻的基本知识
下图描述了一个外设通过interrupt request line连接到CPU中断控制器的block diagram:
注意:本章通篇以上拉电阻为例,下拉的概念类似,因此就不再赘述了。
基本上,上拉(或者下拉)电阻总是需要的,只不过是看看位于何处,一般而言,有三种可能的位置:
1、集成在外设芯片中(上图中的block diagram描述的就是这种类型)
2、集成在CPU中断控制器上
3、需要设计外围电路来支持
问题来了:集成在芯片上(外设或者CPU)的上拉电阻和芯片外部的上拉电阻有什么区别呢?我们来这样的一个场景,如果外设的电源域是5V的,而CPU中断控制器是工作在3.3V,按照上图的连接是否可以正常工作呢?CPU中断控制器检测高电平可能的范围是3.3V~2.8V,可是,由于使用了外设芯片的内部上拉,实际上,IRQ线上的电压在高电平的时候是5V,这样的电压可能会导致CPU一侧的工作状态异常。如果CPU这一侧也有上拉电阻的配置,那么可以考虑disable外设的上拉电阻(这时候,外设的输出引脚的特性是open drain),而使用CPU芯片内的上拉电阻。如果CPU没有上拉电阻,那么就没有办法了,只能是接外部上拉电阻,当然是上拉到CPU中断控制器需要的那个电压水平。
三、如何选择上拉电阻或者下拉电阻?
对于数字基带电路,分析比较简单。其实主要看看输出端口和输入端口的接口规格就OK了,而这里的接口规格主要是0状态和1状态的电压范围。我们还是以具体的电路为例分析,我们假设外设的电路逻辑会检测某些状态,正常的时候,三极管Q是off状态,IRQ line是输出高电平。当检测到某些状态的时候,外设芯片会导通三极管Q,这时候,IRQ line处于低电平状态。下图描述了Q处于off状态(输出高电平)的示意图:
虽然Q是off的,但是还是存在漏电流,我们标注为Iq。同理流入CPU中断控制器的电流是Icpu,一般而言,CPU中断控制器的输入是high input impedance,因此Icpu也比较小,这样,根据Kirchhoff Current Law,流经pull up电阻R的电流:I = Iq + Icpu。我们假设这个值是10uA,上拉电阻的阻值是10K欧姆,那么在R上的压降就是10uA x 10K = 100mV。也就是说,当外设打算输出高电平的时候,IRQ line上的电平并不等于V而是等于V减去pull up电阻上的压降,当这个压降超过一定范围的时候(这个值来自CPU侧如何感知高电平,也就是说CPU侧能够判别高电平的最小值VIH),电路将不能正常工作。更详细的计算我就不描述了,一句话,pull up电阻不能太大。
下图描述了Q处于on状态(输出低电平)的示意图:
理想情况下,三极管Q导通的时候,IRQ对地短路,因此IRQ的电平就是0电平,不过实际中,导通状态的三极管还是有电阻存在的,也就是说IRQ line不可能是处于0电平,而是Rq,这样,IRQ上的电平应该是Rq x Iq。同样的道理,CPU侧感知低电平也是有一个范围的,因此Iq不能太大,否则IRQ line上的电压会超出范围而被CPU中断控制器检测为高电平。为了现在Iq的值必须增大R,一句话,pull up电阻不能太小。
总结:上拉电阻(或者下拉电阻)不能太大,也不能太小,应该被设计成一个适当的值,让电路可以正常的工作。
三、问题回答
1、问题:有没有同时支持上升沿和下降沿的中断控制器?当然我觉得不可能有同时支持高电平和低电平出发的中断控制器
当然有同时支持上升沿和下降沿的中断控制器,我接触过的CPU中有PXA270的中断控制器是可以配置成双沿触发的,只要检测到rising-edge或者falling-edge,就会触发一个GPIO的中断。当然,对于level-sense的中断,如你所说:不可能有同时支持高电平和低电平出发的中断控制器
配置成双沿触发对软件是有好处的,类似处理键盘deboucing的软件逻辑就不会那么复杂了。配置成双电平触发的话,那么看来只能是正常状态是高阻态,硬件A状态触发高电平,硬件B状态触发低电平,我没有实际接触到这样设定。
2.gpio type 中断,如果是高电平,我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平,我觉得肯定要使用上拉电阻,将电平钳制在高电平。
同意,不过上拉(或者下拉)可能是chip内,也可能是chip外的。
3、gpio type 中断,如果是上升沿中断,是不是要使用下拉电阻或者根本不使用上下拉?如果使用了上拉电阻会怎么样? gpio type 中断,如果是下降沿,是不是要使用上拉电阻,或者不使用。如果使用了下拉电阻会怎么样?
使用上拉或者下拉和上升沿或者下降沿关系不大,主要看电路的情况。上拉主要是用于NPN型的三极管的open collector的情况(上文描述的电路即是如此),对于PNP型的三极管,其open collector的情况如下:
这时候,需要接下拉电阻。
4.如果gpio中断内部使用了上拉电阻,如果外部在使用上拉电阻,会出现什么副作用吗。我觉得有,两个上拉电源之间会互相影响。
如果两个上拉电阻都拉到同样的Vcc,那么其效果就是并联电阻电路而已,这时候,上拉电阻会变小(其阻值是(R1+R2)/(R1R2))。如果两个上拉电阻都拉到不同的Vcc,那么……回去翻一翻Kirchhoff电压和电流定律,我就不分析了。
5.如果gpio中断内部使用了下拉电阻,如果外部在使用下拉电阻,会使pin脚的输入电阻变低,有可能高电平信号拉不起来。
对于一个给定的电路(确定的外设芯片和确定的CPU中断控制器芯片),要使电路正常工作,其上拉或者下拉电阻必须处于一个合理的数值,不能太大,也不能太小。具体需要用我们第二章中的知识来分析
6.如果外设使用边沿触发。比如上升沿,那么它的高电平维持时间有要求吗,由高电平变低电平,是外设自己拉低的?还是interrupt controler控制?
如果外设可以检测某种硬件事件,并通过IRQ line上的上升沿通知给中断控制器的话,那么基本上高电平维持时间可以在芯片手册上查到,和中断控制器无关。当然,我们必须了解中断控制器在检测上升沿的规格,中断控制器一般都是采样来自外设的IRQ line上的电平,高电平当然要维持一定的时间,否则如果上升沿的脉冲卡在中断控制器的两次采样点中间的时候,该上升沿会被中断控制器miss掉。
继续讨论
新讨论请用 GitHub 账号在下方发言——评论会保存在本仓库的 Discussions 里,与站点同寿; 再下方的「历史评论」是原站的只读存档。
评论(9 条,只读存档)
以下为原站的历史评论(只读存档);继续讨论请用上方的评论区。





heziq
linuxer
tigger
heziq
heziq
linuxer
温柔海洋
wowo
linuxer