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

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

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

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

【CW32模塊使用】AT24C02-EEPROM存儲器

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2025-03-29 17:26 ? 次閱讀

EEPROM (Electrically Erasable Programmable read only memory)是指帶電可擦可編程只讀存儲器。是一種掉電后數(shù)據(jù)不丟失的存儲芯片。EEPROM 可以在電腦上或?qū)S迷O(shè)備上擦除已有信息,重新編程。一般用在即插即用。AT24C02是一個2K位串行CMOS E2PROM, 內(nèi)部含有256個8位字節(jié),CATALYST公司的先進CMOS技術(shù)實質(zhì)上減少了器件的功耗。AT24C02有一個16字節(jié)頁寫緩沖器。該器件通過IIC總線接口進行操作,有一個專門的寫保護功能。

一、模塊來源

模塊實物展示:

wKgZO2flNLWAXI0sAAAx_GD039s096.jpg

二、規(guī)格參數(shù)

工作電壓:1.8V-5.5V

工作電流:最大3mA

通信接口:IIC

內(nèi)存:2048位

時鐘速度:5V時最大1000Khz,其余為400Khz

以上信息見廠家資料文件

三、移植過程

我們的目標是將例程移植至CW32F030C8T6開發(fā)板上【能夠播報語音的功能】。首先要獲取資料,查看數(shù)據(jù)手冊應(yīng)如何實現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。

3.1查看資料

wKgZPGflNLaAaDN0AAIFl4Y0ePg278.jpg

上圖是AT24CXX的設(shè)備地址(第一行的為AT24C02,它的容量為2K),我們發(fā)現(xiàn)AT24CXX整個系列芯片的地址高四位都相同,都是1010,這四位是由生產(chǎn)商固化在芯片內(nèi)部,無法改變。

AT24C02地址的低三位(不包括讀寫位)對應(yīng)芯片的三個引腳,也就是說這三位是可以人為設(shè)定的,23=8,所以一條I2C總線上可以掛載8個AT24C02。

AT24C02的地址為7位二進制數(shù),下圖中最后一位是讀寫位(數(shù)據(jù)方向位),1 表示讀數(shù)據(jù),0 表示寫數(shù)據(jù)。

這樣,7位設(shè)備地址加1位讀寫位,構(gòu)成I2C的尋址數(shù)據(jù)。I2C 總線的尋址過程中,通常在起始條件后的第一個字節(jié)決定了主機選擇哪一個從機,該字節(jié)的最后一位決定數(shù)據(jù)傳輸方向。

AT24C02讀寫:AT24C02的存儲空間為2K位(256字節(jié)),在對其進行寫數(shù)據(jù)時,最小寫入單位為字節(jié)(Byte),最大寫入單位為頁(Page),AT24C02頁大小為 16 Byte。

字節(jié)寫

在字節(jié)寫模式下,主器件發(fā)送起始信號和從器件地址信息(R/W 位置零)給從器件,在從器件送回應(yīng)答信號后,主器件發(fā)送 AT24WC01/02/04/08/16 的字節(jié)地址,主器件在收到從器件的應(yīng)答信號后,再發(fā)送數(shù)據(jù)到被尋址的存儲單元。AT24WC01/02/04/08/16 再次應(yīng)答,并在主器件產(chǎn)生停止信號后開始內(nèi)部數(shù)據(jù)的擦寫,在內(nèi)部擦寫過程中,AT24WC01/02/04/08/16 不再應(yīng)答主器件的任何請求。

wKgZO2flNLeAXDDIAAAlXFvrqBo271.jpg

頁寫

用頁寫,AT24WC01 可一次寫入 8 個字節(jié)數(shù)據(jù),AT24WC02/04/08/16 可以一次寫入 16 個字節(jié)的數(shù)據(jù),頁寫操作的啟動和字節(jié)寫一樣,不同在于傳送了一字節(jié)數(shù)據(jù)后并不產(chǎn)生停止信號,主器件被允許發(fā)送 P(AT24WC01 P=7;AT24WC02/04/08/16 P=15)個額外的字節(jié)。每發(fā)送一個字節(jié)數(shù)據(jù)后 AT24WC01/02/04/08/16 產(chǎn)生一個應(yīng)答位并將字節(jié)地址低位加 1,高位保持不變。

