hujj 发表于 2020-10-16 18:51

【CH579M-R1】+驱动LSM303DLH磁场传感器

本帖最后由 hujj 于 2020-10-16 18:57 编辑

<p><span style="font-size:12.0pt"><span style="font-family:宋体">&nbsp; &nbsp; 我自制的智能小车需要使用电子罗盘来定向,于是网购了一块LSM303DLH磁场传感器模块,试图用CH579M-R1开发板来驱动测试。模块的正面照片如下:</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:12.0pt"><span style="font-family:宋体">这是模块的反面:</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span style="font-size:12.0pt"><span style="font-family:宋体">&nbsp;这是三轴磁场+三轴加速度传感器模块,通过I2C协议与主设备通讯。模块上有8个焊盘,其中4个分别是GND、SDA、SCL和Vcc引脚,另外4个是运动传感器中断及控制引脚。我目前只使用了I2C通讯及电源引脚。</span></span></span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif">&nbsp;&nbsp;&nbsp; <span style="font-size:12.0pt"><span style="font-family:宋体">商家提供的资料极其有限,其中范例代码因缺少相关库文件而无法通过编译,网上搜索也很少有完整的代码,因此只有在商家提供的范例基础上自己慢慢测试,为此花费了一周多的时间,也踩了许多坑,几次都准备放弃了,但又似乎看到一线希望。经过发帖求助,在大家的热心帮助下,最后终于驱动成功,下面就是我的调试过程。</span></span></span></span></p>

<p>&nbsp;&nbsp;&nbsp; <span style="font-size:12.0pt"><span style="font-family:宋体">首先是I2C通讯,在我的测试环境中已经存在DS1307日历模块,这也是用I2C进行通讯的,我就在此基础上驱动LSM303DLH,可按照范例中对模块读写的代码,读出相关寄存器的却是固定的数值,无论如何转动模块均不变化(见下图)。</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span style="font-size:12.0pt"><span style="font-family:宋体">弄了几天都没有头绪,只好发帖求助,在<span lang="EN-US" style="background:#f7f9ff">littleshrimp</span><span style="background:#f7f9ff">版主的提示下,试着对比初始化前后寄存器的数值以及对空地址进行读操作,发现读取寄存器的数值全部是2,空地址返回的也是2,显然I2C通讯有问题。</span></span></span></span></span></p>

<p>&nbsp;&nbsp;&nbsp; <span style="font-size:12.0pt"><span style="background:#f7f9ff"><span style="font-family:宋体">为此,我仔细查看到数据手册中对I2C通讯的时序要求,然后通过逻辑分析仪抓取的时序进行逐步调整。下图为手绘的相关时序要求:</span></span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span style="font-size:12.0pt"><span style="font-family:宋体">经过反复调整代码,从逻辑分析仪抓取的时序图上到,已经比较接近标准值了,(见下图):</span></span></span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:12.0pt"><span style="font-family:宋体">尽管如此,但模块并未响应I2C通讯,返回的数值全是零:</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:12.0pt"><span style="font-family:宋体">分析抓取的时序图也可以看出模块没有任何应答(见下图):</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:12.0pt"><span style="font-family:宋体">因为在我的测试环境中,I2C通讯是与LCD显示屏的DIN和CLK共用的,在驱动DS1307日历模块时没有出现过问题,能够各自正常驱动,所以测试LSM303DLH模块时也延用此方案。但测试了几天都不成功,我不得不考虑用单独的引脚来专门供I2C通讯用,为此还更换了多个引脚分别测试,结果均一样不成功。就在准备放弃测试,考虑另外再去购买模块时,忽然显示屏了出现了数据(见下图),我欣喜若狂。</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span style="font-size:12.0pt"><span style="font-family:宋体">就在准备进一步测试时,屏幕又全是零了,仍旧读不出数据。我反复测试,又折腾了两天,其间有时用手按压模块,偶尔也可读出数据,我猜想可能是杜邦线连接不好造成的,于是换上新的杜邦线,并用万用表检测,然而并不如愿,模块依旧是不能正常运行。我无计可施,又准备放弃时,w494143467版主建议我试试用电吹风加热一下模块,我将信将疑地照办,奇迹出现了,屏幕有数据显示了,证明I2C通讯正常了。就这样,遇到读不出数据时我就先呵几口气加热模块,不行再用电吹风。不知道厂家是否知道芯片的这个问题,按说我所处地区现在的气温不低,室内温度在20度以上,不应该会造成芯片工作不正常。</span></span></span></span></p>

