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

STM32-I2C通信在AT24C02的應(yīng)用

這篇具有很好參考價值的文章主要介紹了STM32-I2C通信在AT24C02的應(yīng)用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

AT24C02是一種失去電源供給后依舊能保持?jǐn)?shù)據(jù)的儲存器,常用來儲存一些配置信息,在系統(tǒng)重新上電之后也可以加載。它的容量是2k bit的EEPROM存儲器,采用I2C通信方式。

AT24C02支持兩種寫操作:字節(jié)寫操作和頁寫操作。本實驗中我們采用的是字節(jié)寫操作,就是一個地址一個數(shù)據(jù)這樣進行數(shù)據(jù)寫入。頁寫模式就是連續(xù)寫入數(shù)據(jù),只需寫入一個地址,連續(xù)寫入數(shù)據(jù)的時候,地址會自動后移,但有頁限制,超出一頁的時候,超出數(shù)據(jù)會覆蓋原先寫入的數(shù)據(jù)。

AT24C02支持三種讀操作:當(dāng)前地址讀操作,隨機地址讀操作和順序讀操作模式。

當(dāng)前地址讀模式是基于上一次讀/寫操作的最后位置繼續(xù)讀出數(shù)據(jù)。隨機地址讀模式是指定地址讀出數(shù)據(jù)。順序讀操作模式就是連續(xù)讀出數(shù)據(jù),會自動翻頁。

注意到我們采用的STM32F1系列里,SCL時鐘線為PB6,SDA數(shù)據(jù)線為PB7。本次實驗中,時鐘線我們就正常的設(shè)置為推挽輸入,數(shù)據(jù)線則設(shè)置為開漏模式(因為我們引入了外部上拉電阻,提供穩(wěn)定的空閑高電平,而且我們的數(shù)據(jù)線既要作為輸出,又要作為輸入,用開漏輸出模式,能很好地實現(xiàn)輸入輸出共用,避免頻繁IO模式切換帶來的麻煩)。編寫代碼時,注意完成發(fā)送的時候,主機要釋放SDA。

在開漏模式下,MCU讀取IDR狀態(tài)寄存器,來獲取引腳高低電平。

STM32-I2C通信在AT24C02的應(yīng)用

接下來編寫我們的實驗代碼:

首先編寫我們的函數(shù)頭文件iic.c:

#include "./BSP/IIC/iic.h"
#include "./SYSTEM/delay/delay.h"

void iic_init(void){

    GPIO_InitTypeDef gpio_init_struct = {0};

    IIC_SCL_GPIO_CLK_ENABLE();
    IIC_SDA_GPIO_CLK_ENABLE();

    //SCL設(shè)置
    gpio_init_strcut.Pin = IIC_SCL_GPIO_PIN;
    gpio_init_strcut.Mode = GPIO_MODE_OUTPUT_PP;
    gpio_init_strcut.Pull = GPIO_PULLUP;
    gpio_init_strcut.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(IIC_GPIO_PORT, &gpio_init_strcut); //IIC_GPIO_PORT就是GPIOB

    //SCL設(shè)置
    gpio_init_strcut.Pin = IIC_SDA_GPIO_PIN;
    gpio_init_strcut.Mode = GPIO_MODE_OUTPUT_OD;
    HAL_GPIO_Init(IIC_GPIO_PORT, &gpio_init_strcut);
}

static void iic_delay(void){
    delay_ms(2);
}

void iic_start(void){
    //SCL為高電平時,SDA從高電平向低電平跳變,制造起始信號
    IIC_SDA(1);
    IIC_SCL(1);
    delay_ms();
    IIC_SDA(0);
    delay_ms();
    IIC_SCL(0);
    delay_ms();//鉗住總線,準(zhǔn)備發(fā)送或者接受數(shù)據(jù)
}
 
void iic_stop(void){
    //SCL為高電平的適合,SDA從低電平向高電平跳變,制造停止信號
    IIC_SDA(0);
    delay_ms();
    IIC_SCL(1);
    delay_ms();
    IIC_SDA(1);
    delay_ms();
}

uint8_t iic_wait_ack(void){ //主機檢測應(yīng)答信號
 
    IIC_SDA(1); //主機釋放SDA線
    delay_ms();
    IIC_SCL(1); //從機返回ACK
    delay_ms();
 
    if(IIC_READ_SDA){ //SDA高電平表示讀取到高電平,從機未作出應(yīng)答,由于上拉電阻有高電平阻塞效果,表示讀取到非應(yīng)答信號
        iic_stop();
        return 1;
    }
 
    IIC_SCL(0);
    delay_ms();
    return 0;
}
 
void iic_ack(void){ //從機發(fā)送低電平應(yīng)答信號,將主機發(fā)送的高電平信號導(dǎo)入至此,使主機的數(shù)據(jù)線檢測函數(shù)得到的是低電平,繼續(xù)要求數(shù)據(jù)
 
    IIC_SCL(0);
    delay_ms();
    IIC_SDA(0);
    delay_ms();
    IIC_SCL(1);
    delay_ms();
}
 
