查看: 8968|回复: 9

[求助] 【IMX6Q】linux3.14 GPIO输入读取值始终为0

[复制链接]

该用户从未签到

1

主题

7

帖子

0

新手上路

Rank: 1

积分
31
最后登录
2019-9-22
发表于 2016-9-28 16:27:03 | 显示全部楼层 |阅读模式
本帖最后由 wanzilove 于 2016-9-29 16:35 编辑

项目中使用IMX6Q的ECSPI3和STM32的SPI1进行数据交互,IMX6Q做MASTER,STM32做SLAVE,使用了一个额外的IO用来做从数据发送通知。连接如下:
IMX6Q                                               测试点                 STM32F105
/ECSPI3_SCLK/GPIO4_IO21        ——> SPI_CLK1    ——> PA5(21脚)
/ECSP3_MOSI/GPIO4_IO22        ——> SPI_MOSI1  ——> PA7(23脚)
/ECSPI3_MISO/GPIO4_IO23        <—— SPI_MISO1  <—— PA6(22脚)
/ECSPI3_SS0/GPIO4_IO24        ——> SPI_CS1             ——> PA4(20脚)
/ECSP3_SS2/GPIO4_IO26        <—— SPI1_INT     <—— PC4(24脚)



现象:IMX6读取不到从数据通知io的状态
STM32配置PC4为IO输出,产生PWM信号,IMX6将GPIO4_26配置为输入,读取的电平状态始终为0







我知道答案 目前已有9人回答
回复

使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-9-28 16:32:35 | 显示全部楼层
    SPI配置正确吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2019-9-22
     楼主| 发表于 2016-9-28 16:47:51 | 显示全部楼层
    本帖最后由 wanzilove 于 2016-9-28 22:59 编辑

    测试点SPI1_INIT波形:


    file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\150050048\QQ\WinTemp\RichOle\YJLWC5U}V$(3HR_ZT0SZDOG.png

    QQ图片20160928225756.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2019-9-22
     楼主| 发表于 2016-9-28 16:51:58 | 显示全部楼层
    本帖最后由 wanzilove 于 2016-9-28 23:03 编辑

    imx6q-dts配置:
    /*------------------------------------------------------------------------
            gpio
    --------------------------------------------------------------------------
    &pin {
            pinctrl_ibox3: ibox3gpio {
                        fsl,pins = <
                                            MX6QDL_PAD_DISP0_DAT5__GPIO4_IO26                0x80000000
                                            ……
                        >;
                    };
    };

    /{
            gpio-ibox3 {
                    compatible = "gpio-ibox3";

                    pinctrl-names = "default";
                    pinctrl-0 = <&pinctrl_ibox3>;

                    spi1s-rdy = <&gpio4 26 0>;
                    ……
            };
    };

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2019-9-22
     楼主| 发表于 2016-9-28 23:07:20 | 显示全部楼层
    本帖最后由 wanzilove 于 2016-9-28 23:12 编辑

    驱动程序:

    <初始化函数>
          ……
         ibox3_gpio.spi1s_rdy = of_get_named_gpio_flags(ibox_gpio_node,"spi1s-rdy",0,&flag);
         if(gpio_is_valid(ibox3_gpio.spi1s_rdy))
        {
            if(!gpio_request(ibox3_gpio.spi1s_rdy,"spi1s-rdy"))
            {
                gpio_direction_input(ibox3_gpio.spi1s_rdy);
                printk("[I] spi1s_rdy \n");
            }
        }
    <ioctl函数>

        ……
        case SPI1S_RDY:
                val = gpio_get_value(ibox3_gpio.spi1s_rdy);
                printk("spi1s_rdy = %d\n",spi1s_rdy);
                break;
    应用程序执行后刷频输出:
    SPI1S_RDY = 0



    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2019-9-22
     楼主| 发表于 2016-9-28 23:16:45 | 显示全部楼层
    从上面的现象分析,可能是IMX6内部连线断路,于是我又反过来做了个试验,IMX6输出PWM,结果测试点有PWM信号。证明连线没有问题。上面的问题实在分析不出原因了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2019-9-22
     楼主| 发表于 2016-9-28 23:18:42 | 显示全部楼层

    IO输入问题跟SPI无关,先不考虑SPI
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-28 10:25
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    65

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    256
    最后登录
    2018-3-22
    发表于 2016-9-29 17:05:25 | 显示全部楼层
    本帖最后由 魏科 于 2016-9-29 17:10 编辑

    你好,
    这个你要做一个基本的通信试验,具体做法是:
    在IMX6Q端:
    1.检查GPIO4_26没有被其他模块复用,如果被复用肯定不行,
    2.先在内核中不要对GPIO4_26做GPIO相关的编程,让它自由,我们在下一步会用它.
    3.进入IMX6Q的后台shell,用串口终端或者adb shell都可以
    4.计算GPIO4_26的GPIOLIB编号,算法如下:
    GPIO1的编号范围是:0~31
    GPIO2的编号范围是: 32~63
    GPIO3的编号范围是: 64~95
    GPIO4的编号范围是:96~127
    那么GPIO4_26的编号就是:96+26=122 (我算术不怎么好,你自己算一次)
    5.将GPIO4_26配置为GPIO,输入,这个是GPIOLIB的只是,做法如下(在shell交互行进行)
    5.1 导出GPIO4_26
    $ echo  122 > /sys/class/gpio/export   (注意空格不能省略)
    如果成功会出现以下文件:
    /sys/class/gpio/gpio122
    如果现实设备忙,那么是其他模块复用了或者在内核你已经用成GPIO了,所以先保证它是自由的
    5.2  将GPIO4_26配置为输入
    $ echo in > /sys/class/gpio/gpio122/direction
    这个时候,你就可以在shell读入这个Pin脚的高低电平了,
    那么接下来,就是在STM32端,用简单的代码,把这个对应的STM32端Pin拉高,或者拉低
    假如我们在STM32端用小程序将这个Pin拉高,那么在IMX6Q端的shell可以读取这个值,做法是:
    #cat  /sys/class/gpio/gpio122/value
    返回1表示高电平,返回0表示低电平,看看和你的意识是不是相同
    通过上述基本实验,可以让你很轻松解决这个问题。如果上述基础实验,成功,你自己的集成实验不成功,那么应该是你代码问题,
    如果上述基础实验,不成功,那么检查dts,和其他模块隐藏的复用,占用了这个GPIO4_26
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2019-9-22
     楼主| 发表于 2016-9-29 20:03:58 | 显示全部楼层
    魏科 发表于 2016-9-29 17:05
    你好,
    这个你要做一个基本的通信试验,具体做法是:
    在IMX6Q端:

    用gpiolib测出来是对的


    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    67108864
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    0
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    0
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    0
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    0
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    0
    /sys/devices/soc0/soc.0/2000000.aips-bus/20a8000.gpio/gpio/gpio122 # cat value
    0
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-9-30 09:28:31 | 显示全部楼层
    在linux下做的测试?              
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 20:35 , Processed in 0.108251 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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