找回密码
 注册
搜索
查看: 1565|回复: 14

[讨论] 关于GPIO的怪异问题

[复制链接]
发表于 2007-8-25 14:09:00 | 显示全部楼层 |阅读模式
我们的一个项目中,用到pxa270,对GPIO操作有些问题很怪异,就是把GPIO配置成普通IO口,再通过GPIO寄存器(GPSRx, GPCRx)拉高拉低GPIO电平,然后用GPLRx来读IO口的状态,可读出来的总是高电平,而通过示波器量出来却是正常的被拉高拉低了,这是怎么回事呀?有谁碰到过这种情况吗?软件操作可以说是没问题,CPU本身也不太可能出问题吧,有什么会影响到这呢?
路过的帮帮忙分析一下,谢谢
发表于 2007-8-27 10:25:05 | 显示全部楼层
如果这个gpio能设置输出或者是输入的话,当你把它设置成高或者低,那么你开始必须得设置它方向为输出吧,既然方向为输出,你还能通过cpu来读它的值?这是不允许的。
点评回复

使用道具 举报

 楼主| 发表于 2007-8-27 16:53:10 | 显示全部楼层
对于pxa270,把GPIO方向设置为输出,也是可以读出状态的,它的文档上写着是不管GPIO的方向如何,都是可以读到的
点评回复

使用道具 举报

发表于 2007-8-27 22:39:44 | 显示全部楼层
对于pxa270,把GPIO方向设置为输出,也是可以读出状态的,它的文档上写着是不管GPIO的方向如何,都是可以读到的-------------------------------但有说读出来的都应该是正确的吗?
点评回复

使用道具 举报

 楼主| 发表于 2007-8-28 10:37:59 | 显示全部楼层
我以前做别的项目时用的也是pxa270,对于GPIO的使用是没有问题的
点评回复

使用道具 举报

发表于 2007-9-29 15:26:02 | 显示全部楼层

。。。

<DIV class=quote><B>以下是引用<i>shawn_lee</i>在2007-8-27 22:39:44的发言:</B>
对于pxa270,把GPIO方向设置为输出,也是可以读出状态的,它的文档上写着是不管GPIO的方向如何,都是可以读到的-------------------------------但有说读出来的都应该是正确的吗?</DIV>
点评回复

使用道具 举报

发表于 2007-9-29 15:28:03 | 显示全部楼层
有意思了
要是说读出来的不正确的
那读它做什么?
点评回复

使用道具 举报

发表于 2007-10-4 10:32:38 | 显示全部楼层
每一个GPIO在物理上都有2个锁存器,一个为输入,一个为输出

设置为输出,就是IO内部MOS的控制栅极由Switch切到了输出锁存器的后端;设置为输入,就是把IO内部的检测Logical Gate由Switch切到了输入锁存器的前端。

由于物理上有2个锁存器,设置为输出后又读IO状态(其实是访问输入锁存器)在逻辑上并没有问题,但是实际中无意义,由于SWITCH已经SHIFT到了输出锁存器并断开输入锁存器,并且输入锁存器在不操作的时候是保持上一次的状态数据,于是读出的值(BIT状态)依然是里面的数据(注意是BUFFER里面上次保持的值而不是IO口当前真正的状态),与输出锁存器的设置数据没有关系。
点评回复

使用道具 举报

发表于 2007-10-19 12:58:30 | 显示全部楼层
2、8楼说的有道理。8楼谈的更加专业,拜读了,谢谢。
点评回复

使用道具 举报

发表于 2007-10-19 18:26:10 | 显示全部楼层
八楼说的好!
点评回复

使用道具 举报

发表于 2008-12-20 15:01:43 | 显示全部楼层
读这种专业的贴子真是享受,拜谢各位啦,52RD真的不错,聚集了一批高手
点评回复

使用道具 举报

发表于 2009-1-4 15:16:17 | 显示全部楼层
需要首先设置gpio方向为out,然后设置高电平(set)及低电平(clear)才有意义
点评回复

使用道具 举报

发表于 2009-1-4 17:51:18 | 显示全部楼层
以下是引用jamesbond在2007-10-4 10:32:38的发言:
每一个GPIO在物理上都有2个锁存器,一个为输入,一个为输出

设置为输出,就是IO内部MOS的控制栅极由Switch切到了输出锁存器的后端;设置为输入,就是把IO内部的检测Logical Gate由Switch切到了输入锁存器的前端。

由于物理上有2个锁存器,设置为输出后又读IO状态(其实是访问输入锁存器)在逻辑上并没有问题,但是实际中无意义,由于SWITCH已经SHIFT到了输出锁存器并断开输入锁存器,并且输入锁存器在不操作的时候是保持上一次的状态数据,于是读出的值(BIT状态)依然是里面的数据(注意是BUFFER里面上次保持的值而不是IO口当前真正的状态),与输出锁存器的设置数据没有关系。




你说了半天,其实没有讲对
一般CPU的引脚的确有两个寄存器,但是记住,这两个寄存器中的输入寄存器寄存的是实时的引脚状态,无论输出为高,还是为低,引脚的状态都会在你读取输入寄存器的时候立刻更新到寄存器中(寄存器有个clk,这个clk会在你读取寄存器时启动)
从简单的mcu到xscale我就没有遇到过你说的情况

所以lz的问题自己再仔细查查,是否程序有问题,寄存器是对的,GPLR就是存储引脚状态的
点评回复

使用道具 举报

发表于 2009-1-5 12:26:14 | 显示全部楼层
以下是引用zdbz在2009-1-4 17:51:18的发言:




你说了半天,其实没有讲对
一般CPU的引脚的确有两个寄存器,但是记住,这两个寄存器中的输入寄存器寄存的是实时的引脚状态,无论输出为高,还是为低,引脚的状态都会在你读取输入寄存器的时候立刻更新到寄存器中(寄存器有个clk,这个clk会在你读取寄存器时启动)
从简单的mcu到xscale我就没有遇到过你说的情况

所以lz的问题自己再仔细查查,是否程序有问题,寄存器是对的,GPLR就是存储引脚状态的


你自己去做下实验吧,很简单,先设置GPIO为输入,读一次,再设置GPIO为输出,再读一次,看是否不同。如果两次读出的值一样,就是我正确。


当设置为输出时候,读IO状态是读的输入锁存器,此时即使输出状态反转,输入锁存器是不会跟随改变的,这个是硬件特性。读引脚的概念是错误的,因为IO复用的情况很普遍,所以只有当设置正确的时候读出才是有效的。否则只能读到暂存的数据,这个数据可能和外围真正的端口电平不一致
点评回复

使用道具 举报

发表于 2009-1-5 20:22:21 | 显示全部楼层
以下是引用zdbz在2009-1-4 17:51:18的发言:




你说了半天,其实没有讲对
一般CPU的引脚的确有两个寄存器,但是记住,这两个寄存器中的输入寄存器寄存的是实时的引脚状态,无论输出为高,还是为低,引脚的状态都会在你读取输入寄存器的时候立刻更新到寄存器中(寄存器有个clk,这个clk会在你读取寄存器时启动)
从简单的mcu到xscale我就没有遇到过你说的情况

所以lz的问题自己再仔细查查,是否程序有问题,寄存器是对的,GPLR就是存储引脚状态的



感觉你的概念有点混淆,当GPIO从输出状态切换到输入状态的时候,引脚上的状态实际上是不一定保持在之前输出的状态,而是由上拉,下拉或者外部电路决定。

所以读到的状态和之前的输出状态无关。
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-10-6 09:25 , Processed in 0.048211 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表