在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取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。 為了方便操作,將讀寫函數再封裝一層,將跨頁寫入的各種情況都考慮到,實現任意地址連續(xù)寫入。程序如下:

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

#define AT24CXX_ADDR_READ

0xA1#define AT24CXX_ADDR_WRITE

0xA0#define PAGE_SIZE

32/** * @brief

AT24C64任意地址連續(xù)讀多個字節(jié)數據 * @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任意地址連續(xù)寫多個字節(jié)數據 * @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;

//寫入字節(jié)計數

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

if(0 == addr % PAGE_SIZE )

{

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

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

if(size 《= PAGE_SIZE)

{

//寫入的字節(jié)數不大于一頁,直接寫入

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

}

else

{

//寫入的字節(jié)數大于一頁,先將整頁循環(huán)寫入

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;

}

//將剩余的字節(jié)寫入

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

}

}

else

{

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

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

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

//循環(huán)寫整頁數據

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;

}

//將剩下的字節(jié)寫入

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

}

}}

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

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

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

審核編輯 :李倩

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

    關注

    2270

    文章

    10918

    瀏覽量

    356821
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1495

    瀏覽量

    124142
  • 函數
    +關注

    關注

    3

    文章

    4344

    瀏覽量

    62820

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

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

收藏 人收藏

    評論

    相關推薦

    I2C總線的優(yōu)缺點分析

    設備之間的通信,這大大減少了所需的引腳數量,降低了硬件成本。此外,由于其簡單性,I2C總線也易于實現和維護。 2. 多主機和多從機支持 I2C總線支持多個主機和多個從機,這意味著在同一
    的頭像 發(fā)表于 01-17 15:50 ?68次閱讀

    I2C總線與Arduino的接口示例

    在現代電子設計中,I2C總線因其簡單性和靈活性而廣受歡迎。它允許多個設備共享同一通信線路,從而節(jié)省空間和成本。Arduino,作為一個多功能的微控制器平臺,自然也支持I2C通信。 I2C總線
    的頭像 發(fā)表于 01-17 15:34 ?72次閱讀

    I2C總線的工作模式介紹

    在現代電子系統(tǒng)中,I2C總線作為一種多主機、多從機的串行通信協議,扮演著至關重要的角色。它允許多個設備共享同一總線,進行數據傳輸,從而簡化了系統(tǒng)設計并降低了成本。 I2C總線的基本特性 I2C總線由
    的頭像 發(fā)表于 01-17 15:32 ?80次閱讀

    I2C總線故障排除技巧

    導致整個系統(tǒng)的功能受到影響。 1. 檢查硬件連接 1.1 確認電源和接地 首先,確保I2C設備的電源和接地連接正確無誤。不良的電源或接地連接可能導致信號不穩(wěn)定,從而引發(fā)通信錯誤。 1.2 檢查總線線纜 檢查SDA和SCL線是否正確連接,并且沒有損壞。在長距離傳
    的頭像 發(fā)表于 01-17 15:20 ?109次閱讀

    I2C總線設備地址設置方法

    通常是一個7位或10位的數字,用于標識總線上的每個設備。在7位尋址模式下,地址范圍是0x00到0x7F,而在10位尋址模式下,地址范圍是0x000到0x3FF。I2C地址的最低位(LSB)通常用于指示讀/寫操作。 硬件地址設置 1. 地址引腳配置 許多
    的頭像 發(fā)表于 01-17 15:17 ?111次閱讀

    I2C總線應用實例分析

    在現代電子系統(tǒng)中,I2C總線因其簡單、靈活和高效的特點而被廣泛應用于各種設備之間的通信。 I2C總線概述 I2C總線由Philips(現為NXP)在1980年代初期開發(fā),最初用于音頻和視頻設備
    的頭像 發(fā)表于 01-17 15:09 ?104次閱讀

    RISC V的I2C操作

    _0_io_scl_write(system_i2c_0_io_scl_write),.system_i2c_0_io_scl_read(system_i2c_0_io_scl_read),WriteEnable信號的處理
    的頭像 發(fā)表于 11-01 11:06 ?246次閱讀

    I2C協議的基礎知識

    本文從I2C協議的概述開始,描述協議的歷史、不同速度模式、物理層和數據幀結構,最后介紹I2C混合電壓系統(tǒng)中電平兼容性以及上拉電阻大小計算。
    的頭像 發(fā)表于 10-22 15:51 ?613次閱讀
    <b class='flag-5'>I2C</b>協議的基礎知識

    了解I2C總線

    電子發(fā)燒友網站提供《了解I2C總線.pdf》資料免費下載
    發(fā)表于 10-08 11:13 ?2次下載
    了解<b class='flag-5'>I2C</b>總線

    I2C基本指南

    電子發(fā)燒友網站提供《I2C基本指南.pdf》資料免費下載
    發(fā)表于 09-10 09:40 ?0次下載
    <b class='flag-5'>I2C</b>基本指南

    CAN轉I2C橋接器

    電子發(fā)燒友網站提供《CAN轉I2C橋接器.pdf》資料免費下載
    發(fā)表于 08-28 11:10 ?0次下載
    CAN轉<b class='flag-5'>I2C</b>橋接器

    請問STM32硬件I2C存在什么缺陷?

    我看野火的庫函數開發(fā)手冊里面感覺用I2C用的挺順的呀 為什么張洋卻說STM32I2C有缺陷 不推薦用 請問下 各位在使用I2C的時候碰到過什么情況嗎 我怎么都沒感覺到
    發(fā)表于 05-16 07:46

    請問數字(硬件)I2C和模擬I2C的優(yōu)缺點?

    請教哈各位同仁: 1. 數字(硬件)I2C和模擬I2C的優(yōu)缺點? 2.他們在正常模式下的功耗對比,哪個較好?
    發(fā)表于 05-13 06:10

    什么是I2C協議 I2C總線的控制邏輯

    在實際使用過程中,I2C比較容易出現的一個問題就是死鎖 ,死鎖在I2C中主要表現為:I2C死鎖時表現為SCL為高,SDA一直為低。
    發(fā)表于 03-12 09:17 ?1137次閱讀
    什么是<b class='flag-5'>I2C</b>協議 <b class='flag-5'>I2C</b>總線的控制邏輯

    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發(fā)版的硬件I2C驅動如何做到穩(wěn)得一批

    在一個評論中,看到網友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩(wěn)得一批。
    的頭像 發(fā)表于 02-23 09:37 ?2856次閱讀
    GD32 MCU<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派開發(fā)版的<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>驅動如何做到穩(wěn)得一批
    主站蜘蛛池模板: 中文字幕第五页| 末满18以下勿进色禁网站| 午夜禁片| 免费看大尺度视频在线观看| 中国色老头| 在线观看视频色| 日本精品卡一卡2卡3卡四卡三卡| 久草资源网站| 天天射视频| 成年人网站免费观看| 噜噜噜噜噜久久久久久91| 色综合久久丁香婷婷| 在线欧美成人| 亚洲情网| 在线观看视频色| 午夜看片a福利在线| 浮荡视频在线观看免费| 98pao强力打造高清免费| 国产欧美一区二区日本加勒比| 天天做天天爱夜夜大爽完整| 成人伊人亚洲人综合网站222| 精品免费| 亚洲毛片网站| 色婷婷丁香六月| 色欧美色图| 可以直接看的黄址| 六月婷婷综合| 国产看色免费| 国产一区二区三区在线影院| 免费国产一区二区三区| 国产一级做a爰片久久毛片男| 久久久免费视频观看| 欧美综合久久| 欧美无遮挡国产欧美另类| 欧美一级精品| 丁香伊人五月综合激激激| 在线播放免费视频| 99久久综合精品免费| 一本视频在线| 天天爽夜夜爽免费看| 99精品视频在线播放2|