关于imx6ull编写74HC165设备驱动读取数据异常的问题

前段时间基于正点原子IMX6ULL开发板上编写了74HC165的驱动代码,后面调试的时候发现74HC165的返回的数据是异常的,下面是调试的结果,希望有人能给我解答哪里出现了问题:
设备树驱动节点代码:

sensor: sensor {
        compatible = "sensor";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_sensor>;
        #address-cells = <1>;
        #size-cells = <0>;
        ds-gpio = <&gpio1 4 GPIO_ACTIVE_LOW>;
        sh-gpio = <&gpio1 18 GPIO_ACTIVE_LOW>;
        clk-gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
        status = "okay";
    };

pinctrl_sensor: sensorgrp {
            fsl,pins = <
                MX6UL_PAD_GPIO1_IO04__GPIO1_IO04        0x7001
                MX6UL_PAD_UART1_CTS_B__GPIO1_IO18        0x9011
                MX6UL_PAD_GPIO1_IO02__GPIO1_IO02        0x9011
            >;
        }; 

74HC165驱动核心代码:

unsigned int read_74165(void)
{    
    unsigned long val1 = 0;
    unsigned int count = 8;        
    unsigned int i;
    int input;
   
    //加载并行数据并锁存
    gpio_set_value(sensordev.sensor_SH, 0);
    mdelay(50);
    gpio_set_value(sensordev.sensor_SH, 1);
    mdelay(100);
 
    if (gpio_get_value(sensordev.sensor_DS) == 1) { //等于1即并行输入D7引脚
        val1 |= (1UL << 0); //最低位置1
    }
    
    printk("output DS = %d\n",gpio_get_value(sensordev.sensor_DS));
    
    for (i = 0; i < count - 1; i++) {
        mdelay(10);

        //等待10毫秒以确保锁存器引脚设置正确
        mdelay(10);
        gpio_set_value(sensordev.sensor_CLk, 0);
        mdelay(10);

        //等待10毫秒以确保锁存器引脚设置正确
        mdelay(10);

        gpio_set_value(sensordev.sensor_CLk, 1);
        

        //检查输入数据的有效性和合法性
        input = gpio_get_value(sensordev.sensor_DS);
        if (input != 0 && input != 1) {
            return -1; //或者返回其他错误代码
        }

        val1 = (val1 << 1) | input;

        
        printk("output DS = %d\n",input);
    }
    //等待10毫秒以确保锁存器引脚设置正确
    mdelay(10);
    gpio_set_value(sensordev.sensor_SH, 1);
    gpio_set_value(sensordev.sensor_CLk, 1);
    return val1;
}


驱动框架是没有问题的,74HC165的CE默认低电平
下面是有问题的调试结果:
当74HC165的并口A-H输入01111111时,得到结果如下:

img


当74HC165的并口A-H输入10111111时,得到结果如下:

img


而且只有74HC165的A口和B口有反应,C-H口无论怎么操作都没反应,每次的结果都不一样,希望有人能找出问题所在

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7511701
  • 除此之外, 这篇博客: 51单片机驱动8位数码管(74HC595驱动)滚动显示中的 2.显示函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    /*****
    
    Addr:起始位置
    Long:显示长度
    Dat:显示的数据
    *****/
    void Nixie_Display (uchar Addr,uchar Long,uchar Dat)
    {
    
    	uchar i;
    	//显示第1位
    	for(i=0;i<Long;i++)
    	{
    			
    			Write_Byte(LED_DIS[Dat]);
    			Write_Byte(1<<Addr+i);//显示第几位左移0位第1个显示,左移1位第2个显示,以此类推
    			RCK = 0;
    			RCK = 1;
    
    	}
    }
    
  • 以下回答来自chatgpt:

    很抱歉,我需要问题才能为您提供解决方案。请提供具体的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^