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秒後去讀取),後來發現一切都可以了。