讓我們解構複雜的 ADXL345 三軸加速規吧!(第五彈)

讀取 Device ID 以驗證 SPI 讀取函數

本篇會教大家讀取 Device ID,這是對 ADXL345 的操作中最簡單的一個。

我們需要踩個煞車

為了和 ADXL345 通訊,前面已經介紹過 3 個用 GPIO 自幹的 function,還剩下 1 個沒講。但目前為止,尚未對已做完的部分有任何驗證,我們不清楚已經寫過的東西到底有沒有用?是不是真的能和 ADXL345 溝通?

你跟我一樣,覺得心裡不踏實嗎?

一口氣到底=「差之毫釐,失之千里」

如果有潛藏的 bug,卻沒發現,一廂情願的不斷寫下去,風險會很高!對不熟悉的軟體開發,我習慣先完成能夠驗證的最小部分,或是說有功能的最小部分(Minimum Viable Product),驗證成功才往下寫。

若以我過去的經驗來舉例:

  • 拿到新的 MCU 或開發版,先確定能讓 LED 閃爍。
  • 剛接觸 Linux,先看能不能 echo 或 print 出字串?
  • 開發 PID 控制系統,先確定數學最簡單的P控制可以正常反應。
  • 做一個軟體示波器,先確定能畫出 random 或 sin(t)?若可以才連接ADC。
  • 剛認識一個妹,先看能不能聊三觀(工作、愛情、價值)?可以聊才約。

那與 ADXL345 通訊呢?先能讀到正確的 Device ID 囉!確定這一步 OK ,再去想其他的。否則妹子都「已讀不回」或「不讀不回」了,你還會煩惱約出來要穿什麼嗎?


根據 Register Map(上圖),在位置 0x00 應該可以讀到 0xE5(1110,0101) 這個值。以下是我用來測試的程式。

上圖這個程式,先對 System clock、UART、sensor power 做一些必要的初始化以後,就開始用無窮迴圈讀取 Device ID。

前面說過,這個用 GPIO 自幹出來的 ADXL345 SPI function 是跨平台通用的(不是無痛移植,你需要小小修改對應自己平台的 NOP 和 PIN define),所以其他的初始化步驟照抄沒用,除非你跟我用一樣的 MCU。

因此,這個程式重點就只有第30行而已,在位址 0x00 讀出資料、做點格式設定,然後丟到 UART上。UART 讀出的畫面如下:

如果在位置 0x00 能夠讀出 0xE5 ,那就表示我們目前已經實作的 unsigned char ADXL345_SPI_Read(unsigned char Address) 沒問題,可以繼續往下做;如果無法讀出正確數值,那就表示前面一定有出錯。

  • 檢查 ADXL345 電源是否正確接上?

假如一再檢查,還是無法解決這一步的錯誤,那你需要找一台示波器來做更仔細的檢驗:

  • 檢查動作時期 CS 是否正確被拉到 Low?
  • 檢查 MCU 送出的 SCL 是否符合 datasheet 上的各項規範?

下一篇會講解如何讀取整個 Register map,並談談 Register map 中的神祕失落區塊。