前段时间基于正点原子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时,得到结果如下:
/*****
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;
}
}
很抱歉,我需要问题才能为您提供解决方案。请提供具体的问题。