如果在發(fā)送停止信號之前主器件發(fā)送超過P+1個字節(jié),地址計數(shù)器將自動翻轉(zhuǎn),先前寫入的數(shù)據(jù)被覆蓋。

接收到P+1字節(jié)數(shù)據(jù)和主器件發(fā)送的停止信號后,AT24CXXX啟動內(nèi)部寫周期將數(shù)據(jù)寫到數(shù)據(jù)區(qū),所有接收的數(shù)據(jù)在一個寫周期內(nèi)寫入AT24WC01/02/04/08/16。

wKgZPGflNLeAOWBPAAGZJO9yGCc116.jpg

當前地址讀

AT24WC01/02/04/08/16 的地址計數(shù)器內(nèi)容為最后操作字節(jié)的地址加 1。也就是說 如果上次讀/寫的操作地址為 N,則立即讀的地址從地址 N+1 開始。如果 N=E(這里對 24WC01 E=127;對 24WC02 E=255;對 24WC04 E=511;對 24WC08 E=1023;對 24WC16 E=2047)則計數(shù)器將翻轉(zhuǎn)到 0 且繼續(xù)輸出數(shù)據(jù)。AT24WC01/02/04/08/16 接收到從器件地址信號后(R/W 位置 1),它首先發(fā)送一個應(yīng)答信號,然后發(fā)送一個 8 位字節(jié)數(shù)據(jù)。主器件不需發(fā)送一個應(yīng)答信號,但要產(chǎn)生一個停止信號。

wKgZO2flNLeAKXT8AAAyGjokSf0806.jpg

選擇讀(隨機讀)

選擇性讀操作允許主器件對寄存器的任意字節(jié)進行讀操作,主器件首先通過發(fā)送起始信號、從器件地址和它想讀取的字節(jié)數(shù)據(jù)的地址執(zhí)行一個偽寫操作。在 AT24WC01/02/04/08/16 應(yīng)答之后,主器件重新發(fā)送起始信號和從器件地址,此時 R/W 位置 1,AT24WC01/02/04/08/16 響應(yīng)并發(fā)送應(yīng)答信號,然后輸出所要求的一個 8 位字節(jié)數(shù)據(jù),主器件不發(fā)送應(yīng)答信號但產(chǎn)生一個停止信號。

wKgZPGflNLiAbyI9AAIJ27dFpAg401.jpg

連續(xù)讀

連續(xù)讀操作可通過立即讀或選擇性讀操作啟動。在 AT24WC01/02/04/08/16 發(fā)送完一個 8 位字節(jié)數(shù)據(jù)后,主器件產(chǎn)生一個應(yīng)答信號來響應(yīng),告知 AT24WC01/02/04/08/16 主器件要求更多的數(shù)據(jù),對應(yīng)每個主機產(chǎn)生的應(yīng)答信號 AT24WC01/02/04/08/16 將發(fā)送一個 8 位數(shù)據(jù)字節(jié)。當主器件不發(fā)送應(yīng)答信號而發(fā)送停止位時結(jié)束此操作。

從 AT24WC01/02/04/08/16 輸出的數(shù)據(jù)按順序由 N 到 N+1 輸出。讀操作時地址計數(shù)器在 AT24WC01/02/04/08/16 整個地址內(nèi)增加,這樣整個寄存器區(qū)域在可在一個讀操作內(nèi)全部讀出。當讀取的字節(jié)超過 E(對于 24WC01 E=127;對 24WC02 E=255; 對 24WC04 E=511;對 24WC08 E=1023;對 24WC16 E=2047)計數(shù)器將翻轉(zhuǎn)到零并繼續(xù)輸出數(shù)據(jù)字節(jié)。

wKgZPGflNLiAdSPEAAAfrClEXDA492.jpg

3.2引腳選擇

wKgZO2flNLmAVs3EAAE3TPEV49s996.jpg

模塊接線圖

3.3移植至工程

移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_at24c02.c與bsp_at24c02.h。這里不再過多講述,移植完成后面修改相關(guān)代碼。

在文件bsp_at24c02.c中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-25     LCKFB-LP    first version
 */

