国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

GD32 單片機(jī) 硬件I2C死鎖解決方法

這篇具有很好參考價(jià)值的文章主要介紹了GD32 單片機(jī) 硬件I2C死鎖解決方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

死鎖的復(fù)現(xiàn)方式

  • 在I2C恢復(fù)函數(shù)下個(gè)斷點(diǎn)(檢測(cè)到I2C多次超時(shí)之后,應(yīng)該能跳轉(zhuǎn)到I2C恢復(fù)函數(shù))
  • 使用鑷子,將SCL與SDA短接,很快就能看到程序停到恢復(fù)函數(shù)的斷點(diǎn)上,此時(shí)再執(zhí)行恢復(fù)函數(shù),看能否正常走出(可在回復(fù)函數(shù)中寫個(gè)死循環(huán),只有I2C正常才跳出,檢測(cè)I2C正常的辦法,可以讀從設(shè)備的ID)
  • void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      if (i2cHandle->Instance == I2C1)
      {
        /* USER CODE BEGIN I2C1_MspInit 0 */
    
        /* USER CODE END I2C1_MspInit 0 */
    
        __HAL_RCC_GPIOB_CLK_ENABLE();
    
        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
        for (int i = 0; i < 10; ++i)
        {
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
          HAL_Delay(1);
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
          HAL_Delay(1);
        }
    
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
    
        HAL_Delay(1);
        i2cHandle->Instance->CR1 |= I2C_CR1_SWRST; //復(fù)位I2C控制器
        HAL_Delay(1);
        i2cHandle->Instance->CR1 = 0; //解除復(fù)位(不會(huì)自動(dòng)清除)
    
        /**I2C1 GPIO Configuration    
        PB6     ------> I2C1_SCL
        PB7     ------> I2C1_SDA 
        */
        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
        /* I2C1 clock enable */
        __HAL_RCC_I2C1_CLK_ENABLE();
        /* USER CODE BEGIN I2C1_MspInit 1 */
    
        /* USER CODE END I2C1_MspInit 1 */
      }
    }
    
    
    /* USER CODE BEGIN 1 */
    void I2C_Reset()
    {
      HAL_I2C_MspDeInit(&hi2c1);
      hi2c1.State = HAL_I2C_STATE_RESET;
      MX_I2C1_Init();
      // 硬件i2c會(huì)出現(xiàn)死鎖,當(dāng)超時(shí)次數(shù)達(dá)到一定數(shù)量,即很有可能是發(fā)生了死鎖
      // 所謂死鎖是指主機(jī)與從機(jī)互相等待,主機(jī)以為總線在從機(jī)手上控制,從機(jī)以為總線在主機(jī)手上控制,一直再等待對(duì)方釋放總線
    }
    

    死鎖的解決方法

  1. 釋放IO口為GPIO,復(fù)位句柄狀態(tài)標(biāo)志,改為IO方式
  2. 將SDA改為高電平?
  3. 將SCK發(fā)送9個(gè)時(shí)鐘? 為高電平時(shí),測(cè)試SDA是否為低電平完成死鎖。

通過(guò)模擬幾種情形來(lái)實(shí)際體會(huì)一下(從機(jī)對(duì)SDA的操作紅色表示):

如果在地址字節(jié)第9個(gè)CLK拉高后主機(jī)復(fù)位。在模擬的第一個(gè)時(shí)鐘低電平期間就可以看到SDA的釋放,隨后主機(jī)先拉低SDA,再模擬一個(gè)STOP結(jié)束條件。

GD32 單片機(jī) 硬件I2C死鎖解決方法,嵌入式硬件,單片機(jī)

在數(shù)據(jù)字節(jié)第2個(gè)CLK拉高后主機(jī)復(fù)位,在第二個(gè)模擬的時(shí)鐘低電平期間才看到SDA釋放

GD32 單片機(jī) 硬件I2C死鎖解決方法,嵌入式硬件,單片機(jī)


在數(shù)據(jù)字節(jié)第6個(gè)CLK拉高后主機(jī)復(fù)位,在第三個(gè)模擬的時(shí)鐘低電平期間才看到SDA釋放

GD32 單片機(jī) 硬件I2C死鎖解決方法,嵌入式硬件,單片機(jī)

通過(guò)以上三種情況的分析,想必你已經(jīng)非常清楚改如何處理了,最后附上一個(gè)程序處理流程圖:

GD32 單片機(jī) 硬件I2C死鎖解決方法,嵌入式硬件,單片機(jī)

