称重传感器hx711-liunx内核驱动。
若在用户空间驱动IO口,即使不加延时,脉冲的周期也很长,正电平时间远超传感器要求的50us,无法驱动传感器。
下图为HX711传感器的通信时序图。
故编写内核驱动,此处参考了韦东山嵌入式linux的视频。
内核驱动组成:
代码太长了我开源在github里,大家自己看。Github开源地址
设备树写法:
hx711 {
status = "okay";
compatible = "hx,hx711";
pd-sclk-gpio = <&gpio3 30 GPIO_ACTIVE_HIGH>;
pd-ldout-gpio = <&gpio3 28 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "gpio";
default-state = "off";
};
读取传感器数据的核心函数
int get_adc_data(void)
{
unsigned long Count;
unsigned char i;
gpio_set_value(pdata_g->pd_sck_gpio, 0);
Count = 0;
for (i=0; i<24; i++){
gpio_set_value(pdata_g->pd_sck_gpio, 1);
Count = Count << 1;
gpio_set_value(pdata_g->pd_sck_gpio, 0);
if(gpio_get_value(pdata_g->dout_gpio)) Count++;
}
gpio_set_value(pdata_g->pd_sck_gpio, 1);
Count = Count ^ 0x800000;
gpio_set_value(pdata_g->pd_sck_gpio, 0);
return(Count);
}
几个注意点:
- 设备树的写法
- 从设备树获取信息的函数:获取设备树节点和获取GPIO口的函数,我试了好多种才试对,有时候稍微差一点也不行,大家参照我代码里面的应该没问题。
- 该例程注册的是杂项设备:,在用户空间调用的时候要与注册的设备名称一致
- 调试时可多用内核打印函数printk打印信息,这样就能发现问题出在哪里。