#include "bsp_at24c02.h"
#include "stdio.h"

// SLAVE ADDRESS+W為0xA0,SLAVE ADDRESS+R為0xA1
#define AT24C02_ADDRESS_READ                0xA0
#define AT24C02_ADDRESS_WRITE               0xA1


/******************************************************************
 * 函 數(shù) 名 稱:AT24C02_GPIO_Init
 * 函 數(shù) 說 明:AT24C02的引腳初始化
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void AT24C02_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體

    RCC_AT24C02_GPIO_ENABLE();        // 使能GPIO時鐘

    GPIO_InitStruct.Pins = GPIO_SDA|GPIO_SCL;   // GPIO引腳
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 開漏輸出
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;    // 輸出速度高
    GPIO_Init(PORT_AT24C02, &GPIO_InitStruct);  // 初始化
}


/******************************************************************
 * 函 數(shù) 名 稱:IIC_Start
 * 函 數(shù) 說 明:IIC起始時序
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void IIC_Start(void)
{
        SDA_OUT();

        SDA(1);
        delay_us(5);
        SCL(1);
        delay_us(5);

        SDA(0);
        delay_us(5);
        SCL(0);
        delay_us(5);

}
/******************************************************************
 * 函 數(shù) 名 稱:IIC_Stop
 * 函 數(shù) 說 明:IIC停止信號
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void IIC_Stop(void)
{
        SDA_OUT();
        SCL(0);
        SDA(0);

        SCL(1);
        delay_us(5);
        SDA(1);
        delay_us(5);

}

/******************************************************************
 * 函 數(shù) 名 稱:IIC_Send_Ack
 * 函 數(shù) 說 明:主機發(fā)送應(yīng)答或者非應(yīng)答信號
 * 函 數(shù) 形 參:0發(fā)送應(yīng)答  1發(fā)送非應(yīng)答
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void IIC_Send_Ack(unsigned char ack)
{
        SDA_OUT();
        SCL(0);
        SDA(0);
        delay_us(5);
        if(!ack) SDA(0);
        else     SDA(1);
        SCL(1);
        delay_us(5);
        SCL(0);
        SDA(1);
}


/******************************************************************
 * 函 數(shù) 名 稱:I2C_WaitAck
 * 函 數(shù) 說 明:等待從機應(yīng)答
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:0有應(yīng)答  1超時無應(yīng)答
 * 作       者:LC
 * 備       注:無
******************************************************************/
unsigned char I2C_WaitAck(void)
{

        char ack = 0;
        unsigned char ack_flag = 10;
        SCL(0);
        SDA(1);
        SDA_IN();
        delay_us(5);
        SCL(1);
    delay_us(5);

        while( (SDA_GET()==1) && ( ack_flag ) )
        {
                        ack_flag--;
                        delay_us(5);
        }

        if( ack_flag <= 0 )
        {
                        IIC_Stop();
                        return 1;
        }
        else
        {
                        SCL(0);
                        SDA_OUT();
        }
        return ack;
}

/******************************************************************
 * 函 數(shù) 名 稱:Send_Byte
 * 函 數(shù) 說 明:寫入一個字節(jié)
 * 函 數(shù) 形 參:dat要寫入的數(shù)據(jù)
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void Send_Byte(uint8_t dat)
{
    int i = 0;
    SDA_OUT();
    SCL(0);//拉低時鐘開始數(shù)據(jù)傳輸

    for( i = 0; i < 8; i++ )
    {
        SDA( (dat & 0x80) >> 7 );
        delay_us(1);
        SCL(1);
        delay_us(5);
        SCL(0);
        delay_us(5);
        dat

在文件bsp_at24c02.h中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-25     LCKFB-LP    first version
 */

#ifndef _BSP_AT24C02_H_
#define _BSP_AT24C02_H_

#include "board.h"


//端口移植
#define RCC_AT24C02_GPIO_ENABLE()   __RCC_GPIOB_CLK_ENABLE()
#define PORT_AT24C02                CW_GPIOB

#define GPIO_SDA                    GPIO_PIN_8
#define GPIO_SCL                    GPIO_PIN_9

