一、 ADXL345簡介
ADXL345是ADI公司推出的三軸(x,y,z)iMEMS數字加速度計(digital accelerometer),具有在16G下高分辨率(13Bit)測量能力,同時具備16Bit數字輸出。ADXL345 適用於靜態傾角測量以及動態加速度測量,高達4mg/LSB的靈敏度允許測量小於1度的傾角。
該傳感器還具備單擊 /雙擊探測,自由落體探測,並允許用戶設置一個加速度閥值,當加速度值超過設定閥值后可以產生一個信號輸出。所有這些功能都可以映射到2個中斷上。內置的32級FIFO緩存可以極大的緩解處理器的壓力。
特點:
2.0 - 3.6VDC供電電壓
超低功耗: 40uA的測量模式, 0.1uA在standby@2.5V
單擊/雙擊檢測
自由落體檢測
用戶閥值設定
SPI和I2C接口
ADXL345以+2.5V的電源電壓工作時的消耗電流控制為標准25μ~130μA。該產品可比與3軸慣性傳感器節約80%的耗電量。主要面向手機、便攜式游戲機、游戲機控制器以及PND等。還支持硬盤的跌落檢測等。
可檢測的加速度范圍為±2/4/8/16G。集成了FIFO(First-in, First-out)型存儲器,最多可存儲32組3軸數據。耐沖擊性為1萬G。輸出接口備有I2C和SPI。數據輸出速度為0.1~3.2kHz。
電源電壓(Vs)為+2.0~3.6V,接口部分為+1.8V~Vs。工作溫度范圍為-40~+85℃。封裝采用14端子的LFCSP。
-
二、 SPI-4線模式操作ADXL345內部寄存器編程要點
1.ADXL345 SPI-4線模式的硬件連接電路


SPI-4線模式是adxl345默認的操作總線,無需配置即可用。,詳見datasheet page25 DATA_FORMAT寄存器。
2.關於ADXL345的PI總線協議與標准的SPI協議的一些差異(標准的SPI協議可以參考
http://baike.baidu.com/view/245026.htm?fr=ala0_1
這里不做詳細介紹)
標准的SPI總線時序中,每個字節之間的操作是斷開的,即片選線SS_n和串行時鍾線SCLK正在傳輸該字節時有效,其余時刻保持無效狀態(即SS_n=1,SCLK=1)如下圖:

ADXL345 datasheet中要求clock polarity (CPOL) = 1 and clock phase (CPHA) = 1,這可以在SOPC中選擇SPI IP核作為nios2外設構建系統時,用GUI的方式方便的設置,其SPI操作的時序如下圖:

從圖中可以看到:SPI總線對ADXL345內部寄存器的讀寫操作都是以字節為單位進行的(這是由ADXL345內部30個可操作寄存器均為字節寄存器所決定的),然而每兩個字節數據/地址之間CS_n和SCLK一直需要保持有效。
由以上分析,在采用Altera提供的nios2 SPI API函數alt_avalon_spi_command()訪問ADXL345時,其最后一個參數 alt_u32 flags必須置為ALT_AVALON_SPI_COMMAMD_MERGE,該標志的意思是“把多個SPI訪問命令/數據合並到一起”,若置為0,則是標准的SPI時序,每次訪問后自動釋放CS_n和SCLK。
3.讀取ADXL345內部寄存器的順序
先讀取地址0x00的DEVID,device ID寄存器,正確之后再進行其他寄存器的操作。只要該器件具有唯一的ID號,首先讀取器件ID寄存器並判斷正確就應該是必要和首要的。如果讀出ID正確了,至少可以證明我們操作時序正確了。O(∩_∩)O~,個人總結而已。當然,你如果看過linux下面外設的驅動程序,這樣的操作時非常常見的,也就算是一種默認的規范吧!
4.ADXL345的SPI協議的第一字節
Bit7
|
Bit6
|
Bit5
|
Bit4
|
Bit3
|
Bit2
|
Bit1
|
Bit0
|
R/W
|
MB
|
A5
|
A4
|
A3
|
A2
|
A1
|
A0
|
說明:bit7:1—讀,0—寫;
Bit6:1—多字節讀寫;0—單字節操作;
Bit5~bit0:ADXL345內部寄存器地址A5~A0;
-
三、I2C-2線模式操作ADXL345內部寄存器編程要點
1.ADXL345 I2C通信模式的硬件連接電路

這里需要注意:a. cs_n必須上拉至VDD以啟動I2C總線模式
b.SDA和SCL需上拉電阻,(2.2KΩ-400Kbitps,10KΩ—100kbitps)
c.SDA為雙向通信端口,故在FPGA的IO配置時,需將其配置為inout類型,在SOPC中SDA信號線需設置為bidirectional(tri-state)ports。
d.ALT_ADDRESS的接法對應的ADXL345的設備從地址不一樣,具體為:
若ALT_ADDRESS = 1,ADXL345_slave_addr=0x1D;
相應的I2C第一字節:read-——0x3B,write——0x3A
若ALT_ADDRESS = 0,ADXL345_slave_addr=0x53;
相應的I2C第一字節:read——0xA7,write——0xA6
2.I2C時序操作要點
對ADXL345的I2C總線訪問,只要嚴格按照NXP的i2c總線規范進行即可,可以采用nios2外掛I2C總線IP的方式實現,亦可以采用nios2 GPIO軟件模擬的方式實現。
這里總結一下,初學者使用I2C總線是容易犯的錯誤:


如上,在用I2C總線協議訪問ADXL345(其他所有的I2C器件也一樣),無論是讀操作還是寫操作,I2C總線的SDA信號線上送出的第一字節都必須是SLAVE ADDRESS + WRITE,這一點切記不能搞錯。我之前就是因為沒有注意這一點,而在讀ADXL345內部寄存器時,第一字節送成SLAVE ADDRESS + READ了,一直不出來數據,很是郁悶了半天。O(∩_∩)O~呵呵,最后改正確后,數據立馬就出現了!!!!
-
四、FPGA中嵌入式nios2軟核調試經驗小結
凡是牽涉到時序的外設(比如常見的i2c,spi,lin,can總線器件)調試,時序都是第一位的,順序不正確,命令送不起,數據配置不了,信息也讀不出來。一般在我們會借助示波器,邏輯分析儀來判斷硬件電路連接的通斷。
但是,邏輯分析儀價格昂貴,不易獲得。好在FPGA里面提供了嵌入式的邏輯分析儀——QuartusII中為signaltap II,ISE里面為chipscope。我們可以免費使用它們,設置好觸發條件,觀察FPGA板子上實時運行的信號狀態和順序,何樂而不為呢!
另外,我們也可以把手中的FPGA板子用作免費的邏輯分析儀來用!方法很簡單,就是用Quartus II做一個簡單的FPGA工程,引出一定數量的IO口,並用將所有的IO口信號配置為Signaltap II的輸入捕捉,並根據所要觀察的信號和順序設置好觸發條件,采樣時鍾以及采樣深度,保存並連同Quartus工程一起整體編譯下載sof文件運行即可。實時准確,配置靈活,百試不爽呀!