chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32的硬件I2C設(shè)計(jì)有BUG

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

掃碼添加小助手

加入工程師交流群

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

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

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

STM32CubeMX配置 使用STM32CubeMX配置很方便,時(shí)鐘等基礎(chǔ)配置不再詳細(xì)介紹,直接看I2C配置如下:

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

這里的速度模式選擇為標(biāo)準(zhǔn)模式,時(shí)鐘為100K。要求高的可以選擇Fast模式,400K時(shí)鐘。 配置完成后生成代碼。

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

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

#define AT24CXX_ADDR_READ

0xA1#define AT24CXX_ADDR_WRITE

0xA0#define PAGE_SIZE

32/** * @brief

AT24C64任意地址連續(xù)讀多個(gè)字節(jié)數(shù)據(jù) * @param

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

dat —— 存放讀出數(shù)據(jù)的地址 * @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ù)寫多個(gè)字節(jié)數(shù)據(jù) * @param

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

dat —— 存放寫入數(shù)據(jù)的地址 * @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é)計(jì)數(shù)

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

if(0 == addr % PAGE_SIZE )

{

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

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

if(size 《= PAGE_SIZE)

{

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

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

}

else

{

//寫入的字節(jié)數(shù)大于一頁,先將整頁循環(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é)數(shù),有兩種情況,分別判斷 */

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)寫整頁數(shù)據(jù)

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

}

}}

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

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

兩者各有其優(yōu)缺點(diǎn),需要根據(jù)實(shí)際需求去選擇。

審核編輯 :李倩

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

    關(guān)注

    2305

    文章

    11118

    瀏覽量

    370956
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1547

    瀏覽量

    130422
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4405

    瀏覽量

    66798

原文標(biāo)題:STM32的硬件I2C有BUG嗎?

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    深入剖析I2C協(xié)議

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

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

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

    STM32學(xué)習(xí)筆記_I2C詳解(可下載)

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

    I2C總線復(fù)用

    帝晶智慧屏I2C總線復(fù)用
    的頭像 發(fā)表于 03-11 17:20 ?1843次閱讀

    I2C總線通信原理 如何設(shè)計(jì)I2C總線電路

    I2C總線通信原理 I2C(Inter-Integrated Circuit)總線是一種用于集成電路之間進(jìn)行通信的串行通信協(xié)議。它最早由飛利浦公司(現(xiàn)被恩智浦電子收購)于1982年推出,是一種簡單
    的頭像 發(fā)表于 01-31 15:01 ?1862次閱讀

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

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

    I2C總線與Arduino的接口示例

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

    I2C總線的工作模式介紹

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

    I2C總線協(xié)議詳細(xì)解析

    1. I2C總線簡介 I2C總線由Philips Semiconductor(現(xiàn)為NXP Semiconductors)在1980年代初期開發(fā)。它是一種多主機(jī)總線,允許多個(gè)設(shè)備共享同一總線。I2C
    的頭像 發(fā)表于 01-17 15:22 ?1559次閱讀

    I2C總線故障排除技巧

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

    I2C總線與單片機(jī)的連接

    在現(xiàn)代電子系統(tǒng)中,單片機(jī)(MCU)是核心控制單元,而I2C總線作為一種多主機(jī)、多從機(jī)的串行通信協(xié)議,因其簡單、高效和節(jié)省引腳的特性而被廣泛應(yīng)用于各種電子設(shè)備中。 I2C總線概述 I2C總線由兩條線
    的頭像 發(fā)表于 01-17 15:18 ?1936次閱讀

    I2C總線設(shè)備地址設(shè)置方法

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

    I2C總線應(yīng)用實(shí)例分析

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

    I2C總線與SPI總線的比較

    在現(xiàn)代電子系統(tǒng)中,微控制器與各種外設(shè)之間的通信是必不可少的。I2C和SPI是兩種流行的串行通信協(xié)議,它們各自具有獨(dú)特的特點(diǎn)和應(yīng)用場景。 I2C總線 I2C是一種多主機(jī)、多從機(jī)的同步通信協(xié)議,廣泛應(yīng)用
    的頭像 發(fā)表于 01-17 15:08 ?1680次閱讀

    I2C總線上拉電阻阻值如何確定?

    導(dǎo)讀I2C總線在產(chǎn)品設(shè)計(jì)中被廣泛應(yīng)用,盡管其結(jié)構(gòu)簡單,但經(jīng)常發(fā)生上拉電阻設(shè)計(jì)不合理的問題。本文將對I2C上拉電阻的選擇進(jìn)行簡要分析。一根信號線上,通過電阻連接一個(gè)固定的高電平VCC,信號線初始、空閑
    的頭像 發(fā)表于 12-27 11:34 ?2361次閱讀
    <b class='flag-5'>I2C</b>總線上拉電阻阻值如何確定?