完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.调试的芯片是mc3253
2.通过i2c配置寄存器 3.调试过程 (1)初始化i2c,i2c的读写速率 (2)i2c的读写函数,读写函数基本相同,设备从地址不同 (3)从设备的地址。 (4)先读取芯片的id,看i2c是否能通讯,从设备的地址是否正常,芯片的焊接是否有问题。 (5)开始调试值,这个寄存器的值,一般会有,主要调试阈值,采样的频率,工作模式,中断等。 8.24------------------------------------------------------------------------------------------------------------- 附一张初始化的图片: 现在调试的过程就是,用的在nordic上的已经调试好的加速度的代码,移植到emf32这个单片机平台上。然后设置寄存器,当发生敲击事件触发中断。 敲击加速度传感器,发现未发生中断。 问题分析: 基本情况是:muc + acc,通过i2c进行通信。 一开始测试通信是否可行,发现通过i2c可以发送数据,读取数据。i2c ok, 再读取xyz的数值,发现没有数据。 开始觉得是芯片坏了,或者寄存器的值没有设置对。然后开始扒芯片手册,一个一个对寄存器。 1.首先是芯片的寄存器,为了兼容别的芯片,这个寄存器的值是一定需要的。 mc3256_read_byte2(0x32, ®);,//寄存器0x32,读取的值放入reg中 2,.然后是设置芯片的模式设置,要修改寄存器的值,芯片的状态一定要是standby,否则修改不成功。 reg=(0x43); mc3256_write_byte2(0x07, reg); 注意:如果要芯片工作且能触发中断,则模式要修改为wake reg=0x41; //该值将中断脚拉高 //reg=0xC1; //该值可以将中断脚拉低 mc3256_write_byte2(0x07, reg); 注:通过i2c修改这两个寄存器的值,来确定中断脚是否有焊接问题,如果中断脚能被拉高拉低,则确定焊接无关,最后测试该脚一直是低状态。 3.修改要触发的中断种类,这个寄存器表示,设置为什么中断,当达到条件时就会触发,相当于使能某个种类的中断,比如敲击中断,摇晃中断,跌落中断等。 reg=0x04;//(reg|0x10); // use tap int type mc3256_write_byte2(0x06, reg); 4.设置xyz探测的使能,此处表示xyz轴有变化的检测 //tap dected on x y and z-axis reg=0xE0; mc3256_write_byte2(0x09, reg);// 5.阈值的设置,对中断产生的一个阈值,一般通过调节这个值来 //set tap threshold reg=0x11;///0-ff mc3256_write_byte2(0x32, reg);// 6.然后读取一次中断标志寄存器,清一下中断。 //mdelay(100); mc3256_read_byte2(0x03, ®);// read 0x03 once ,avoiding register value is not 0x0 7.再最后将芯片的工作模式由standby修改为wakeup //wake mode reg=0x41; //reg=0xC1; mc3256_write_byte2(0x07, reg); 8.对完这些寄存器后,发现有个寄存器设置的不对,就是检测这个xyz的,修改完之后,读取xyz轴的坐标,发现果然可以读取到值,然后在翻转芯片等,发现数值都是正确的,满心以为调试ok reg=0x02; -》修改为0x03 mc3256_write_byte2(0x20, reg);//8bit 2g 发现敲击还是没有中断,整个人都不好了。 开始将mcu和加速度芯片连接的中断脚分开,分别测量装填,mcu中断脚高电平,加速度中断脚低电平,(此处测量的是引到mcu的线路上,并不是直接连接acc芯片的引脚) 通过i2c发送数据,将中断脚拉低,发现问题,中断脚未焊好。这里就是往上述的0x07里面写入不同的值。 从新焊接后,敲击,发生中断事件,muc这边中断设置为下降沿触发。每次触发后,清除中断。 一切都写好之后,发现只有在初始化的时候,才会触动中断,接着又不行了,发现acc的中断标志位已经被清除了,但是事实上就是中断未清除,后来打印这个中断状态寄存器的值(0x03)发现中断时是被清楚的,但是就是不触发中断,后来将读取中断寄存器的值读取时间太快了(每次触发中断之后都去读取这个中断标志,这个时间太短,后来改为定时器3秒后去读取),后来发现一切都可以了。 |
|
|
|
只有小组成员才能发言,加入小组>>
3274 浏览 9 评论
2950 浏览 16 评论
3453 浏览 1 评论
8982 浏览 16 评论
4043 浏览 18 评论
1092浏览 3评论
564浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
561浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2297浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1854浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-18 19:25 , Processed in 1.143047 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号