//設(shè)置SDA輸出模式
#define SDA_OUT()   {        
                        GPIO_InitTypeDef GPIO_InitStruct;                
                        GPIO_InitStruct.Pins = GPIO_SDA;                 
                        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;      
                        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;         
                        GPIO_Init(PORT_AT24C02, &GPIO_InitStruct);       
                     }
//設(shè)置SDA輸入模式
#define SDA_IN()    {        
                        GPIO_InitTypeDef GPIO_InitStruct;                
                        GPIO_InitStruct.Pins = GPIO_SDA;                 
                        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;          
                        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;         
                        GPIO_Init(PORT_AT24C02, &GPIO_InitStruct);       
                    }
//獲取SDA引腳的電平變化
#define SDA_GET()       GPIO_ReadPin(PORT_AT24C02, GPIO_SDA)
//SDA與SCL輸出
#define SDA(x)          GPIO_WritePin(PORT_AT24C02, GPIO_SDA, (x?GPIO_Pin_SET:GPIO_Pin_RESET) )
#define SCL(x)          GPIO_WritePin(PORT_AT24C02, GPIO_SCL, (x?GPIO_Pin_SET:GPIO_Pin_RESET) )

void AT24C02_GPIO_Init(void);
void AT24C02_WriteByte(unsigned char WordAddress,unsigned char Data);
unsigned char AT24C02_ReadByte(unsigned char WordAddress);
#endif

四、移植驗證

在自己工程中的main主函數(shù)中,編寫如下。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-25     LCKFB-LP    first version
 */
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "bsp_at24c02.h"

int32_t main(void)
{
    unsigned char dat1 = 0;
    unsigned char dat2 = 0;

    board_init();
    uart1_init(115200U);

    AT24C02_GPIO_Init();
    printf("startrn");

    //向0地址寫入數(shù)據(jù)48
    AT24C02_WriteByte(0,48);
    delay_ms(5);

    //向8地址寫入數(shù)據(jù)48
    AT24C02_WriteByte(8,66);
    delay_ms(5);

    //從0地址讀取數(shù)據(jù)到dat1
    dat1 = AT24C02_ReadByte(0);
    delay_ms(5);
    //從8地址讀取數(shù)據(jù)到dat2
    dat2 = AT24C02_ReadByte(8);
    delay_ms(5);

    delay_ms(50);

    //輸出dat查看數(shù)據(jù)是否正確
    printf("dat1 = %drn",dat1);
    delay_ms(1);
    printf("dat2 = %drn",dat2);
    delay_ms(1);

    while(1)
    {

    }
}

移植現(xiàn)象:

向0地址寫入數(shù)據(jù)48,再讀出查看是否是48。

向8地址寫入數(shù)據(jù)66,再讀出查看是否是66。

wKgZPGflNLmAKYnfAACpeuHhoKs134.jpg

模塊移植成功案例代碼:

鏈接:https://pan.baidu.com/s/1vMkhtubSlSjCLW960FccxQ?pwd=LCKF

提取碼:LCKF

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

    關(guān)注

    38

    文章

    7637

    瀏覽量

    166540
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1083

    瀏覽量

    83344
  • 存儲芯片
    +關(guān)注

    關(guān)注

    11

    文章

    931

    瀏覽量

    43983
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    242

    瀏覽量

    1118
收藏 人收藏

    評論

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

    STM32基礎(chǔ)知識:IIC總線操作EEPROM存儲模塊AT24C02

    本文是IIC總線的實際應(yīng)用,將帶領(lǐng)讀者一步一步閱讀AT24C02數(shù)據(jù)手冊,看時序圖了解如何使用IIC接口EEPROM存儲模塊AT24C02,并編寫代碼使用STM32驅(qū)動這個
    的頭像 發(fā)表于 10-26 14:25 ?3061次閱讀
    STM32基礎(chǔ)知識:IIC總線操作<b class='flag-5'>EEPROM</b><b class='flag-5'>存儲模塊</b>AT<b class='flag-5'>24C02</b>

    單片機實例項目:AT24C02EEPROM存儲器

    單片機實例項目:AT24C02EEPROM存儲器,推薦下載!
    發(fā)表于 06-03 20:50

    TCL 2101C-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2101C-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-04 13:54 ?15次下載

    TCL 2108-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2108-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-04 14:08 ?5次下載

    TCL 2128B-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2128B-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-04 14:43 ?7次下載

    TCL 2129C-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2129C-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-04 14:49 ?18次下載

    TCL 2136A-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2136A-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-05 11:51 ?7次下載

    TCL 2136C-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2136C-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-05 11:53 ?11次下載

    TCL 2169A-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2169A-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-05 13:15 ?14次下載

    TCL 2169C-24C04(TCLM5C02)存儲器數(shù)據(jù)

    TCL 2169C-24C04(TCLM5C02)存儲器數(shù)據(jù)
    發(fā)表于 06-05 13:16 ?8次下載

    使用51單片機和EEPROM存儲器24C02保持保存實現(xiàn)流水燈的程序

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機和EEPROM存儲器24C02保持保存實現(xiàn)流水燈的程序。
    發(fā)表于 06-06 17:50 ?7次下載
    使用51單片機和<b class='flag-5'>EEPROM</b><b class='flag-5'>存儲器</b><b class='flag-5'>24C02</b>保持保存實現(xiàn)流水燈的程序

    使用51單片機進行EEPROM存儲器24C02讀取存儲多字節(jié)的程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機進行EEPROM存儲器24C02讀取存儲多字節(jié)的程序免費下載。
    發(fā)表于 06-05 17:51 ?18次下載
    使用51單片機進行<b class='flag-5'>EEPROM</b><b class='flag-5'>存儲器</b><b class='flag-5'>24C02</b>讀取<b class='flag-5'>存儲</b>多字節(jié)的程序免費下載

    使用EEPROM存儲器24C02記憶開機次數(shù)的代碼免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用EEPROM存儲器24C02記憶開機次數(shù)的代碼免費下載。
    發(fā)表于 08-26 17:31 ?25次下載
    使用<b class='flag-5'>EEPROM</b><b class='flag-5'>存儲器</b><b class='flag-5'>24C02</b>記憶開機次數(shù)的代碼免費下載

    EEPROM存儲芯片AT24C02芯片手冊

    EEPROM存儲芯片AT24C02芯片手冊(嵌入式開發(fā)培訓(xùn)需要學(xué)多久)-EEPROM存儲芯片AT24C0
    發(fā)表于 07-30 13:20 ?184次下載
    <b class='flag-5'>EEPROM</b><b class='flag-5'>存儲</b>芯片AT<b class='flag-5'>24C02</b>芯片手冊

    CW32單片機I2C接口讀寫EEPROM芯片介紹

    CW32單片機I2C接口讀寫EEPROM芯片介紹
    的頭像 發(fā)表于 11-09 17:42 ?1462次閱讀
    <b class='flag-5'>CW32</b>單片機I2<b class='flag-5'>C</b>接口讀寫<b class='flag-5'>EEPROM</b>芯片介紹
    主站蜘蛛池模板: 韩国美女丝袜一区二区 | 日本人六九视频69jzz免费 | 午夜精品视频在线观看 | 成人精品视频在线观看播放 | 色偷偷人人 | 成人在线a | 久久在草 | 国产一级特黄全黄毛片 | 午夜性视频播放免费视频 | 久久精品免费观看 | 色综合一区 | 黄色免费小视频 | 首页 亚洲 欧美 制服 丝腿 | 999影院成 人在线影院 | 狠狠叉| 国产精品青草久久 | 色丁香影院 | 狠狠色96视频 | 爱爱视频天天干 | 亚洲人成网i8禁止 | 欧美成人午夜精品一区二区 | 免费视频国产 | 国产在线视频欧美亚综合 | 最好看的2019中文字幕免费高清 | 国产精品久久久久久久久ktv | 美女黄18以下禁止观看 | 国产精品麻豆va在线播放 | 婷婷六月丁香色婷婷网 | 欧美色婷婷天堂网站 | 久色国产 | 国产片无遮挡在线看床戏 | 中文字幕一二三区 | 在线免费色视频 | 久久精品国产精品亚洲红杏 | 欧美区一区| 狠狠色丁香久久婷婷 | 久久丁香视频 | 88av影院| 欧美午夜大片 | 91色视 | 色wwwwww |