单片机学习小组
直播中

tulin

12年用户 1228经验值
私信 关注

基于mc3253加速度如何调试?

如何通过i2c配置寄存器?
基于mc3253加速度如何调试?

回帖(1)

董英灏

2022-2-8 16:07:16
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秒后去读取),后来发现一切都可以了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分