日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年01月09日(星期四)

正在發(fā)生

2019年01月09日 | IIC專題(二)——STM32驅(qū)動(dòng)AT24C02

發(fā)布者:幸福家園 來(lái)源: eefocus關(guān)鍵字:IIC  STM32  驅(qū)動(dòng)AT24C02 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

1.概述


MiniSTM32 開(kāi)發(fā)板板載的 EEPROM 芯片型號(hào)為 24C02。該芯片的總?cè)萘渴?256個(gè)字節(jié),該芯片通過(guò) IIC 總線與外部連接。這里直接采用原子板上的 AT24C02 ,主要是軟件編程方面的學(xué)習(xí)。


2.硬件連接


這里寫(xiě)圖片描述


A2、A1、A0 三個(gè)引腳直接接地。供電: (VCC = 2.7V to 5.5V)


器件地址設(shè)置:


這里寫(xiě)圖片描述


對(duì)于AT24C02:Addr—>0xA0(寫(xiě))/ 0xA1(讀)。


單字節(jié)寫(xiě)入:


這里寫(xiě)圖片描述


按頁(yè)寫(xiě)入:


這里寫(xiě)圖片描述


從當(dāng)前地址讀出數(shù)據(jù);


這里寫(xiě)圖片描述


隨機(jī)讀?。?/p>


這里寫(xiě)圖片描述


順序讀出:


這里寫(xiě)圖片描述


3.例程分析


(一)IIC 部分實(shí)現(xiàn)代碼


包括 IIC 的初始化(IO 口)、 IIC 開(kāi)始、 IIC 結(jié)束、 ACK、 IIC 讀寫(xiě)等功能,在其他函數(shù)里面,只需要調(diào)用相關(guān)的 IIC 函數(shù)就可以和外部 IIC 器件通信了,這里并不局限于 24C02,該段代碼可以用在任何 IIC 設(shè)備上。


IIC_SCL 和 IIC_SDA 分別連在 STM32 的 PC12 和 PC11。


1.IIC 初始化

//IO操作函數(shù)     

#define IIC_SCL    PCout(12) //SCL

#define IIC_SDA    PCout(11) //SDA   

#define READ_SDA   PCin(11)  //輸入SDA


//初始化 IIC

void IIC_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽輸出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure);


    IIC_SCL=1;

    IIC_SDA=1;

}


2.產(chǎn)生 IIC 開(kāi)始信號(hào)

//產(chǎn)生 IIC 起始信號(hào)

void IIC_Start(void)

{

    SDA_OUT(); //sda 線輸出


    IIC_SDA=1;

    IIC_SCL=1;


    delay_us(4);


    IIC_SDA=0;//START:when CLK is high,DATA change form high to low


    delay_us(4);


    IIC_SCL=0;//鉗住 I2C 總線, 準(zhǔn)備發(fā)送或接收數(shù)據(jù)

}


3.產(chǎn)生停止IIC信號(hào)

//產(chǎn)生 IIC 停止信號(hào)

void IIC_Stop(void)

{

    SDA_OUT();//sda 線輸出


    IIC_SCL=0;

    IIC_SDA=0;//STOP:when CLK is high , DATA change form low to high

    delay_us(4);


    IIC_SCL=1;


    IIC_SDA=1;//發(fā)送 I2C 總線結(jié)束信號(hào)

    delay_us(4);

}


4.等待應(yīng)答信號(hào)

//等待應(yīng)答信號(hào)到來(lái)

//返回值: 1,接收應(yīng)答失敗

// 0,接收應(yīng)答成功

u8 IIC_Wait_Ack(void)

{

    u8 ucErrTime=0;


    SDA_IN(); //SDA 設(shè)置為輸入


    IIC_SDA=1;

    delay_us(1);

    IIC_SCL=1;

    delay_us(1);


    while(READ_SDA)

    {

    ucErrTime++;

    if(ucErrTime>250)

    {

    IIC_Stop();

    return 1;

    }

    }

    IIC_SCL=0;//時(shí)鐘輸出 0

    return 0;

}



5.應(yīng)答信號(hào)

//產(chǎn)生 ACK 應(yīng)答

void IIC_Ack(void)