<p><span lang="EN-US" style="font-size:12.0pt"><span style="font-family:宋体">&nbsp;&nbsp;&nbsp; I2C</span></span><span style="font-size:12.0pt"><span style="font-family:宋体">通讯正常后,紧接着是如何配置寄存器,商家提供的范例中仅配置了三个寄存器,按照这个配置,运动传感器的数据未读出来。要配置好寄存器,首先必须对芯片中寄存器有比较详细的了解,为此我将芯片寄存器的部分资料翻译成中文,整理到EXCEL表格中展示出来,下图为部分数据:</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span lang="EN-US" style="font-size:12.0pt"><span style="font-family:宋体">LSM303DLH</span></span><span style="font-size:12.0pt"><span style="font-family:宋体">芯片使用了两个I2C地址,其中磁场传感器I2C地址为0x3C,运动传感器I2C地址为0x30,它们的寄存器地址并未重叠,但为何要占用两个I2C地址就不得而知了。</span></span></span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif">&nbsp;&nbsp;&nbsp; <span style="font-size:12.0pt"><span style="font-family:宋体">从上图中可以看到磁场传感器共使用有13个寄存器,地址分别为00H~0CH,其中可设置的寄存器只有前3个,其它都是只读的。按照范例中的代码,我只对00H和02H两个寄存器进行了设置。</span></span></span></span></p>

<p>&nbsp;&nbsp;&nbsp; <span style="font-size:12.0pt"><span style="font-family:宋体">数据手册中运动传感器使用的寄存器共有22个,参见下图:</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:12.0pt"><span style="font-family:宋体">因为我没有启用中断功能,所以也只设置了其中的三个,范例中仅对地址为20H的模式寄存器进行了设置,但设置的数据为0x27,即数据速率为50Hz,我修改成0x2F(数据速率100Hz)后才读到运动传感器三轴数据。我增加设置了对数据的滤波功能和自我测试功能,自此,模块的配置基本完成。</span></span></p>

<p></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span style="font-size:12.0pt"><span style="font-family:宋体">模块基本正常工作之后,读取的数据波动非常大,此时还需要进行校准,这项工作很顺利,我只是将整个测试装置放在鼠标垫上改变了几次角度,数据就正常了,应该是校准完成了。由于天色已晚,拍摄效果差,明天再补上最后测试的动画。</span></span></span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size:12.0pt"><span style="font-family:宋体">下面是我整理的资料EXCEL压缩文件</span></span></span></span><span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span style="font-size:12.0pt"><span style="font-family:宋体">和项目压缩文件:</span></span></span></span></p>

<p style="text-align:justify"></p>

<p style="text-align:justify"></p>

<p style="text-align:justify">&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

hujj 发表于 2020-10-18 08:46

<p>&nbsp; &nbsp; 这是补拍的测试照片:</p>

<p></p>

<p>&nbsp; &nbsp; 这是磁场及运动传感器三轴数据:</p>

<p></p>

<p>&nbsp; &nbsp; 这是拍摄的动画:</p>

<p></p>

okhxyyo 发表于 2020-10-19 10:42

<p><a href="https://bbs.eeworld.com.cn/thread-1140005-1-1.html" target="_blank">沁恒CH579M-R1开发板测评</a></p>

<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1140005-1-1.html">https://bbs.eeworld.com.cn/thread-1140005-1-1.html</a></p>
页: [1]
查看完整版本: 【CH579M-R1】+驱动LSM303DLH磁场传感器