void iic_nack(void){ //從機發(fā)送非應(yīng)答信號,不再要求數(shù)據(jù)
 
    IIC_SCL(0);
    delay_ms();
    IIC_SDA(1);
    delay_ms();
    IIC_SCL(1);
    delay_ms();
}

void iic_send_byte(uint8_t data){
    for(uint8_t t = 0; t < 8; t++){
        //高位先發(fā)
        IIC_SDA((data & 0x80) >> 7);
        IIC_SCL(1);
        delay_ms();
        IIC_SCL(0);
        data <<= 1; //左移一位,進行下一次發(fā)送
    }
    IIC_SDA(1); //完成后,釋放數(shù)據(jù)線,進行應(yīng)答檢測
}
 
uint8_t iic_read_byte(uint8_t ack){
    uint8_t receive = 0;
 
    for(uint8_t i = 0; t < 8; t++){
        //高位先被輸入,左移以騰空右邊的位置給下一低位數(shù)據(jù)
        receive <<= 1;
        IIC_SCL(1);
        delay_ms();
        if(IIC_READ_SDA) receive++;
        IIC_SCL(0);
        delay_ms();
    }

    if(!ack) iic_nack();
    else iic_ack();
    return receive;
}

接下來編寫函數(shù)頭文件iic.h:

#ifndef __IIC_H
#define __IIC_H

void iic_init(void);
static void iic_delay(void);
void iic_start(void);
void iic_stop(void);
uint8_t iic_wait_ack(void);
void iic_ack(void);
void iic_nack(void);
void iic_send_byte(uint8_t data);
uint8_t iic_read_byte(uint8_t ack);

#endif

接下來再編寫存儲器的函數(shù)文件24cxx.c:

#include "./BSP/IIC/iic.h"
#include "./BSP/24CXX/24cxx.h"
#include "./SYSTEM/delay/delay.h"

void at24c02_init(void){
    iic_init();
}

void at24c02_write_byte(uint8_t addr, uint8_t data){
    iic_start();
    iic_send_byte(0xA0); //發(fā)送通訊地址(寫地址操作)
    iic_wait_ack();
    iic_send_byte(addr);
    iic_wait_ack();
    iic_send_byte(data);
    iic_wait_ack();
    iic_stop();

    delay_ms(10);
}

uint8_t at24c02_read_byte(uint8_t addr){
    uint8_t rec = 0;

    iic_start();
    iic_send_byte(0xA0); //發(fā)送通訊地址(寫地址操作)
    iic_wait_ack();
    iic_send_byte(addr);
    iic_wait_ack();
    iic_start();
    iic_send_byte(0xA1); //發(fā)送通訊地址(寫地址操作)
    iic_wait_ack();
    iic_send_byte(addr);
    iic_wait_ack();
    rec = iic_read_byte(0);
    iic_stop();

    return rec;
}

接下來編寫存儲器函數(shù)文件的頭文件:24cxx.h:

#ifndef __24CXX_H
#define __24CXX_H

void at24c02_init(void);
void at24c02_write_byte(uint8_t addr, uint8_t data);
uint8_t at24c02_read_byte(uint8_t addr);

#endif

到這里我們的示例代碼便編寫完成了。文章來源地址http://www.zghlxwxcb.cn/news/detail-484343.html