{

    IIC_SCL=0;


    SDA_OUT();


    IIC_SDA=0;

    delay_us(2);


    IIC_SCL=1;


    delay_us(2);

    IIC_SCL=0;

}


6.不產(chǎn)生應(yīng)答

//不產(chǎn)生 ACK 應(yīng)答

void IIC_NAck(void)

{

    IIC_SCL=0;

    SDA_OUT();


    IIC_SDA=1;


    delay_us(2);

    IIC_SCL=1;

    delay_us(2);

    IIC_SCL=0;

}


7.IIC發(fā)送一個(gè)字節(jié)

//IIC 發(fā)送一個(gè)字節(jié)

//返回從機(jī)有無(wú)應(yīng)答

//1,有應(yīng)答

//0,無(wú)應(yīng)答

void IIC_Send_Byte(u8 txd)

{

    u8 t;


    SDA_OUT();


    IIC_SCL=0;//拉低時(shí)鐘開(kāi)始數(shù)據(jù)傳輸


    for(t=0;t<8;t++)

    {

        IIC_SDA=(txd&0x80)>>7;//高位開(kāi)始,一位一位的傳數(shù)據(jù)

        txd<<=1;

        delay_us(2); //對(duì) TEA5767 這三個(gè)延時(shí)都是必須的

        IIC_SCL=1;  //保持?jǐn)?shù)據(jù)的穩(wěn)定

        delay_us(2);

        IIC_SCL=0;   //下一位數(shù)據(jù)傳輸開(kāi)始

        delay_us(2);

    }

}


8.IIC讀一個(gè)字節(jié)

//讀 1 個(gè)字節(jié), ack=1 時(shí),發(fā)送 ACK, ack=0,發(fā)送 nACK

u8 IIC_Read_Byte(unsigned char ack)

{

    unsigned char i,receive=0;


    SDA_IN();//SDA 設(shè)置為輸入


    for(i=0;i<8;i++ )

    {

        IIC_SCL=0;

        delay_us(2);

        IIC_SCL=1;

        receive<<=1;

        if(READ_SDA)

            receive++;

        delay_us(1);

    }

    if (!ack)

    IIC_NAck();//發(fā)送 nACK

    else

    IIC_Ack(); //發(fā)送 ACK

    return receive;

}



(二)AT24C02 操作

直接通過(guò)寄存器操作設(shè)置 IO 口的模式為輸入還是輸出,代碼如下:


#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}


#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}  


1.初始化 IIC 接口

//初始化 IIC 接口

void AT24CXX_Init(void)

{

    IIC_Init();

}


2.在 AT24CXX 指定地址讀出一個(gè)數(shù)據(jù)

//在 AT24CXX 指定地址讀出一個(gè)數(shù)據(jù)

//ReadAddr:開(kāi)始讀數(shù)的地址,24C02大小為2Kbit;ADDR:0x00---0x7FF

//返回值 :讀到的數(shù)據(jù)


u8 AT24CXX_ReadOneByte(u16 ReadAddr)

{

    u8 temp=0;


    IIC_Start();

    if(EE_TYPE>AT24C16)

    /*宏定義有個(gè)選擇芯片類型的,如果這個(gè)定義大于AT24C16的話就發(fā)送兩個(gè)8bit地址,否則就發(fā)送一個(gè)8bit地址*/

    {

    IIC_Send_Byte(0XA0); //發(fā)送寫(xiě)命令,0XA0:器件的地址,7位地址+寫(xiě)(0)

    IIC_Wait_Ack();

    IIC_Send_Byte(ReadAddr>>8);//發(fā)送高地址

    }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //發(fā)送器件地址 0XA0,寫(xiě)數(shù)據(jù)

    IIC_Wait_Ack();

    IIC_Send_Byte(ReadAddr%256); //發(fā)送低地址

    IIC_Wait_Ack();

    IIC_Start();

    IIC_Send_Byte(0XA1); //進(jìn)入接收模式,7位地址+讀(1)

    IIC_Wait_Ack();

    temp=IIC_Read_Byte(0);

    IIC_Stop();//產(chǎn)生一個(gè)停止條件

    return temp;

}


3.在 AT24CXX 指定地址寫(xiě)入一個(gè)數(shù)據(jù)

//在 AT24CXX 指定地址寫(xiě)入一個(gè)數(shù)據(jù)

//WriteAddr :寫(xiě)入數(shù)據(jù)的目的地址

//DataToWrite:要寫(xiě)入的數(shù)據(jù)


void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)

{

    IIC_Start();

    if(EE_TYPE>AT24C16)

    {

    IIC_Send_Byte(0XA0); //發(fā)送寫(xiě)命令

    IIC_Wait_Ack();

    IIC_Send_Byte(WriteAddr>>8);//發(fā)送高地址

    }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //發(fā)送器件地址 0XA0,寫(xiě)數(shù)據(jù)

    IIC_Wait_Ack();

    IIC_Send_Byte(WriteAddr%256); //發(fā)送低地址

    IIC_Wait_Ack();

    IIC_Send_Byte(DataToWrite); //發(fā)送字節(jié)

    IIC_Wait_Ack();

    IIC_Stop(); //產(chǎn)生一個(gè)停止條件

    delay_ms(10); //對(duì)于 EEPROM 器件,每寫(xiě)一次要等待一段時(shí)間,否則寫(xiě)失??!

}


4.AT24CXX 里面的指定地址開(kāi)始寫(xiě)入長(zhǎng)度為 Len 的數(shù)據(jù)

//在 AT24CXX 里面的指定地址開(kāi)始寫(xiě)入長(zhǎng)度為 Len 的數(shù)據(jù)

//該函數(shù)用于寫(xiě)入 16bit 或者 32bit 的數(shù)據(jù).

//WriteAddr :開(kāi)始寫(xiě)入的地址

//DataToWrite:數(shù)據(jù)數(shù)組首地址

//Len :要寫(xiě)入數(shù)據(jù)的長(zhǎng)度 2,4


void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)

{

    u8 t;

    for(t=0;t

        AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);

}


5.AT24CXX 里面的指定地址開(kāi)始讀出長(zhǎng)度為 Len 的數(shù)據(jù)

//在 AT24CXX 里面的指定地址開(kāi)始讀出長(zhǎng)度為 Len 的數(shù)據(jù)

//該函數(shù)用于讀出 16bit 或者 32bit 的數(shù)據(jù).

//ReadAddr :開(kāi)始讀出的地址

//返回值 :數(shù)據(jù)

//Len :要讀出數(shù)據(jù)的長(zhǎng)度 2,4


u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)

{

    u8 t; u32 temp=0;

    for(t=0;t

    {

        temp<<=8;

        temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);

    }

    return temp;

}


6.檢查 AT24CXX 是否正常

//檢查 AT24CXX 是否正常

//這里用了 24XX 的最后一個(gè)地址(255)來(lái)存儲(chǔ)標(biāo)志字.

//如果用其他 24C 系列,這個(gè)地址要修改

//返回 1:檢測(cè)失敗

//返回 0:檢測(cè)成功

u8 AT24CXX_Check(void)

{

    u8 temp;

    temp=AT24CXX_ReadOneByte(255);//避免每次開(kāi)機(jī)都寫(xiě) AT24CXX

    if(temp==0X55)

        return 0;

    else//排除第一次初始化的情況

    {

        AT24CXX_WriteOneByte(255,0X55);

        temp=AT24CXX_ReadOneByte(255);

        if(temp==0X55)

            return 0;

    }

    return 1;

}


7.AT24CXX 里面的指定地址開(kāi)始讀出指定個(gè)數(shù)的數(shù)據(jù)

/在 AT24CXX 里面的指定地址開(kāi)始讀出指定個(gè)數(shù)的數(shù)據(jù)

//ReadAddr :開(kāi)始讀出的地址 對(duì) 24c02 為 0~255

//pBuffer :數(shù)據(jù)數(shù)組首地址

//NumToRead:要讀出數(shù)據(jù)的個(gè)數(shù)


void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)

{

    while(NumToRead)

    {

        *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);

        NumToRead--;

    }

}


8.AT24CXX 里面的指定地址開(kāi)始寫(xiě)入指定個(gè)數(shù)的數(shù)據(jù)

//在 AT24CXX 里面的指定地址開(kāi)始寫(xiě)入指定個(gè)數(shù)的數(shù)據(jù)

//WriteAddr :開(kāi)始寫(xiě)入的地址 對(duì) 24c02 為 0~255

//pBuffer :數(shù)據(jù)數(shù)組首地址

//NumToWrite:要寫(xiě)入數(shù)據(jù)的個(gè)數(shù)


void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)

{

    while(NumToWrite--)

    {

        AT24CXX_WriteOneByte(WriteAddr,*pBuffer);

        WriteAddr++;

        pBuffer++;

    }

}


參考:

1.原子 STM32 開(kāi)發(fā)庫(kù)函數(shù)版本


關(guān)鍵字:IIC  STM32  驅(qū)動(dòng)AT24C02 引用地址:IIC專題(二)——STM32驅(qū)動(dòng)AT24C02

上一篇:SPI專題(二)——STM32驅(qū)動(dòng)FLASH(W25Q64)
下一篇:STM32學(xué)習(xí)筆記一一ADC

推薦閱讀

有十家筆者認(rèn)為值得在2018年度持續(xù)觀察的物聯(lián)網(wǎng)相關(guān)廠商,可做為整體物聯(lián)網(wǎng)市場(chǎng)或其中某些策略應(yīng)用的趨勢(shì)參考。應(yīng)用范圍廣闊的物聯(lián)網(wǎng)(IoT)幾乎涵蓋了每一家公司的業(yè)務(wù),無(wú)論它們是否為科技廠商;以下的十家廠商是筆者認(rèn)為值得在2018年度持續(xù)觀察的物聯(lián)網(wǎng)相關(guān)廠商,可做為整體物聯(lián)網(wǎng)市場(chǎng)或其中某些策略應(yīng)用的趨勢(shì)參考。通用電氣(General Electric,GE)在19...
芯科技消息(文/方中同)根據(jù) SEMI 國(guó)際半導(dǎo)體產(chǎn)業(yè)協(xié)會(huì)公布的“2018年中國(guó)半導(dǎo)體硅晶圓展望”(2018 China Semiconductor Silicon Wafer Outlook) 報(bào)告指出,預(yù)計(jì)2020年,中國(guó)大陸晶圓廠裝機(jī)產(chǎn)能將達(dá)到每月400萬(wàn)片(WPM) 八英寸約當(dāng)晶圓,和2015年的230萬(wàn)片相比年復(fù)合增長(zhǎng)率(CAGR)為12%,增長(zhǎng)速度遠(yuǎn)高過(guò)所有其他地區(qū)。SEMI表示,在致力打造一個(gè)強(qiáng)大且自...
很多看熱鬧不嫌事大的吃瓜群眾做夢(mèng)都沒(méi)有想到那個(gè)要讓小米顫抖且在2018年連續(xù)懟了對(duì)方一年的常程居然加入了小米,而且還是在官宣離開(kāi)聯(lián)想兩天后作出的驚人之舉,有趣的是,常程不是第一個(gè)加入小米的手機(jī)廠商高管,我們具體來(lái)盤(pán)點(diǎn)一下:1、苗雷職位:前努比亞品牌聯(lián)合創(chuàng)始人,現(xiàn)小米相機(jī)部總監(jiān)由于苗雷在微博上不夠活躍,導(dǎo)致他在網(wǎng)友的心中知名度不高,他...
近日,《中共南京市委關(guān)于制定南京市國(guó)民經(jīng)濟(jì)和社會(huì)發(fā)展第十四個(gè)五年規(guī)劃和二〇三五年遠(yuǎn)景目標(biāo)的建議》(以下簡(jiǎn)稱《規(guī)劃建議》)發(fā)布?!兑?guī)劃建議》提出,南京將推動(dòng)產(chǎn)業(yè)集群化高端化發(fā)展,加快建設(shè)現(xiàn)代產(chǎn)業(yè)體系。南京將構(gòu)建特色創(chuàng)新產(chǎn)業(yè)集群。實(shí)施重點(diǎn)產(chǎn)業(yè)鏈“125”突破行動(dòng),推動(dòng)軟件和信息服務(wù)產(chǎn)業(yè)規(guī)模超萬(wàn)億,新醫(yī)藥與生命健康、人工智能兩大產(chǎn)業(yè)規(guī)模...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved