国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32的硬件I2C設計有BUG

GReq_mcu168 ? 來源:硬件攻城獅 ? 作者:硬件攻城獅 ? 2022-04-26 15:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

坊間一直流傳著一個傳說~STM32的硬件I2C設計有BUG,最好不要用,用軟件I2C比較靠譜。長久以來,為了不必要的麻煩,我也一直沒有用過硬件I2C,主要是軟件I2C也比較方便,基本上任意端口都可以用。

最近畫了塊板子,正好用到了I2C,就順便來測試一下硬件I2C是不是真的像有些人說的不好用。

測試硬件:STM32F407VET6+AT24C64測試軟件:STM32CubeMX v6.1.1HAL庫:STM32CubeF4 Firmware Package V1.25.2

STM32CubeMX配置 使用STM32CubeMX配置很方便,時鐘等基礎配置不再詳細介紹,直接看I2C配置如下:

c3060f02-c3b9-11ec-bce3-dac502259ad0.png

這里的速度模式選擇為標準模式,時鐘為100K。要求高的可以選擇Fast模式,400K時鐘。 配置完成后生成代碼。

編寫代碼 代碼生成后,直接調用讀寫數據的函數即可: HAL_I2C_Mem_Read HAL_I2C_Mem_Write 函數參數可參考代碼注釋。 24CXX系列的EEPROM進行寫操作時需要注意,跨頁寫入時,要有一定的延時,否則會寫入不成功。不同容量的頁大小也不一樣。 另外,24C16以下容量的地址為8位,24C32以上容量的地址為16位,在調用讀寫函數時需要注意,選擇I2C_MEMADD_SIZE_8BIT或者I2C_MEMADD_SIZE_16BIT。測試使用的是24C64,所以選擇I2C_MEMADD_SIZE_16BIT。 為了方便操作,將讀寫函數再封裝一層,將跨頁寫入的各種情況都考慮到,實現任意地址連續寫入。程序如下:

#include “at24c64.h”#include “i2c.h”

#define AT24CXX_ADDR_READ

0xA1#define AT24CXX_ADDR_WRITE

0xA0#define PAGE_SIZE

32/** * @brief

AT24C64任意地址連續讀多個字節數據 * @param

addr —— 讀數據的地址(0-65535) * @param

dat —— 存放讀出數據的地址 * @retval

成功 —— HAL_OK*/uint8_t At24cxx_Read_Amount_Byte(uint16_t addr, uint8_t* recv_buf, uint16_t size){

return HAL_I2C_Mem_Read(&hi2c2, AT24CXX_ADDR_READ, addr, I2C_MEMADD_SIZE_16BIT, recv_buf, size, 0xFFFFFFFF);}

/** * @brief

AT24C64任意地址連續寫多個字節數據 * @param

addr —— 寫數據的地址(0-65535) * @param

dat —— 存放寫入數據的地址 * @retval

成功 —— HAL_OK*/uint8_t At24cxx_Write_Amount_Byte(uint16_t addr, uint8_t* dat, uint16_t size){

uint8_t i = 0; uint16_t cnt = 0;

//寫入字節計數

/* 對于起始地址,有兩種情況,分別判斷 */

if(0 == addr % PAGE_SIZE )

{

/* 起始地址剛好是頁開始地址 */

/* 對于寫入的字節數,有兩種情況,分別判斷 */

if(size 《= PAGE_SIZE)

{

//寫入的字節數不大于一頁,直接寫入

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, dat, size, 0xFFFFFFFF);

}

else

{

//寫入的字節數大于一頁,先將整頁循環寫入

for(i = 0;i 《 size/PAGE_SIZE; i++)

{

HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], PAGE_SIZE, 0xFFFFFFFF);

HAL_Delay(3);

addr += PAGE_SIZE;

cnt += PAGE_SIZE;

}

//將剩余的字節寫入

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], size - cnt, 0xFFFFFFFF);

}

}

else

{

/* 起始地址偏離頁開始地址 */

/* 對于寫入的字節數,有兩種情況,分別判斷 */

if(size 《= (PAGE_SIZE - addr%PAGE_SIZE))

{

/* 在該頁可以寫完 */

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, dat, size, 0xFFFFFFFF);

}

else

{

/* 該頁寫不完 */

//先將該頁寫完

cnt += PAGE_SIZE - addr%PAGE_SIZE;

HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, dat, cnt, 0xFFFFFFFF);

addr += cnt;

HAL_Delay(3);

//循環寫整頁數據

for(i = 0;i 《 (size - cnt)/PAGE_SIZE; i++)

{

HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], PAGE_SIZE, 0xFFFFFFFF);

HAL_Delay(3);

addr += PAGE_SIZE;

cnt += PAGE_SIZE;

}

//將剩下的字節寫入

return HAL_I2C_Mem_Write(&hi2c2, AT24CXX_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, &dat[cnt], size - cnt, 0xFFFFFFFF);

}

}}

測試結果經過測試硬件I2C讀寫EEPROM正常。沒有發現所謂的BUG,當然這只是M4內核的針對EEPROM一種器件的測試,對于其它內核(M3等)和其它I2C器件,還有待驗證。

總結硬件I2C使用起來比較簡單,不需要自己去調節時序,但是只能使用固定的幾個引腳。軟件模擬I2C可以使用任意引腳,針對不同的MCU,移植起來比較方便,但對于不同頻率的MCU,時序調節比較麻煩。

兩者各有其優缺點,需要根據實際需求去選擇。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2309

    文章

    11162

    瀏覽量

    373474
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1556

    瀏覽量

    131243
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67521

原文標題:STM32的硬件I2C有BUG嗎?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RK平臺I2C開發:從硬件原理到實戰排查

    在嵌入式開發中,I2C 總線是連接外設的 “橋梁”—— 小到傳感器、EEPROM,大到 LCD 驅動器、音頻芯片,都離不開它的控制。而瑞芯微(Rockchip)系列芯片作為主流嵌入式方案,其 I2C 控制器的開發是很多工程師的必備技能。
    的頭像 發表于 02-05 13:42 ?966次閱讀
    RK平臺<b class='flag-5'>I2C</b>開發:從<b class='flag-5'>硬件</b>原理到實戰排查

    I2C 為什么只要兩根線就能搞定通信?

    到目前為止,我們已經討論了SPI通信和UART通信的基礎知識,現在讓我們討論本系列的最后一個協議,即集成電路間協議(I2C)。如果您曾經構建過使用OLED顯示器、氣壓傳感器或陀螺儀/加速度計模塊
    的頭像 發表于 01-04 09:14 ?1646次閱讀
    <b class='flag-5'>I2C</b> 為什么只要兩根線就能搞定通信?

    基于FPGA的I2C控制模塊設計

    I2C_WRITE_WDATA.v模塊實現I2C寫時序,I2C_Controller (I2C控制器)例化了I2C_WRITE_WDATA.
    的頭像 發表于 12-26 09:48 ?4971次閱讀
    基于FPGA的<b class='flag-5'>I2C</b>控制模塊設計

    AS32X601的I2C模塊操作EEPROM詳解

    國科安芯推出的AS32X601系列MCU芯片內置的I2C模塊提供了符合工業標準的兩線串行制接口,可用于MCU和外部I2C設備的通訊。I2C總線使用兩條串行線:串行數據線SDA和串行時鐘線SCL
    的頭像 發表于 12-21 21:39 ?984次閱讀
    AS32X601的<b class='flag-5'>I2C</b>模塊操作EEPROM詳解

    CW32的I2C是否好用?照比ST的來說?

    最初STM32F103的硬件I2C是有bug的,容易出現超時等待,那么請問,CW32的I2C有沒有類似于
    發表于 12-04 06:02

    I2C死鎖的問題

    在實際使用過程中,I2C比較容易出現的一個問題就是死鎖 ,死鎖在I2C中主要表現為:I2C死鎖時表現為SCL為高,SDA一直為低。 在I2C主設備進行讀寫操作的過程中,主設備在開始信
    發表于 12-04 06:00

    深入剖析I2C協議

    I2C是由Philips開發的簡單的雙向兩線總線,在深入淺出理解SPI協議中,我們區分了單工,半雙工,全雙工協議數據流向的區別,根據特征,I2C協議屬于半雙工協議(即同一時刻,數據單向流動)。此外
    的頭像 發表于 08-21 15:10 ?3675次閱讀
    深入剖析<b class='flag-5'>I2C</b>協議

    第十八章 I2C通信測試

    本章介紹了I2C協議,其物理層用SDA和SCL雙線,支持多設備:協議層含起始/停止信號、應答機制等。還講解W55MH32的I2C外設及初始化,并進行了通信測試代碼的分析。
    的頭像 發表于 06-19 17:07 ?1314次閱讀
    第十八章 <b class='flag-5'>I2C</b>通信測試

    STM32H7CubeMX配置硬件I2C,讀寫失敗是什么問題呀?

    STM32H7CubeMX配置硬件I2C,讀寫失敗什么問題呀,同樣的操作F4和F1都能正常使用,應該不存在i2c地址錯誤,操作都是一樣的,但H7就是用不了。
    發表于 06-12 06:21

    SPC574s如何使用SPC5Studio自帶的I2C庫實現I2C通信?

    SPC574s并沒有硬件I2C外設,可以使用SPC5Studio自帶的SW I2C庫來實現,但是由于SPC5Studio軟件資料太少,I2C一直沒有數據,各位有相關的資料嗎?
    發表于 06-09 06:22

    SPC574s如何使用SPC5Studio自帶的I2C庫實現I2C通信?

    SPC574s并沒有硬件I2C外設,可以使用SPC5Studio自帶的SW I2C庫來實現,但是由于SPC5Studio軟件資料太少,I2C一直沒有數據,各位有相關的資料嗎?
    發表于 06-05 08:17

    簡單了解I2C接口

    在電子電路的復雜世界里,各種電路模塊設備需要相互通信才能協同工作 ,I2C接口就像是電路模塊設備間的溝通橋梁,今天就帶大家深入了解它。
    的頭像 發表于 05-08 14:15 ?2535次閱讀
    簡單了解<b class='flag-5'>I2C</b>接口

    基于RT-Thread的I2C(軟件) 實踐 | 技術集結

    一、軟硬件介紹(一)I2C(軟件)I2C是一種廣泛應用于嵌入式系統中的短距離串行通信協議,支持多主多從設備模式,主機通過時鐘信號SCL和數據線SDA與從機進行數據交互。在RT-Thread操作系統中
    的頭像 發表于 05-06 18:44 ?1047次閱讀
    基于RT-Thread的<b class='flag-5'>I2C</b>(軟件) 實踐 | 技術集結

    STM32學習筆記_I2C詳解(可下載)

    I2C 是一種簡單的雙向二線制同步串行總線。它只需要兩根線即可在連接于總線 上的器件之間傳送信息I2C 總線能夠支持多個設備間的通訊。它包含一條雙向串行數據線 SDA,一條串行時鐘線 SCL。每個
    發表于 03-14 17:33 ?3次下載

    I2C總線復用

    帝晶智慧屏I2C總線復用
    的頭像 發表于 03-11 17:20 ?2094次閱讀