SCL掛死

I2C從機(jī)主動(dòng)拉低SCL線在規(guī)范中是一個(gè)合法的行為,稱之為Clock Stretching(時(shí)鐘擴(kuò)展,我一般叫他時(shí)鐘同步)。通常是主機(jī)請(qǐng)求數(shù)據(jù)( 收或者發(fā))后從機(jī)需要一些時(shí)間處理,且沒有多余Buffer可以接收接或者提供接下來(lái)的數(shù)據(jù)的時(shí)候從機(jī)則會(huì)拉低SCL一段時(shí)間直到有新的數(shù)據(jù)準(zhǔn)備好。

SCL掛死(也就是前面所說(shuō)一直拉低SCL)這種情況在標(biāo)準(zhǔn)I2C從器件上基本不會(huì)出現(xiàn),因?yàn)橹灰酒€在正常工作buffer總算有準(zhǔn)備好的時(shí)候,自然就就釋放SCL了。往往是使用用戶使用MCU作為I2C從機(jī)時(shí),程序設(shè)計(jì)上的問題導(dǎo)致MCU無(wú)法讀取&填充buffer而導(dǎo)致,重點(diǎn)分析MCU I2C中斷服務(wù)程序。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-745815.html

  1. I2C中斷服務(wù)程序被意外屏蔽
  2. 中斷服務(wù)程序中陷入了一些標(biāo)志位查詢的while(flag != xxx)死循環(huán)
  3. I2C功能系統(tǒng)被意外禁止

