电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

HMC5883L驱动及调试的总结

2022-06-02 12:22分类:传感器 阅读:

 

  有关I2C

  由于手头上几个感应器,都须要使用I2C插口,因此 在以前就将I2C分系统备考并深入分析了一番。下列我所提及的或贴出来的部份编码或许不宜真真正正的板级推动,由于是以模块化设计方式做检测的。

  在这里模块化设计推动中,不但要申请注册推动(i2c_driver),与此同时也需要对机器设备信息内容完成申请注册(i2c_client),我觉得在这儿不区分前后左右次序(如同“先有鸡還是先有蛋”的难题一样没有意义)。在前面剖析i2c分系统的过程中提及过,针对在i2c电源适配器申请注册后再加上的新的设施不可以再用 i2c_register_board_info了,这会致使机器设备彻底不可以被激话,而必须用的是i2c_new_device才可以将机器设备动态性的申请注册到系统软件中

  在应用i2c_new_device情况下不仅仅必须设施的i2c_board_info建筑结构,还必须其所依附于的I2C电源适配器系统总线号。最先,有关系统总线号,能够根据i2cdetect指令开展查询:

  随后,在源代码中还可以那样应用:

  那样就获得了特定系统总线号的i2c_adapter表针,以后就可以借助这一表针给i2c_new_device用了。最终必须留意,在申请注册完机器设备信息内容后,要应用i2c_put_adapter(adap)将表针释放出来掉。

  用以叙述硬件信息的建筑结构能够作为i2c_client的独享数据信息储存,而这一建筑结构中通常也需要储存相匹配的client。这类相互之间的对应关系应当在probe接口函数中开展:

  推动未写,调节优先。假如在进行下手撰写推动前就能立即的利用专用工具的简易运用对元器件开展调节查询得话,会对推动的撰写有较大的协助。因此 这儿说起一下有关I2C在shell中的好多个调节指令i2cdetect, i2cdump, i2cget, i2cset。最先是i2cdetect,一般用于检测和列举系统总线(上面就演试了一下),一般操作方法是:列举系统总线-》检测合理机器设备

  查询实际效果以下:

  这儿就可以见到,机器设备从详细地址为0x68和0x1e的设施有真实合理的硬件配置联接,分别是HMC5883L和AD0接地装置(不连)的MPU6050。0x54 55 56 57为EEPROM,机器设备忙。

  次之是i2cdump,用于查询元器件內部存储器值,使用方法为i2cdump -y 系统总线号 机器设备详细地址

  随后是i2cget和i2cset,分别是对存储器开展获得和载入。使用方法为i2cget -y 系统总线号 机器设备详细地址 寄存器地址 方式和i2cset -y 系统总线号 机器设备详细地址 寄存器地址 标值 方式。方式默认设置 为b(byte)即载入8bit数据信息,i2cget可以用方式有b/w/c,i2cset可以用方式有b/w/c/i/s,在其中w为 word(16bit),i和s各自为I2C和SMBUS的block数据信息。

  Mutex互斥锁

  千万别忘掉复位mutex互斥锁。静态数据复位DEFINE_MUTEX(mutex_name),动态性复位mutex_init(struct mutex *lock)。忘掉复位就应用的情况下是会立即导致核心出错的。

  在终断前后文中不能应用mutex互斥锁,由于要是发生了竞态,mutex有可能进到睡眠质量,而终断前后文中是一定不允许睡眠质量的。因此 千万别应用,假如一定要在终断中应用锁体制来维护一些推动資源,提议应用spinlock自旋锁(semaphore信号量也不允许应用,一样的缘故)。

  关心死锁。哪一个实际操作必须开展锁一定要事前自主规划好,不要在某实际操作一进到的情况下锁,而进到他的儿子流程后又锁,那样就立即死锁了,系统软件freeze掉。

  有关终断

  终断的应用非常简单,可是却有很多需要注意的关键点点。

  GPIO终断。如一些单片机开发板上,外界拓展出去许多GPIO口,可是却找不着IRQ口,因此 就必须将GPIO拓展为中断开。在源代码中,应用gpio_to_irq(gpio_nr)涵数(linux/gpio.h)就可以获得全自动变换后的中断开号了,能够用于要求终断。

  若在request_irq的情况下最终给的主要参数不以NULL,那麼在free_irq的情况下,第二个主要参数也就务必与其说一致,不然会使系统软件找不着要释放出来哪一个终断的程序处理返回值(当然,为NULL就都为NULL,这一没有问题,只需一致就可以)。

  工作中序列

  工作中序列分work_struct 和delayed_work。差别便是delayed_work会在规定的延时后运行,而work_struct会直接被生产调度运作。

  复位。INIT_WORK(struct work_struct *work, void (*work_func)(struct work_struct *work))动态性复位work_struct。INIT_DELAYED_WORK(struct delayed_work *work, void (*work_func)(struct work_struct *work))动态性复位delayed_work,在delayed_work的work_func工作中涵数中,能够根据强制转换将*work变换为 struct delayed_work种类。

  生产调度。work_struct的生产调度为schedule_work(struct work_struct *work),而delayed_work则必须此外一个延迟时间主要参数schedule_delayed_work(struct delayed_work *work, unsigned long delay),这儿的delay主要参数便是延迟时间多长时间后付出工作中,企业是jiffies,经常使用类如msecs_to_jiffies(msecs)等变换涵数。

  假如未对工作中涵数特定序列,那麼其会自行进到system_wq中,在推动中也经常使用界定自身的工作中序列,可是简易工作中通常沒有必须如此做。

  针对经常汇报数据的工作中,最好是界定自身的工作中序列,将此工作中放进自身的工作中序列中运作,而不是放进系统软件默认设置的system_wq中,那样会防止在系统软件忙的过程中自身的工作中被迅速生产调度走,有自已的工作中序列在这些方面可以带来非常大的功效。

  compleTIon同歩

  由于在调节历程中试试看了自查,而又牵涉到终断,因此选用了compleTIon做为同歩体制,这儿明确提出简易使用方法。

  复位。init_compleTIon(struct compleTIon *wait)

  等候。wait_for_completion_timeout(struct completion *wait, unsigned long timeout),传参为剩下的时间,假如剩下的时间为0,换句话说明请求超时了。

  唤起。complete(struct completion *wait)

上一篇:【图】差动变压器式传感器的工作原理与使用实例

下一篇:Vishay发布用于汽车和工业应用的经AEC-Q101认证的高圆顶透射式光传感器

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部