大家在使用MCU IIC通信時,若碰到設(shè)備復(fù)位或者總線干擾等情況,可能會導(dǎo)致IIC總線卡死,表現(xiàn)上總線上SDA或者SCL其中一根線為低電平,IIC總線一直處于busy狀態(tài)。此時若代碼上一直等待總線空閑,則可能導(dǎo)致軟件死機(jī),為解決該問題,本視頻提供了軟件配置釋放IIC總線的方法。
首先為大家介紹發(fā)生IIC總線卡死的兩種情況:(1)主機(jī)在發(fā)送 START 信號后, 控制 SCL 產(chǎn)生 8 個時鐘脈沖,然后拉低 SCL 信號為低電平,在這個時候,從設(shè)備輸出應(yīng)答信號,將 SDA 信號拉為低電平。如果這個時候主機(jī)異常復(fù)位, SCL 就會被釋放為高電平。此時,如果從機(jī)沒有復(fù)位,就會繼續(xù) I2C 的應(yīng)答,將 SDA一直拉為低電平,直到 SCL 變?yōu)榈碗娖剑艜Y(jié)束應(yīng)答信號。 而由于 I2C 主機(jī)復(fù)位后檢測總線的狀態(tài),如果 SDA 信號為低電平,則 I2C 總線被占用,會一直等待 SCL 和 SDA信號變?yōu)楦唠娖剑虼耍?I2C 主機(jī)等待從機(jī)釋放 SDA 信號時, I2C 從機(jī)又在等待主機(jī)將 SCL 信號拉低以釋放應(yīng)答信號,兩者相互等待, I2C 總線進(jìn)入死鎖狀態(tài) ;(2)主機(jī)在發(fā)送 START 信號后, 控制 SCL 產(chǎn)生 8 個時鐘脈沖,然后拉低 SCL 信號為低電平,在這個時候,從設(shè)備輸出應(yīng)答信號,將 SDA 信號拉為低電平。如果這個時候主機(jī)異常復(fù)位, SCL 就會被釋放為高電平。此時,如果從機(jī)沒有復(fù)位,就會繼續(xù) I2C 的應(yīng)答,將 SDA一直拉為低電平,直到 SCL 變?yōu)榈碗娖剑艜Y(jié)束應(yīng)答信號。 而由于 I2C 主機(jī)復(fù)位后檢測總線的狀態(tài),如果 SDA 信號為低電平,則 I2C 總線被占用,會一直等待 SCL 和 SDA信號變?yōu)楦唠娖健R虼耍?I2C 主機(jī)等待從機(jī)釋放 SDA 信號時, I2C 從機(jī)又在等待主機(jī)將 SCL 信號拉低以釋放應(yīng)答信號,兩者相互等待, I2C 總線進(jìn)入死鎖狀態(tài) 。
以下為兩種復(fù)位IIC總線卡死的軟件方法,大家可以嘗試使用:
(1)將SDA和SCL配置為推挽輸出,強(qiáng)制輸出stop信號
在 I2C 主機(jī)復(fù)位后,主機(jī)檢測 I2C 總線一直為 BUSY 狀態(tài),且超過設(shè)定的時間,則總線被鎖死。可通過將 I2C 的 SCL 和 SDA 引腳初始化成普通 GPIO 功能,配置成推挽輸出。 先拉高SCL 信號,在拉高 SDA 信號,模擬產(chǎn)生一個 STOP 信號,然后再配置為 I2C 的引腳復(fù)用功能。配置代碼如下所示。
/*! brief reset i2c bus param[in] none param[out] none retval none */ void i2c_bus_reset() { GPIO_BC(GPIOB) |= GPIO_PIN_6 | GPIO_PIN_7; gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7); __nop(); __nop(); __nop(); __nop(); __nop(); GPIO_BOP(GPIOB) |= GPIO_PIN_6; __nop(); __nop(); __nop(); __nop(); __nop(); GPIO_BOP(GPIOB) |= GPIO_PIN_7; gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); } /*! brief check the I2C is or not busy param[in] none param[out] none retval none */ void check_bus_status(void) { while(i2c_flag_get(I2C0,I2C_FLAG_I2CBSY)) { if(--time_out == 0){ i2c_bus_reset(); } } }
(2)將SCL配置為推挽輸出,強(qiáng)制輸出9個clk
在 I2C 主機(jī)中增加 I2C 總線恢復(fù)程序。每次 I2C 主設(shè)備復(fù)位后,如果檢測到 SDA 數(shù)據(jù)線被拉低,則控制 I2C 中的 SCL 時鐘線產(chǎn)生 9 個時鐘脈沖(針對 8 位數(shù)據(jù)的情況),這樣 I2C 從設(shè)備就可以完成被掛起的操作,從死鎖狀態(tài)中恢復(fù)過來。
I2C 主機(jī)通過將 SCL 引腳初始化為普通 GPIO 功能,配置成推挽輸出。保證連續(xù)發(fā)送 9 個時鐘脈沖,為保證后續(xù) I2C 正常通信,先將 I2C 模塊復(fù)位,再置位,最后再配置為 I2C 的引腳復(fù)用功能。配置代碼如下所示。
/*! brief reset i2c bus param[in] none param[out] none retval none */ void i2c_bus_reset() { uint8_t I = 0; gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); /* SCL output clock signal */ for(I = 0; I < 10; i++){ gpio_bit_reset(GPIOB, GPIO_PIN_6); delay_1us(2); gpio_bit_set(GPIOB, GPIO_PIN_6); delay_1us(2); } /* reset I2C */ i2c_software_reset_config(I2C0, I2C_SRESET_RESET); i2c_software_reset_config(I2C0, I2C_SRESET_SET); gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); } /*! brief check the I2C is or not busy param[in] none param[out] none retval none */ void check_bus_status(void) { while(i2c_flag_get(I2C0,I2C_FLAG_I2CBSY)) { if(--time_out == 0){ i2c_bus_reset(); } } }
上一篇:GD32 FATFS+FTL Nand解決方案
下一篇:基于GD32驅(qū)動BLDC電機(jī)(1)定時器和PWM
推薦閱讀最新更新時間:2025-06-14 15:49






設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- LTC3835EGN 演示板、低 Iq、36Vin 同步降壓控制器
- LT3791EFE 98.5% 高效 100W (33.3V/3A) 降壓-升壓型 LED 驅(qū)動器的典型應(yīng)用電路
- 使用 Analog Devices 的 LTC6990IDCB#TRMPBF 的參考設(shè)計
- STM32F103開發(fā)板-板載stlink
- 89C52RC開發(fā)板
- MIC280,MIC280 Precision Itty-bitty 熱監(jiān)控器評估板
- NCP301LSN20T1 2V 窗口電壓檢測器的典型應(yīng)用
- MIC2537 的典型應(yīng)用:四路配電開關(guān)最終信息
- OM13524: PCA9745B demonstration board OM13524
- AM2F-1205SH52Z 5V 2W DC/DC 轉(zhuǎn)換器的典型應(yīng)用
- 480Wh/kg!湖南久森半固態(tài)金屬鋰負(fù)極電池即將量產(chǎn)
- 中國首條硫化物固體電解質(zhì)量產(chǎn)線正式落地
- QUT開發(fā)出新的LENS系統(tǒng) 可以讓機(jī)器人進(jìn)行類似大腦的導(dǎo)航
- 毫米波雷達(dá)裝機(jī)量分析:毫米波雷達(dá)裝車量持續(xù)攀升,大陸和博世占據(jù)60%以上市場份額
- TDK推出適用于車載濾波器的同軸電纜供電電感器
- 大摩給“人形機(jī)器人100”清單注入新思路
- 行家預(yù)判:2025年車載Mini LED反超OLED
- 2025數(shù)智未來峰會:深度解讀AI賦能工業(yè)的趨勢與實(shí)踐
- 工業(yè)自動化中的Raspberry Pi:簡化經(jīng)濟(jì)實(shí)惠的邊緣計算
- 意法半導(dǎo)體宣布擴(kuò)大在新加坡的“Lab-in-Fab”廠內(nèi)實(shí)驗室合作項目
- 漲幅5%起!比亞迪半導(dǎo)體發(fā)漲價函,7月1日執(zhí)行
- 時序同步-了解和測試包含信號源的多信道射頻系統(tǒng)
- 國外調(diào)查顯示 人們對iOS 15和iPadOS 15系統(tǒng)并不很感興趣
- 三星將于月底舉行MWC 2021線上直播
- 研究機(jī)構(gòu):下代iPhone叫12s,售價跟去年一樣,無1TB版本
- 外設(shè)廠商動作頻頻,無線充電或成游戲硬件競爭新起點(diǎn)!
- 國內(nèi)智能音箱市場日漸火爆,出現(xiàn)了什么問題?
- 爆火泰捷網(wǎng)絡(luò)電視盒子,為何被稱為“網(wǎng)紅幸運(yùn)盒子”?
- 商派ECShop發(fā)力新零售,售后服務(wù)再升級
- Seeing Machines推自動駕駛車輛后備駕駛員監(jiān)控系統(tǒng) 提高自動駕駛安全性
- IAR調(diào)試不能識別設(shè)備
- 【討論】我最近在看一個產(chǎn)品,車載用400x400的攝像頭
- 吉時利2510-AT溫度控制源表自動調(diào)諧過程
- 問問
- 怎樣實(shí)現(xiàn)神州四號開發(fā)板與MATLAB的連接,實(shí)現(xiàn)利用MATLAB實(shí)現(xiàn):在電腦上顯示電壓變...
- 救救急吧,關(guān)于bootloader的配置問題
- 紅外對射管 占空比大約50%方波經(jīng)一階RC高通濾波后波形不規(guī)則
- 攢分,請無視攢分,請無視
- TI BeagleBone 開發(fā)板申請
- evc如何在一個窗體中創(chuàng)建兩種字體?急急急