到了這里,關(guān)于GD32 單片機(jī) 硬件I2C死鎖解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 51單片機(jī)——模擬I2C總線與AT24C02通信

    51單片機(jī)——模擬I2C總線與AT24C02通信

    目錄 一、寫在前面 二、功能描述 三、主要模塊介紹 3.1 I2C總線介紹 3.2 I2C總線協(xié)議 3.2.1數(shù)據(jù)有效規(guī)定 3.2.2起始信號(hào)和停止信號(hào)? 3.2.3 發(fā)送應(yīng)答和接收應(yīng)答 3.2.4 主機(jī)發(fā)送一個(gè)字節(jié)和接收一個(gè)字節(jié) 3.3 AT24C02介紹 3.3 字節(jié)寫和隨機(jī)讀 四、測(cè)試文件test.c 五、現(xiàn)象描述 AT24C02芯片有I

    2024年02月14日
    瀏覽(27)
  • 嵌入式中I2C 相關(guān)的硬件問題匯總及死鎖解決辦法

    嵌入式中I2C 相關(guān)的硬件問題匯總及死鎖解決辦法

    本文主要介紹如何解決I2C設(shè)備硬件設(shè)計(jì)上的各種問題,希望對(duì)大家有所幫助! 關(guān)于I2C協(xié)議詳細(xì)的講解,可以參考之前的推文:全面解析 I2C 通信協(xié)議 一般情況下, i2c 設(shè)備焊接沒什么問題,按照設(shè)備手冊(cè)一步步來(lái),基本上就順風(fēng)順?biāo)軌蛴闷饋?lái)。如果這么一個(gè)簡(jiǎn)單的東西,有

    2024年02月19日
    瀏覽(22)
  • 【單片機(jī)】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常見通信方式

    【單片機(jī)】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常見通信方式

    在單片機(jī)開發(fā)中,UART、I2C、RS485等普遍在用,這里做一個(gè)簡(jiǎn)單的介紹 UART口指的是一種物理接口形式(硬件)。 UART是異步(指不使用時(shí)鐘同步,依靠幀長(zhǎng)進(jìn)行判斷),全雙工(收發(fā)可以同時(shí)進(jìn)行)串口總線。它比同步串口復(fù)雜很多。有兩根線,一根TXD用于發(fā)送,一根RXD用于接收

    2024年02月11日
    瀏覽(24)
  • STM32硬件I2C通信外設(shè)

    STM32硬件I2C通信外設(shè)

    本文主要介紹stm32自帶的I2C通信外設(shè),對(duì)比與軟件模擬I2C,硬件I2C可以自動(dòng)生成時(shí)序,時(shí)序的操作更加及時(shí)規(guī)范,可以實(shí)現(xiàn)更加高性能的IIC通信。 本文內(nèi)容與I2C軟件通信有諸多類似之處,I2C軟件通信可見:https://blog.csdn.net/qq_53922901/article/details/136662006?spm=1001.2014.3001.5501 在8位指

    2024年04月08日
    瀏覽(27)
  • 【STM32】入門(七):I2C硬件控制方式

    【STM32】入門(七):I2C硬件控制方式

    之所以叫“I2C硬件控制方式”是與“軟件控制方式”相對(duì)。I2C軟件控制,就是寫程序直接操作兩個(gè)GPIO引腳,分別作為時(shí)鐘線SCL和數(shù)據(jù)線SDA,按照I2C協(xié)議的時(shí)序要求,操作GPIO輸入、輸出、高電平、低電平。 聽著就很復(fù)雜,好在STM32中有I2C的硬件實(shí)現(xiàn),即通過(guò)簡(jiǎn)單的操作寄存器

    2023年04月08日
    瀏覽(26)
  • GD32F103硬件I2C0通訊

    GD32F103硬件I2C0通訊

    GD32F103的I2C模塊有I2C0和I2C1;本程序使用I2C0功能模塊; I2C0引腳復(fù)用和重映射: 當(dāng)I2C0_REMAP=0時(shí),I2C0引腳復(fù)用功能,I2C0_SCL映射到PB6引腳,I2C0_SDA映射到PB7引腳; 當(dāng)I2C0_REMAP=1時(shí),I2C0引腳重映射,I2C0_SCL映射到PB8引腳,I2C0_SDA映射到PB9引腳; I2C1引腳只有復(fù)用引腳: I2C1_SCL映射到PB10引腳,I2C1_SDA映射到

    2024年02月13日
    瀏覽(18)
  • STM32 HAL FreeRTOS 硬件I2C 使用

    STM32 HAL FreeRTOS 硬件I2C 使用

    因?yàn)槟硞€(gè)項(xiàng)目想要顏色識(shí)別,去識(shí)別球的顏色,但是又不想多來(lái)個(gè)攝像頭,所以想嘗試一下顏色傳感器的方案。但是經(jīng)過(guò)嘗試,HAL庫(kù)生成的 FreeRTOS 硬件 I2C 讀寫一直在報(bào)錯(cuò)。 剛好手頭上有九軸陀螺儀的例程代碼。最后用FreeRTOS 硬件 I2C 讀取數(shù)據(jù)。 這里提到了阻塞式 HAL 函數(shù)(

    2024年02月20日
    瀏覽(22)
  • STM32 SHT40驅(qū)動(dòng)源碼(使用硬件I2C)

    STM32 SHT40驅(qū)動(dòng)源碼(使用硬件I2C)

    目錄 簡(jiǎn)介: SHT40.c: SHT40.h 測(cè)試結(jié)果: ? ? ? ? SHT40是瑞士Sensirion公司推出的第四代溫濕度傳感器,內(nèi)部集成加熱器用于去除表面微小液滴。集成I2C接口,典型的相對(duì)濕度精度1.8%RH,典型溫度精度0.2℃,運(yùn)行在0-100%RH和-40-125℃的環(huán)境中。 主控:STM32H7B0VBT6 平臺(tái):STM32CubeIDE SHT4

    2024年03月19日
    瀏覽(131)
  • STM32F407系列硬件I2C筆記

    STM32F407系列有3個(gè)硬件I2C: I2C1:該接口位于GPIOB引腳上,包括PB6(I2C1_SCL)和PB7(I2C1_SDA)。 I2C2:該接口位于GPIOB引腳上,包括PB10(I2C2_SCL)和PB11(I2C2_SDA)。 I2C3:該接口位于GPIOA和GPIOC引腳上,包括PA8(I2C3_SCL)和PC9(I2C3_SDA)。 ? 硬件I2C的速度比軟件I2C更快,硬件I2C通??梢?/p>

    2024年02月04日
    瀏覽(33)
  • STM32F030硬件I2C代碼及解析

    STM32F030硬件I2C代碼及解析

    剛接觸STM32的時(shí)候,第一個(gè)學(xué)習(xí)的就是I2C,當(dāng)時(shí)去網(wǎng)上學(xué)習(xí)別人寫得I2C代碼,雖然能用,但是當(dāng)時(shí)并不理解為什么要這么配置,特別希望有人把代碼掰碎了講講看,今天突然想起來(lái),就把以前寫的I2C代碼拿出來(lái)掰碎了捋捋,希望對(duì)新手有些幫助。 先說(shuō)說(shuō)STM32的I2C: ST的M3系列還

    2024年02月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包