到了這里,關(guān)于STM32-I2C通信在AT24C02的應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【STM32】AT24C256硬件I2C讀寫,基于HAL庫

    【STM32】AT24C256硬件I2C讀寫,基于HAL庫

    目錄 一、簡單介紹 二、配置工程 打開CubeMX,配置時鐘,調(diào)試接口,工程名,目錄等 配置iic 配置串口用于顯示信息 三、硬件連接 四、代碼編寫 一、隨機寫入一個字節(jié) 測試代碼 波形如下 代碼編寫 二、連續(xù)寫入 代碼如下 三、隨機讀取 測試代碼 波形如下 代碼編寫 四、連續(xù)

    2024年02月03日
    瀏覽(41)
  • STM32——AT24C02(EEPROM )

    STM32——AT24C02(EEPROM )

    1、簡介 AT24C02是一種2 Kb(256 × 8)串行電子可擦可編程只讀存儲器(EEPROM)芯片,支持標(biāo)準(zhǔn)I2C總線通信協(xié)議。 AT24C02的編程操作是以頁為單位完成的,每次最多可編程8個連續(xù)字節(jié)。具體來說,AT24C02的一頁大小為8個字節(jié),每次寫入數(shù)據(jù)時,需要確保寫入的數(shù)據(jù)不跨頁。因此,

    2024年04月13日
    瀏覽(26)
  • STM32基于HAL工程硬件I2C讀寫AT24C02/04/08數(shù)據(jù)

    STM32基于HAL工程硬件I2C讀寫AT24C02/04/08數(shù)據(jù)

    ?申明:本文章僅發(fā)表在CSDN網(wǎng)站,任何其他網(wǎng)站,未注明來源,見此內(nèi)容均為盜鏈和爬取,請多多尊重和支持原創(chuàng)! ??對于文中所提供的相關(guān)資源鏈接將作不定期更換。 相關(guān)篇針對AT24C32及以上容量《STM32基于STM32-HAL工程硬件I2C讀取AT24Cxx數(shù)據(jù)》 ??本工程使用STM32F103VE+AT24C02實

    2023年04月11日
    瀏覽(39)
  • STM32速成筆記—EEPROM(AT24C02)

    STM32速成筆記—EEPROM(AT24C02)

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習(xí)交流! AT24C01/02/04/08/16…是一個1K/2K/4K/8K/16K位電可擦除PROM,內(nèi)部含有128/256/512/1024/2048個8位字節(jié),AT24C01有一個8字節(jié)頁寫緩沖器,AT24C02/04/08/16有一個16字節(jié)頁寫緩沖器。電壓可允許低

    2024年02月11日
    瀏覽(21)
  • STM32MX配置EEPROM(AT24C02)------保姆級教程

    STM32MX配置EEPROM(AT24C02)------保姆級教程

    ———————————————————————————————————— ? 大家好哇!我是小光,嵌入式愛好者,一個想要成為系統(tǒng)架構(gòu)師的大三學(xué)生。 ?最近在開發(fā)一個STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驅(qū)動,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。

    2024年02月16日
    瀏覽(23)
  • STM32軟件模擬實現(xiàn)IIC寫入和讀取AT24C02(STM32CubeMx配置)

    STM32軟件模擬實現(xiàn)IIC寫入和讀取AT24C02(STM32CubeMx配置)

    IIC:Inter Integrated Circuit,集成電路總線,是一種 同步 串行 半雙工 通信總線。 在使用IIC時分為硬件IIC以及軟件IIC,下圖為兩者的區(qū)別: 在使用IIC前先來了解一下IIC總線結(jié)構(gòu)圖,即下圖: 從圖中可以看出IIC有兩個雙向信號線,一根是數(shù)據(jù)線SDA,一根是時鐘線SCL,并且都接上拉

    2024年02月04日
    瀏覽(19)
  • 6、單片機與AT24C02的通訊(IIC)實驗(STM32F407)

    6、單片機與AT24C02的通訊(IIC)實驗(STM32F407)

    IIC簡介 I2C(IIC,Inter-Integrated Circuit),兩線式串行總線,由PHILIPS公司開發(fā)用于連接微控制器及其外圍設(shè)備。 它是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在CPU與被控IC之間、IC與IC之間進行雙向傳送,高速IIC總線一般可達400kbps以上。 IIC是半雙工通信方式。 多主機

    2024年02月20日
    瀏覽(24)
  • 【51單片機】AT24C20數(shù)據(jù)幀(I2C總線)

    【51單片機】AT24C20數(shù)據(jù)幀(I2C總線)

    ??專欄【51單片機】 ??喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。 ??音樂分享【Love Story】 ??大一同學(xué)小吉,歡迎并且感謝大家指出我的問題?? 小吉先向大家道個歉,因為最近在期末突擊,所以文章久久沒有更新,也請大家多多見諒?? 目錄 ? ??I2C總線 ??????

    2024年02月08日
    瀏覽(30)
  • 【STM32L496】使用HAL庫實現(xiàn)I2C寫入/讀取數(shù)據(jù)(M24C32)

    【STM32L496】使用HAL庫實現(xiàn)I2C寫入/讀取數(shù)據(jù)(M24C32)

    IIC原理超詳細(xì)講解—值得一看 【嵌入式硬件芯片開發(fā)筆記】EEPROM芯片M24C32配置流程 STM32硬件I2C與軟件模擬I2C超詳解 實現(xiàn)通信功能的芯片為M24C32,對此,芯片手冊上第一頁就有對其概括描述。 Automotive 32-Kbit serial I2C bus EEPROM with 1 MHz clock 啟動/停止條件 :當(dāng)串行時鐘(SCL)位于

    2024年02月03日
    瀏覽(25)
  • STM32存儲左右互搏 I2C總線FATS讀寫EEPROM ZD24C1MA

    STM32存儲左右互搏 I2C總線FATS讀寫EEPROM ZD24C1MA

    在較低容量存儲領(lǐng)域,EEPROM是常用的存儲介質(zhì),可以通過直接或者文件操作方式進行讀寫。不同容量的EEPROM的地址對應(yīng)位數(shù)不同,在發(fā)送字節(jié)的格式上有所區(qū)別。EEPROM是非快速訪問存儲,因為EEPROM按頁進行組織,在連續(xù)操作模式,當(dāng)跨頁時訪問地址不是跳到下一頁到開始,而

    2024年02月12日
    瀏覽(34)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包