对heziq网友问题的回答

作者:linuxer 发布于:2015-3-23 19:03

一、前言

heziq网友在《linux kernel的中断子系统之(四):High level irq event handler》文档中提出了若干个问题,由于在回复中无法图形表达,因此单独出一份文档来回答,希望可以有所帮助。当然,由于他提出的问题和硬件电路设计有关,这里我只是表达我自己的观点(毕竟出身是软件工程师),如果有误,请不吝指出。

 

二、上拉和下来电阻的基本知识

下图描述了一个外设通过interrupt request line连接到CPU中断控制器的block diagram:

pu1

注意:本章通篇以上拉电阻为例,下拉的概念类似,因此就不再赘述了。

基本上,上拉(或者下拉)电阻总是需要的,只不过是看看位于何处,一般而言,有三种可能的位置:

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状态(输出高电平)的示意图:

pu

虽然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状态(输出低电平)的示意图:

pu2

理想情况下,三极管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的情况如下:

pu3

这时候,需要接下拉电阻。

4.如果gpio中断内部使用了上拉电阻,如果外部在使用上拉电阻,会出现什么副作用吗。我觉得有,两个上拉电源之间会互相影响。

如果两个上拉电阻都拉到同样的Vcc,那么其效果就是并联电阻电路而已,这时候,上拉电阻会变小(其阻值是(R1+R2)/(R1R2))。如果两个上拉电阻都拉到不同的Vcc,那么……回去翻一翻Kirchhoff电压和电流定律,我就不分析了。

5.如果gpio中断内部使用了下拉电阻,如果外部在使用下拉电阻,会使pin脚的输入电阻变低,有可能高电平信号拉不起来。

对于一个给定的电路(确定的外设芯片和确定的CPU中断控制器芯片),要使电路正常工作,其上拉或者下拉电阻必须处于一个合理的数值,不能太大,也不能太小。具体需要用我们第二章中的知识来分析

6.如果外设使用边沿触发。比如上升沿,那么它的高电平维持时间有要求吗,由高电平变低电平,是外设自己拉低的?还是interrupt controler控制?

如果外设可以检测某种硬件事件,并通过IRQ line上的上升沿通知给中断控制器的话,那么基本上高电平维持时间可以在芯片手册上查到,和中断控制器无关。当然,我们必须了解中断控制器在检测上升沿的规格,中断控制器一般都是采样来自外设的IRQ line上的电平,高电平当然要维持一定的时间,否则如果上升沿的脉冲卡在中断控制器的两次采样点中间的时候,该上升沿会被中断控制器miss掉。

标签: 上拉电阻 下拉电阻

评论:

温柔海洋
2016-07-06 15:16
gpio type 中断,如果是高电平,我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平,我觉得肯定要使用上拉电阻,将电平钳制在高电平。

上面这句话该怎样解释啊,我不太理解,为什么是高电平时,要用下拉电阻啊?
wowo
2016-07-07 15:16
@温柔海洋:不钳制到相反的电平,岂不是要一直触发中断吗?
所以平时需要钳制到相反的电平,当有事件发生的时候,才会有外设驱动起来,产生有效中断。
linuxer
2016-07-07 16:12
@温柔海洋:---------------
gpio type 中断,如果是高电平,我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平,我觉得肯定要使用上拉电阻,将电平钳制在高电平。
---------------
上面的这句话是heziq的表述,我同意他的描述,是因为我对这句话的解析是这样的:
++++++++++++
对于gpio type 的电平中断而言,如果是高电平有效(高电平触发中断),我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平有效(低电平触发中断),我觉得肯定要使用上拉电阻,将电平钳制在高电平。
++++++++++++
heziq
2015-04-18 11:09
我的新文章怎么还没通过审核呢?
linuxer
2015-04-18 15:09
@heziq:已经审核通过,周末的时候很少登录,都需要陪家庭,见谅。
heziq
2015-03-23 22:24
@linuxer:

   真是太专业了,太棒了。我还有几个疑问要请教你。
对于问题1:

这个双边沿deboucing是什么原理?我只知道软件deboucing。嘿嘿!给讲解一下呗!而且我觉得中断引脚不能配置成高阻态,否则容易误动作。抗干扰能力差。

问题3:
这个问题我没有描述清楚。我们不具体关心使用的是NPN还是PNP, 比如如果是上升沿触发,是不是requst line最好是无中断的时候拉成低电平。这样外设直接拉到高电平,产生上升沿。如果无中断的时候,request line 是高电平,那么外设先要拉低,在拉高,才能产生上升沿。同理下降沿。这是我要表达的意思。

问题4:
是不是最好只保留一个上拉或者下拉,尽量避免并联上拉或者下拉。

问题6:

比如上升沿,是不是外设将拉高,然后维持一段时间,在拉低。在没有中断的情况下,电压总维持在低电平。
下降沿类似。

问题3和6其实是一样的。
linuxer
2015-03-24 09:14
@heziq:这个双边沿deboucing是什么原理?我只知道软件deboucing。嘿嘿!给讲解一下呗!而且我觉得中断引脚不能配置成高阻态,否则容易误动作。抗干扰能力差。
-----------------------------------
键盘driver中的deboucing timer相信大家都比较熟悉,你可以思考一下,如果该按键的引脚是单边缘触发、双边缘触发以及电平触发时候的软件逻辑。


问题3:
这个问题我没有描述清楚。我们不具体关心使用的是NPN还是PNP, 比如如果是上升沿触发,是不是requst line最好是无中断的时候拉成低电平。这样外设直接拉到高电平,产生上升沿。如果无中断的时候,request line 是高电平,那么外设先要拉低,在拉高,才能产生上升沿。同理下降沿。这是我要表达的意思。
--------------------------------------
也不是说上升沿的触发方式外设就要首先保持在低电平,也可能是正常状态时候始终是高电平,但是当外设检测到事件后,拉出一个指定宽度低电平的脉冲。这种情况,中断控制器也是可以使用上升沿检测的。

问题4:
是不是最好只保留一个上拉或者下拉,尽量避免并联上拉或者下拉。
-------------------------------------
这个是和电路设计有关,当然,如果in-chip的上拉电阻如果满足电路设计的要求,那么当然就不需要外加那个并联的上拉电阻了。
tigger
2015-03-24 11:03
@linuxer:hi heziq
我的理解
边沿触发的设计机制,一般是由一个clock信号,然后每一个clock 信号都会去检测一下电平状态,如果这次clock信号检测到跟上一次clock信号检测到的两次电平信号不一致,就说明由一个边沿信号出来。所以边沿信号的触发方式,跟最开始默认高低电平没有必然的联系。就像linuxer说的,如果你默认是高电平,只要由一个指定宽度的低电平脉冲,等这个脉冲到了,又会跳到高电平,这样还是会检测到上升沿的。
heziq
2015-03-24 11:50
@tigger:嗯,是的,那就要看外设的要求了,如果要求使用上拉,就上拉。

发表评论:

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog