戰(zhàn)指南:從硬件連接到數(shù)據(jù)融合與低功耗優(yōu)化)
1. 從選型到上手為什么是ICM-20608在嵌入式開發(fā)特別是涉及運(yùn)動感知、姿態(tài)追蹤的項(xiàng)目里MPU6050幾乎是每個(gè)工程師入門時(shí)都會接觸到的“老朋友”。它集成了三軸加速度計(jì)和三軸陀螺儀通過I2C或SPI接口通信資料多例程遍地都是。但當(dāng)你需要更低的功耗、更高的精度或者項(xiàng)目對成本極其敏感時(shí)MPU6050可能就不再是最優(yōu)解了。這時(shí)它的同門師弟——TDK InvenSense的ICM-20608就進(jìn)入了我們的視野。ICM-20608同樣是一款6軸運(yùn)動處理傳感器包含三軸MEMS陀螺儀和三軸MEMS加速度計(jì)。從功能上看它和MPU6050非常相似但它在幾個(gè)關(guān)鍵點(diǎn)上做了優(yōu)化。首先它的功耗更低這對于電池供電的物聯(lián)網(wǎng)設(shè)備或可穿戴設(shè)備來說是致命的吸引力。其次它的陀螺儀量程和加速度計(jì)量程可配置范圍更廣適應(yīng)性更強(qiáng)。最重要的是在一些采購渠道ICM-20608的單價(jià)可能更具優(yōu)勢。然而與MPU6050鋪天蓋地的中文教程和成熟庫相比ICM-20608的資料相對零散很多細(xì)節(jié)需要從數(shù)據(jù)手冊里一點(diǎn)點(diǎn)摳出來。這篇筆記就是我最近在一個(gè)低功耗手環(huán)項(xiàng)目上從零開始折騰ICM-20608的完整記錄希望能幫你繞過我踩過的那些坑。2. 硬件連接與接口抉擇I2C還是SPI拿到一顆ICM-20608第一件事就是把它接到你的主控板上。芯片通常采用QFN封裝體積小巧。其引腳定義中最關(guān)鍵的是用于通信的接口選擇引腳。ICM-20608同時(shí)支持I2C和SPI兩種通信協(xié)議具體使用哪種由一個(gè)叫做AD0/CS的引腳不同封裝名稱可能略有差異例如在LGA封裝上是CS引腳的電平?jīng)Q定。2.1 接口模式硬件配置這個(gè)引腳的狀態(tài)決定了芯片的“身份”和通信方式當(dāng)CS引腳接高電平VDDIO時(shí)芯片進(jìn)入I2C通信模式。此時(shí)芯片的I2C從機(jī)地址由另一個(gè)引腳AD0或?qū)?yīng)功能的引腳決定。AD0接低電平GND時(shí)7位I2C地址為0x68AD0接高電平VDDIO時(shí)地址為0x69。這允許你在同一條I2C總線上掛載最多兩個(gè)ICM-20608。當(dāng)CS引腳接低電平GND時(shí)芯片進(jìn)入SPI通信模式。此時(shí)SDA引腳變?yōu)镾DI主機(jī)輸出從機(jī)輸入SCL引腳變?yōu)镾CK串行時(shí)鐘AD0引腳變?yōu)镾DO主機(jī)輸入從機(jī)輸出。CS引腳本身則作為片選信號由主機(jī)控制。注意VDDIO是芯片的接口供電引腳必須與主控MCU的IO電平一致通常是3.3V。而VDD是芯片內(nèi)核供電范圍更寬如2.4V-3.6V。務(wù)必確保電平匹配否則無法通信甚至損壞芯片。2.2 I2C與SPI的實(shí)戰(zhàn)選型思考在項(xiàng)目中具體選I2C還是SPI不是拍腦袋決定的需要權(quán)衡以下幾點(diǎn)通信速率需求這是最核心的區(qū)別。標(biāo)準(zhǔn)模式I2C速率為100kHz快速模式為400kHz高速模式也就1MHz或3.4MHz。而SPI的時(shí)鐘頻率可以輕松達(dá)到10MHz甚至更高。如果你需要以很高的頻率例如1kHz以上讀取傳感器數(shù)據(jù)做實(shí)時(shí)姿態(tài)解算SPI是唯一的選擇。I2C在高速連續(xù)讀取時(shí)協(xié)議開銷起始、停止、地址、應(yīng)答位會成為瓶頸。引腳資源I2C只需要兩根線SDA SCL可以掛載多個(gè)設(shè)備節(jié)省MCU引腳。SPI需要四根線SCK MOSI MISO CS如果掛載多個(gè)設(shè)備每個(gè)設(shè)備還需要獨(dú)立的CS片選線更占資源。如果你的MCU引腳緊張I2C是更優(yōu)解。軟件復(fù)雜度與可靠性I2C協(xié)議有應(yīng)答機(jī)制理論上更可靠但協(xié)議狀態(tài)機(jī)稍復(fù)雜特別是主控MCU的I2C外設(shè)如果不好用調(diào)試起來很頭疼。SPI協(xié)議簡單粗暴就是時(shí)鐘沿移位數(shù)據(jù)實(shí)現(xiàn)起來更直觀很多MCU的SPI外設(shè)也更穩(wěn)定。布線長度與抗干擾I2C是開漏輸出需要上拉電阻通信距離短抗干擾能力相對較弱。SPI是全雙工推挽輸出在板內(nèi)通信更穩(wěn)定適合速率高、布線稍復(fù)雜的場景。在我的手環(huán)項(xiàng)目中因?yàn)閷臉O其敏感且數(shù)據(jù)采樣率要求不高約200Hz我最終選擇了I2C接口。理由很簡單第一I2C在通信間歇期總線可以保持高阻態(tài)整體功耗比持續(xù)有時(shí)鐘活動的SPI更低第二我的手環(huán)主控MCU引腳非常緊張I2C能節(jié)省兩根引腳用于其他功能。3. 寄存器配置詳解讓傳感器按你的想法工作無論是I2C還是SPI與ICM-20608的交互本質(zhì)都是讀寫其內(nèi)部的寄存器。數(shù)據(jù)手冊中有一張完整的寄存器映射表是我們操作的“地圖”。下面挑幾個(gè)最核心的寄存器來拆解。3.1 電源管理寄存器喚醒與時(shí)鐘源傳感器上電后默認(rèn)處于睡眠模式必須首先將其喚醒。這是通過PWR_MGMT_1寄存器地址0x6B實(shí)現(xiàn)的。位7DEVICE_RESET寫1觸發(fā)芯片軟復(fù)位所有寄存器恢復(fù)默認(rèn)值。這是一個(gè)很好的初始化習(xí)慣確保從一個(gè)已知的狀態(tài)開始。位6SLEEP寫0使芯片退出睡眠模式進(jìn)入正常工作狀態(tài)。踩坑點(diǎn)僅僅退出睡眠還不夠如果陀螺儀或加速度計(jì)單獨(dú)被關(guān)閉它們?nèi)匀徊粫ぷ?。?:0CLKSEL選擇內(nèi)部時(shí)鐘源。強(qiáng)烈建議設(shè)置為001使用PLL鎖相環(huán)作為時(shí)鐘源這是最穩(wěn)定、性能最好的選擇。如果使用內(nèi)部振蕩器精度會差很多。所以初始化的第一步代碼通常是// 1. 軟復(fù)位可選但推薦 i2c_write_byte(ICM20608_ADDR, 0x6B, 0x80); delay_ms(100); // 等待復(fù)位完成 // 2. 喚醒并選擇PLL時(shí)鐘源 i2c_write_byte(ICM20608_ADDR, 0x6B, 0x01);3.2 配置量程與帶寬接下來需要根據(jù)你的應(yīng)用場景配置加速度計(jì)和陀螺儀的量程和濾波器帶寬。加速度計(jì)量程由ACCEL_CONFIG寄存器0x1C的ACCEL_FS_SEL位控制。常見選項(xiàng)有±2g ±4g ±8g ±16g。量程越小靈敏度越高LSB/g值越大分辨率越好但容易飽和。例如手環(huán)監(jiān)測日?;顒印?g足夠如果是無人機(jī)可能就需要±16g。我的項(xiàng)目設(shè)為±4g。陀螺儀量程由GYRO_CONFIG寄存器0x1B的FS_SEL位控制。常見選項(xiàng)有±250°/s ±500°/s ±1000°/s ±2000°/s。同樣量程越小角速度分辨率越高。對于手勢識別或緩慢轉(zhuǎn)動±250°/s很合適對于快速旋轉(zhuǎn)的模型則需要更大的量程。數(shù)字低通濾波器這是非常關(guān)鍵但容易被忽略的配置。傳感器內(nèi)部的MEMS單元輸出的是高頻模擬信號經(jīng)過ADC轉(zhuǎn)換后會有一個(gè)數(shù)字低通濾波器DLPF。通過配置GYRO_CONFIG和ACCEL_CONFIG 2等寄存器中的DLPF_CFG位可以設(shè)置濾波器的截止頻率。它的核心作用是抗混疊和降噪。如果不啟用DLPF或帶寬設(shè)得過高ADC采樣帶來的高頻噪聲會混疊到有效信號帶寬內(nèi)導(dǎo)致數(shù)據(jù)“毛刺”非常多。一般來說應(yīng)將DLPF帶寬設(shè)置為略高于你關(guān)心的信號最高頻率。比如我需要200Hz的數(shù)據(jù)我會將DLPF帶寬設(shè)置為250Hz左右。3.3 數(shù)據(jù)讀取流程配置完成后就可以讀取數(shù)據(jù)了。加速度計(jì)和陀螺儀的原始數(shù)據(jù)分別存儲在ACCEL_XOUT_H、ACCEL_XOUT_L等一組連續(xù)的寄存器中。為了提高效率務(wù)必使用連續(xù)讀取Burst Read功能。以I2C為例標(biāo)準(zhǔn)的單字節(jié)讀取效率極低。正確做法是先寫入起始寄存器地址例如0x3B這是加速度計(jì)X軸高字節(jié)的地址然后連續(xù)讀取14個(gè)字節(jié)6個(gè)加速度計(jì)字節(jié)2個(gè)溫度字節(jié)6個(gè)陀螺儀字節(jié)。ICM-20608的寄存器地址在連續(xù)讀取時(shí)會自動遞增這一次性就把所有數(shù)據(jù)拿到了。uint8_t buffer[14]; i2c_read_bytes(ICM20608_ADDR, 0x3B, buffer, 14); // 合成原始數(shù)據(jù)注意字節(jié)序高字節(jié)在前 int16_t ax_raw (buffer[0] 8) | buffer[1]; int16_t ay_raw (buffer[2] 8) | buffer[3]; int16_t az_raw (buffer[4] 8) | buffer[5]; // 溫度值可用于校準(zhǔn)或監(jiān)測環(huán)境 int16_t temperature_raw (buffer[6] 8) | buffer[7]; int16_t gx_raw (buffer[8] 8) | buffer[9]; int16_t gy_raw (buffer[10] 8) | buffer[11]; int16_t gz_raw (buffer[12] 8) | buffer[13];4. 從原始數(shù)據(jù)到物理量校準(zhǔn)與換算讀出來的ax_raw、gx_raw等是16位有符號整數(shù)需要轉(zhuǎn)換成有物理意義的單位。4.1 換算公式轉(zhuǎn)換依賴于之前配置的量程。以加速度計(jì)±4g陀螺儀±500°/s為例加速度accel_g raw_data / sensitivityICM-20608在±4g量程下的靈敏度LSB/g為8192。所以ax_g ax_raw / 8192.0單位是g重力加速度。角速度gyro_dps raw_data / sensitivityICM-20608在±500°/s量程下的靈敏度LSB/(°/s)為65.5。所以gx_dps gx_raw / 65.5單位是度/秒。4.2 至關(guān)重要的傳感器校準(zhǔn)直接換算得到的數(shù)據(jù)是不能直接用的因?yàn)榇嬖诹闫捅壤`差。校準(zhǔn)是提升精度的最關(guān)鍵一步?jīng)]有之一。加速度計(jì)校準(zhǔn)原理是靜態(tài)下三軸加速度矢量和應(yīng)等于1g。將傳感器在6個(gè)不同靜止姿態(tài)每個(gè)軸正反朝向下放置分別記錄數(shù)據(jù)。對于每個(gè)軸其零偏offset可以近似為offset (max_raw min_raw) / 2。更精確的做法是用最小二乘法求解。校準(zhǔn)后數(shù)據(jù)換算變?yōu)閍x_g (ax_raw - offset_x) / sensitivity。陀螺儀校準(zhǔn)原理是靜止?fàn)顟B(tài)下角速度應(yīng)為零。將傳感器絕對靜止放置一段時(shí)間如數(shù)十秒采集大量數(shù)據(jù)其平均值就是零偏gyro_offset。換算公式gx_dps (gx_raw - gyro_offset_x) / sensitivity。實(shí)操心得校準(zhǔn)環(huán)境要盡可能水平、無振動。陀螺儀校準(zhǔn)對溫度敏感最好在設(shè)備正常工作溫度下進(jìn)行。對于消費(fèi)類產(chǎn)品可以在出廠時(shí)做一次校準(zhǔn)將偏移值保存在非易失存儲器中。對于高精度應(yīng)用可能需要實(shí)時(shí)溫度補(bǔ)償或在線校準(zhǔn)算法。4.3 溫度傳感器的利用ICM-20608內(nèi)部有一個(gè)溫度傳感器其原始數(shù)據(jù)temperature_raw也可以換算T(°C) temperature_raw / 326.8 25.0。這個(gè)溫度值可以用來監(jiān)測芯片溫度更重要的用途是進(jìn)行溫漂補(bǔ)償。陀螺儀的零偏和比例因子會隨溫度變化。你可以建立溫度-零偏的查找表或擬合公式在運(yùn)行時(shí)根據(jù)溫度讀數(shù)動態(tài)修正零偏這能大幅提升長時(shí)間工作的精度穩(wěn)定性。5. 數(shù)據(jù)融合入門從六軸數(shù)據(jù)到姿態(tài)角拿到了校準(zhǔn)后的三軸加速度和三軸角速度數(shù)據(jù)我們就能解算設(shè)備的姿態(tài)俯仰角Pitch、橫滾角Roll、偏航角Yaw。這里簡單介紹最經(jīng)典的互補(bǔ)濾波算法它是理解姿態(tài)解算的基石。5.1 為什么不能單獨(dú)用加速度計(jì)或陀螺儀加速度計(jì)在靜態(tài)或緩慢運(yùn)動時(shí)可以通過測量重力加速度在三個(gè)軸上的分量利用三角函數(shù)直接解算出俯仰角和橫滾角。缺點(diǎn)對動態(tài)加速度如運(yùn)動、振動極其敏感一旦設(shè)備本身在加速測量值就會嚴(yán)重失真。陀螺儀通過積分角速度可以得到角度變化動態(tài)響應(yīng)好。缺點(diǎn)存在零偏誤差積分會隨時(shí)間累積產(chǎn)生巨大的漂移短時(shí)間后角度就“飛”了。5.2 互補(bǔ)濾波的基本思想取長補(bǔ)短。用加速度計(jì)解算出的角度長期穩(wěn)定但高頻噪聲大去校正陀螺儀積分得到的角度短期精確但長期漂移。就像一個(gè)“濾波器”讓低頻部分穩(wěn)定姿態(tài)信任加速度計(jì)高頻部分快速轉(zhuǎn)動信任陀螺儀。一個(gè)最簡單的一維互補(bǔ)濾波偽代碼示例以俯仰角Pitch為例float pitch 0.0; // 估計(jì)的俯仰角 float dt 0.01; // 采樣周期10ms float alpha 0.98; // 互補(bǔ)濾波系數(shù)通常0.95-0.99 while(1) { // 1. 用陀螺儀積分得到角度預(yù)測 float gyro_pitch_rate get_gyro_y_calibrated(); // 注意繞Y軸旋轉(zhuǎn)影響Pitch角 pitch_gyro pitch gyro_pitch_rate * dt; // 2. 用加速度計(jì)計(jì)算當(dāng)前角度觀測值 float ax get_accel_x_calibrated(); float ay get_accel_y_calibrated(); float az get_accel_z_calibrated(); // 利用加速度計(jì)反解俯仰角atan2函數(shù)能處理所有象限 float pitch_acc atan2(-ax, sqrt(ay*ay az*az)) * 180.0 / PI; // 3. 互補(bǔ)融合 pitch alpha * pitch_gyro (1 - alpha) * pitch_acc; delay(dt * 1000); }5.3 進(jìn)階方向卡爾曼濾波與DMP互補(bǔ)濾波簡單有效但對于動態(tài)性能要求高、模型復(fù)雜的場景擴(kuò)展卡爾曼濾波是更優(yōu)的選擇。它通過建立系統(tǒng)的狀態(tài)方程和觀測方程以最優(yōu)估計(jì)的方式融合數(shù)據(jù)精度和抗干擾能力更強(qiáng)但數(shù)學(xué)復(fù)雜調(diào)參困難。此外ICM-20608和MPU6050一樣內(nèi)部集成了一個(gè)可編程的DMP數(shù)字運(yùn)動處理器。你可以將編譯好的姿態(tài)解算固件由InvenSense提供加載到傳感器的輔助處理器中DMP會直接解算出四元數(shù)并通過FIFO或中斷輸出給主控MCU。這極大地減輕了主控MCU的運(yùn)算負(fù)擔(dān)對于資源緊張的MCU來說是“神器”。不過使用DMP需要獲取官方的驅(qū)動庫并理解其加載和配置流程這是另一個(gè)需要深入研究的專題。6. 低功耗優(yōu)化實(shí)戰(zhàn)讓電池續(xù)航翻倍在我的手環(huán)項(xiàng)目中低功耗是硬指標(biāo)。ICM-20608本身提供了豐富的低功耗模式用好了能省下可觀的電量。6.1 周期喚醒模式這是最常用的省電策略。傳感器大部分時(shí)間處于睡眠狀態(tài)每隔一個(gè)固定周期如100ms自動喚醒一次進(jìn)行采樣將數(shù)據(jù)存入FIFO然后再次進(jìn)入睡眠。主控MCU不需要頻繁輪詢可以在傳感器睡眠時(shí)也進(jìn)入自己的低功耗模式只在FIFO數(shù)據(jù)快滿時(shí)被中斷喚醒一次性讀取大量數(shù)據(jù)。這避免了頻繁的I2C/SPI通信帶來的功耗。配置方法涉及幾個(gè)寄存器PWR_MGMT_1: 設(shè)置CYCLE位為1啟用循環(huán)模式。PWR_MGMT_2: 關(guān)閉不需要的傳感器例如如果只用加速度計(jì)就關(guān)閉陀螺儀。LP_CONFIG和ACCEL_CONFIG 2: 配置加速度計(jì)在低功耗模式下的平均濾波次數(shù)這會影響功耗和噪聲。SMPLRT_DIV: 設(shè)置采樣率分頻器。實(shí)際采樣率 內(nèi)部時(shí)鐘 / (1 SMPLRT_DIV)。在循環(huán)模式下這個(gè)采樣率就是喚醒周期。6.2 運(yùn)動中斷喚醒更進(jìn)一步可以配置加速度計(jì)在檢測到特定強(qiáng)度的運(yùn)動如手腕抬起時(shí)才產(chǎn)生中斷喚醒主控MCU。在靜止無操作時(shí)整個(gè)系統(tǒng)傳感器和MCU可以處于極深的睡眠狀態(tài)。這通過配置INT_ENABLE、ACCEL_INTEL_CTRL和ACCEL_WOM_THR等寄存器實(shí)現(xiàn)。你需要設(shè)置一個(gè)加速度閾值當(dāng)任一軸的加速度變化超過該閾值并持續(xù)一定時(shí)間就會觸發(fā)中斷。6.3 電源管理寄存器精打細(xì)算PWR_MGMT_1中的TEMP_DIS位如果不關(guān)心溫度可以關(guān)閉溫度傳感器。USER_CTRL中的FIFO_EN位如果不用FIFO確保關(guān)閉它。SIGNAL_PATH_RESET在初始化時(shí)進(jìn)行復(fù)位可以確保信號路徑干凈。踩坑實(shí)錄我曾遇到周期喚醒模式功耗降不下來的問題。排查后發(fā)現(xiàn)雖然設(shè)置了CYCLE位但PWR_MGMT_2寄存器里陀螺儀的STBY_XG等位沒有設(shè)置為1即沒有關(guān)閉陀螺儀。傳感器確實(shí)在周期喚醒但每次喚醒都把陀螺儀和加速度計(jì)都打開了功耗自然高。務(wù)必確認(rèn)在低功耗模式下只開啟了絕對必要的傳感器單元。7. 常見問題排查與調(diào)試心得調(diào)試傳感器最讓人頭疼的就是“沒數(shù)據(jù)”或者“數(shù)據(jù)不對”。下面是一個(gè)系統(tǒng)的排查鏈路。7.1 硬件連接與電源檢查測量電壓首先用萬用表確認(rèn)VDD如3.3V和VDDIO必須與MCU電平一致引腳電壓是否穩(wěn)定、正確。GND連接是否可靠。檢查上拉電阻如果使用I2CSDA和SCL線上是否接了合適的上拉電阻通常4.7kΩ。用示波器看波形如果波形上升沿緩慢、幅值不足就是上拉電阻過大或電源驅(qū)動能力不足。檢查引腳配置確認(rèn)CS/AD0引腳的電平是否與你的軟件配置模式匹配。想用I2CCS腳必須接高電平。7.2 通信鏈路測試I2C地址掃描寫一個(gè)簡單的I2C掃描程序看是否能發(fā)現(xiàn)0x68或0x69地址的設(shè)備。這是驗(yàn)證物理鏈路和基本配置的第一步。讀寫測試寄存器ICM-20608有一個(gè)WHO_AM_I寄存器地址0x75其默認(rèn)值是0xAF。嘗試讀取這個(gè)寄存器。如果讀不到或值不對說明通信不成功。如果讀到的值全為0xFF或0x00可能是總線被拉死檢查是否有設(shè)備沖突或SCL/SDA被意外配置為輸出低。如果讀到的值隨機(jī)變化可能是時(shí)序問題檢查MCU的I2C時(shí)鐘頻率是否過高或者嘗試降低速率。7.3 數(shù)據(jù)異常分析數(shù)據(jù)全為零或固定值傳感器可能還在睡眠模式。檢查PWR_MGMT_1寄存器的SLEEP位是否已清零。數(shù)據(jù)跳動劇烈噪聲大檢查電源紋波。傳感器對電源噪聲非常敏感確保電源處有足夠的濾波電容如10uF電解并聯(lián)0.1uF陶瓷電容。檢查數(shù)字低通濾波器DLPF是否啟用并配置了合適的帶寬。DLPF是抑制高頻噪聲的關(guān)鍵。電路板是否受到電機(jī)、繼電器等大電流設(shè)備的干擾盡量讓傳感器遠(yuǎn)離干擾源。加速度計(jì)靜止時(shí)矢量和不等于1g這是正常的因?yàn)榇嬖诹闫捅壤`差。需要進(jìn)行校準(zhǔn)。校準(zhǔn)后靜止時(shí)sqrt(ax^2ay^2az^2)應(yīng)非常接近1g。陀螺儀靜止時(shí)輸出不為零且緩慢漂移這是陀螺儀的零偏必須通過校準(zhǔn)去除。注意溫度變化會引|起零偏變化這是長期漂移的主要來源。7.4 利用FIFO避免數(shù)據(jù)丟失在高速采樣或主控MCU忙于其他任務(wù)時(shí)使用FIFO先入先出緩沖區(qū)是避免數(shù)據(jù)丟失的最佳實(shí)踐。ICM-20608的FIFO可以存儲多達(dá)1000多個(gè)字節(jié)的數(shù)據(jù)。你可以配置傳感器將加速度、陀螺儀、溫度等數(shù)據(jù)自動存入FIFO然后主控MCU定期或當(dāng)FIFO快滿時(shí)通過中斷一次性讀取FIFO中的所有數(shù)據(jù)。這大大降低了實(shí)時(shí)讀取的時(shí)序壓力也減少了總線通信次數(shù)。配置FIFO主要涉及USER_CTRL啟用FIFO功能、FIFO_EN選擇哪些數(shù)據(jù)流進(jìn)入FIFO和INT_STATUS檢查FIFO溢出狀態(tài)等寄存器。讀取時(shí)先讀FIFO_COUNT_H和FIFO_COUNT_L寄存器獲取當(dāng)前FIFO中的數(shù)據(jù)字節(jié)數(shù)然后從FIFO_R_W寄存器地址進(jìn)行連續(xù)讀取即可。調(diào)試FIFO時(shí)一個(gè)常見的坑是FIFO溢出。如果主控讀取速度跟不上傳感器寫入速度FIFO滿了之后新數(shù)據(jù)會丟失并可能設(shè)置溢出標(biāo)志。解決方案是提高主控讀取頻率或者降低傳感器采樣率或者增加FIFO水位線中斷在FIFO半滿時(shí)就觸發(fā)讀取。