娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

GD32 MCU碰到IIC總線卡死怎么辦?

發(fā)布者:Huanle最新更新時間:2024-11-07 來源: elecfans關(guān)鍵字:GD32  MCU  IIC總線 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

大家在使用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) 。

wKgZomXZShGAD0AVAAC3zH17MmY045.png


以下為兩種復(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(); } } }

wKgaomXZShiAbcOxAACtlqGCdfA351.png


(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(); } } }

wKgaomXZSh6AfaDhAADGMKXklJo287.png

關(guān)鍵字:GD32  MCU  IIC總線 引用地址:GD32 MCU碰到IIC總線卡死怎么辦?

上一篇:GD32 FATFS+FTL Nand解決方案
下一篇:基于GD32驅(qū)動BLDC電機(jī)(1)定時器和PWM

推薦閱讀最新更新時間:2025-06-14 15:49

51單片機(jī)實(shí)驗12:EEPROM(IIC總線) 應(yīng)用
開發(fā)板EEPROM模塊電路圖如下: 目的:實(shí)現(xiàn)單片機(jī)與開發(fā)板AT24C02芯片通信。 實(shí)驗現(xiàn)象:下載程序后數(shù)碼管后4位顯示0,按K1保存顯示的數(shù)據(jù),按K2讀取上次保存的數(shù)據(jù),按K3顯示數(shù)據(jù)加一,按K4顯示數(shù)據(jù)清零。最大能寫入的數(shù)據(jù)是255。 開發(fā)板獨(dú)立按鍵的使用及原理圖參考:https://blog.csdn.net/cax1165/article/details/86566884 開發(fā)板數(shù)碼管的使用及原理圖參考:https://blog.csdn.net/cax1165/article/details/86557551 EEPROM(IIC總線) 以及AT24C02工作原理參考:https://blog.cs
[單片機(jī)]
51<font color='red'>單片機(jī)</font>實(shí)驗12:EEPROM(<font color='red'>IIC</font><font color='red'>總線</font>) 應(yīng)用
S3C2440 IIC總線接口
s3c2440內(nèi)部有一個IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設(shè)備提供了便利。它具有四種操作模式:主設(shè)備發(fā)送模式、主設(shè)備接收模式、從設(shè)備發(fā)送模式和從設(shè)備接收模式。 在這里只把s3c2440當(dāng)做IIC總線的主設(shè)備來使用,因此只介紹前兩種操作模式。在主設(shè)備發(fā)送模式下,它的工作流程為:首先配置IIC模式,然后把從設(shè)備地址寫入接收發(fā)送數(shù)據(jù)移位寄存器IICDS中,再把0xF0寫入控制狀態(tài)寄存器IICSTAT中,這時等待從設(shè)備發(fā)送應(yīng)答信號,如果想要繼續(xù)發(fā)送數(shù)據(jù),那么在接收到應(yīng)答信號后,再把待發(fā)送的數(shù)據(jù)寫入寄存器IICDS中,清除中斷標(biāo)志后,再次等待應(yīng)答信號;如果不想再發(fā)送數(shù)據(jù)了,那么把0x90寫入寄存器IICSTAT中
[單片機(jī)]
S3C2440 <font color='red'>IIC</font><font color='red'>總線</font>接口
MSP430非模擬IIC總線控制程序
對于MSP430的學(xué)習(xí)經(jīng)歷一個從痛苦到對430很有感情的轉(zhuǎn)變.當(dāng)然開始學(xué)習(xí)的時候那是相當(dāng)惱火.網(wǎng)上也沒有什么很多的相關(guān)資料.就算有資料也是給不全.參考與學(xué)習(xí)都不很方便.經(jīng)過多方面的努力和找書再到對程序的仔細(xì)讀,感到非模擬的總線帶來的方便還是很多的. 下面就是程序和流程圖: IIC.h void Init_IIC(void); void EEPROM_ByteWrite(unsigned char nAddr,unsigned char nVal); unsigned char EEPROM_RandomRead(unsigned char nAddr); unsigned char EEPROM_CurrentAddres
[單片機(jī)]
MSP430非模擬<font color='red'>IIC</font><font color='red'>總線</font>控制程序
hc32和gd32的區(qū)別
HC32和GD32都是中國的MCU品牌,它們都是標(biāo)準(zhǔn)的ARM Cortex-M內(nèi)核芯片。HC32的品牌是華大集成電路,而GD32的品牌是吉祥航空電子。這兩個品牌雖然都是來自中國,但它們在處理器架構(gòu)、性能和功能上存在很多不同之處。 1. 處理器架構(gòu) HC32和GD32都是基于ARM Cortex-M內(nèi)核的MCU芯片,但它們的內(nèi)核版本不同。HC32使用的是ARM Cortex-M0+內(nèi)核,而GD32則使用了ARM Cortex-M3或Cortex-M4內(nèi)核。ARM Cortex-M0+是一種低功耗內(nèi)核,適合于處理數(shù)據(jù)傳輸、機(jī)器人控制、測量和計量等應(yīng)用場景。ARM Cortex-M3或Cortex-M4內(nèi)核則更加高效和強(qiáng)大,適用于嵌入式
[單片機(jī)]
(4)趣味單片機(jī)新玩法-百變可編程arduino
arduino 管方主頁 我們在了解了一些基本電子電路和儀器后,總有種磨刀霍霍,準(zhǔn)備大干一場!!對于絕大部分電子愛好者來說,編程是很難繞開的一個話題;舉個例子吧,我們冥思苦想用電路搭建一個16路LED燈的流水燈,但是用arduino加上幾行代碼就能完成目標(biāo);再比如我們經(jīng)常會用到PWM控制步進(jìn)電機(jī)、舵機(jī)等這兩者雖說都是用PWM控制,但是一個是控制占空比,另外一個是控制產(chǎn)生的脈沖個數(shù),用電路實(shí)現(xiàn)起來很麻煩,但是用代碼來實(shí)現(xiàn)那就相當(dāng)easy!! 可以這么說,代碼會帶給你更多想象空間,編程給你帶來更多樂趣? 簡單的介紹下arduino 這玩意當(dāng)時制作出來的初衷就是為了降低那些喜歡動手的學(xué)生學(xué)習(xí)單片機(jī)的門檻,但是沒想到一下就這么
[單片機(jī)]
Microchip 推出集成高性能模擬外設(shè)的32位PIC32A單片機(jī)
采用200 MHz CPU集成業(yè)界領(lǐng)先的模擬外設(shè),提供高性價比系統(tǒng)級解決方案 為滿足各行各業(yè)對高性能、數(shù)學(xué)密集型應(yīng)用日益增長的需求,Microchip Technology Inc.(微芯科技公司)正式發(fā)布PIC32A系列MCU。該產(chǎn)品進(jìn)一步擴(kuò)充了公司強(qiáng)大的32位MCU產(chǎn)品線,專為汽車、工業(yè)、消費(fèi)、人工智能/機(jī)器學(xué)習(xí)(AI/ML)及醫(yī)療市場提供高性價比、高性能的通用型解決方案。 32位PIC32A MCU采用200 MHz CPU,集成高速模擬外設(shè),旨在大幅減少對外部元件的需求。 其特性包括高達(dá)40 Msps的12位ADC、5納秒高速比較器和100 MHz增益帶寬積(GBWP)運(yùn)算放大器,適用于智能邊緣傳感。這些特性結(jié)合
[單片機(jī)]
Microchip 推出集成高性能模擬外設(shè)的32位PIC32A<font color='red'>單片機(jī)</font>
英飛凌計劃對TRAVEO? T2G汽車MCU進(jìn)行ISO/SAE 21434 產(chǎn)品合規(guī)認(rèn)證
【2025年1月16日, 德國慕尼黑訊】 道路車輛日益增加的聯(lián)網(wǎng)需求令網(wǎng)絡(luò)安全需求日益增長。為此,聯(lián)合國歐洲經(jīng)濟(jì)委員會(UNECE)通過了R155和R156法規(guī),對汽車主機(jī)廠(OEM)的網(wǎng)絡(luò)安全要求做出規(guī)定。 想要在受UNECE監(jiān)管的市場上銷售新車,主機(jī)廠必須持有有效的批準(zhǔn)證書,且在整個供應(yīng)鏈體系中落實(shí)網(wǎng)絡(luò)安全實(shí)踐,以盡可能降低車輛在全生命周期中遭遇攻擊的風(fēng)險。全球功率系統(tǒng)和物聯(lián)網(wǎng)領(lǐng)域的半導(dǎo)體領(lǐng)導(dǎo)者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)用于車身和集群的TRAVEO? T2G 汽車微控制器(MCU)系列配備了硬件安全模塊(HSM),該模塊能夠執(zhí)行安全啟動并安全隔離HSM應(yīng)用和數(shù)據(jù)。為了進(jìn)一步加強(qiáng)這
[嵌入式]
英飛凌計劃對TRAVEO? T2G汽車<font color='red'>MCU</font>進(jìn)行ISO/SAE 21434 產(chǎn)品合規(guī)認(rèn)證
Copter E001系列MCU在感應(yīng)電機(jī)控制應(yīng)用中的實(shí)時基準(zhǔn)對比測試
電機(jī)控制系統(tǒng)是一種典型的實(shí)時控制系統(tǒng),為了提高控制精度,需要盡可能地提高系統(tǒng)的響應(yīng)速度。實(shí)時微控制器(Microcontroller Unit,MCU)是實(shí)時控制系統(tǒng)的核心,配合一些外圍硬件電路組成了整個實(shí)時控制電路。忽略外圍硬件電路的響應(yīng)時間,影響實(shí)時控制系統(tǒng)響應(yīng)速度的主要因素是MCU響應(yīng)時間。MCU響應(yīng)時間主要包括內(nèi)部ADC的采樣時間、MCU外設(shè)的驅(qū)動延時、讀寫寄存器時間和應(yīng)用代碼運(yùn)行時間。因此,MCU性能是決定實(shí)時控制系統(tǒng)響應(yīng)速度的最關(guān)鍵因素之一。 本文使用華太電子即將上市發(fā)布的Copter E001系列MCU HS32F7D377PTI(主頻300M,雙核),與具有壟斷地位的海外廠商競品28379(T公司,主頻200M
[嵌入式]
Copter E001系列<font color='red'>MCU</font>在感應(yīng)電機(jī)控制應(yīng)用中的實(shí)時基準(zhǔn)對比測試
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 宣化县| 卢湾区| 潢川县| 慈利县| 贺州市| 逊克县| 宁陵县| 盖州市| 桓台县| 麻江县| 柳河县| 孟州市| 龙门县| 岗巴县| 波密县| 屏边| 民乐县| 沧州市| 木兰县| 福安市| 玉山县| 诸城市| 南丰县| 淮北市| 大石桥市| 盐城市| 吉林省| 和静县| 墨竹工卡县| 溧阳市| 汾西县| 东乡| 岗巴县| 临湘市| 福州市| 额尔古纳市| 瓦房店市| 疏附县| 隆安县| 临汾市| 彭州市|