关于HMC5883L驱动书写及调试的总结

刚刚结束对传感器HMC5883L的驱动书写及调试工作,虽然之前对相关的各种知识点都有接触,但是在真正从头书写驱动的时候还是遇到了很多不大不小的麻烦,在这里自行总结一下,也是作为以后驱动书写的一个经验教训,更是对以往所学内核驱动相关知识的复习和总结。事实证明,看了多少书,也不如亲自动手实践学的快,记得牢。

关于I2C

因为手头有几个传感器,都需要用到I2C接口,所以在之前就将I2C子系统复习并深入研究了一番。以下我所提到的或贴出的部分代码也许不适合真正的板级驱动,因为是以模块化形式做测试的。
  • 在此模块化驱动中,不仅要注册驱动(i2c_driver),同时也要对设备信息进行注册(i2c_client),我认为在这里不分前后顺序(就像“先有鸡还是先有蛋”的问题一样没有意义)。在前边分析i2c子系统的时候提到过,对于在i2c适配器注册后再添加的新的设备不能再用i2c_register_board_info了,这会导致设备完全不能被激活,而需要用的是i2c_new_device才能将设备动态的注册到系统中
  • 在使用i2c_new_device时候不仅需要设备的i2c_board_info结构体,还需要其所依附的I2C适配器总线号。首先,关于总线号,可以通过i2cdetect命令进行查看:
  root@arm:/home/debian# i2cdetect -l
  i2c-0    i2c           OMAP I2C adapter                    I2C adapter
  i2c-1    i2c           OMAP I2C adapter                    I2C adapter
然后,在代码中可以这样使用:
  struct i2c_adapter *adap;
  int adap_nr = 1; // 总线号为1


  adap = i2c_get_adapter(adap_nr);

这样就获取了指定总线号的i2c_adapter指针,之后就可以利用这个指针给i2c_new_device用了。最后需要注意,在注册完设备信息后,要使用i2c_put_adapter(adap)将指针释放掉。
<
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
//*************************************************** void Single_Write_HMC5883(uchar REG_Address,uchar REG_data) { HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf HMC5883_SendByte(REG_data); //内部寄存器数据,请参考中文pdf HMC5883_Stop(); //发送停止信号 } //********单字节读取内部寄存器************************* uchar Single_Read_HMC5883(uchar REG_Address) { uchar REG_data; HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始 HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=HMC5883_RecvByte(); //读出寄存器数据 HMC5883_SendACK(1); HMC5883_Stop(); //停止信号 return REG_data; } //****************************************************** // //连续读出HMC5883内部角度数据,地址范围0x3~0x5 // //****************************************************** void Multiple_read_HMC5883(void) { uchar i; HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(0x03); //发送存储单元地址,从0x3开始 HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号 for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = HMC5883_RecvByte(); //BUF[0]存储数据 if (i == 5) { HMC5883_SendACK(1); //最后一个数据需要回NOACK } else { HMC5883_SendACK(0); //回应ACK } } HMC5883_Stop(); //停止信号 Delay5ms(); } //初始化HMC5883,根据需要请参考pdf进行修改**** void Init_HMC5883() { Single_Write_HMC5883(0x02,0x00); // }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值