娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月02日(星期一)

2018年06月02日 | stm32cubemx I2C讀取AT24C16

發(fā)布者:CyberJolt 來源: eefocus關鍵字:stm32  I2C  讀取AT24C16 手機看文章 掃描二維碼
隨時隨地手機看文章

本文對如何使用stm32cube生成I2C工程不作說明,僅對在對AT24Cxx系列的使用時作出易忽略的說明;

1、at24cxx頁面結構:

從該圖可以看出16K(bit)共有128個頁,每頁由16byte構成。16k = 128 * 16 * 8;

特別注意:除at24c01和at24c02的頁由8個byte構成,其它的都是由16byte構成。(這關系到對芯片的連續(xù)讀寫)

2.at24cxx的設備地址:

A:作為設備地址的一部分;P:作為頁地址的一部分;

對于大多數(shù)人來說都知道I2c設備具有一個設備地址,并且在一條總線上是唯一。若要在一個I2C總線上掛多個AT24CXX系列芯片,則需要A2,A1,A0作為設備地址的一部分,設備地址的最低位作為是讀(1)寫(0)。

對于在一條總線掛載的設備數(shù):看有幾個位用作設備地址。


例:AT24C04: 有兩位用作設備地址(A2,A1),一位用作頁地址(P0).則可掛載的設備數(shù)為2^2 = 4個。

       AT24C16:沒有用作設備地址的位,三位用作頁地址(P0,P1,P2)。則僅可掛載設備數(shù)為2^0= 1個。


可能有人會考慮若A0,A1,A2用作地址了,那實際硬件接線該怎么接呢?

直接按照AT24C02的接就OK了.都接地。

3、頁面連續(xù)讀寫:

注意:連續(xù)寫并不是可以一直連續(xù)的寫N個數(shù)據(jù),而是寫一頁的數(shù)據(jù)(AT24C02只能連續(xù)寫8byte的數(shù)據(jù),其它的可以連續(xù)寫16byte的數(shù)據(jù)。);

當從某個地址連續(xù)寫多個數(shù)據(jù)時,要確定這個地址在某一頁的偏移量,從而確定該頁中最多還可以連續(xù)寫多少byte數(shù)據(jù)。

以AT24C16為例;

比如在0x0025讀寫,則該位置的偏移量為:0x0025 & 0x000FF = 0x0005, 即該頁還可以寫  = 每頁的字節(jié)數(shù) - 偏移量 = 0x0F - 0x05  = 0x0A 即在該頁還可以連續(xù)寫10byte數(shù)據(jù);

4、地址問題:

由于在傳輸過程中,地址數(shù)據(jù)是一個8位的地址,只能按該8位地址尋址的數(shù)據(jù)有2^8=256byte數(shù)據(jù),

對于容量大于256byte容量的設備,我們還有設備ID中的頁地址位可以使用。

例:以AT24C16為例 :

比如我們要訪問(寫)第0x0456的這一byte數(shù)據(jù)0x55:

(1)、開始信號:

(2)、設備號(高4位為:1101 p p p r/w), 此時設備號應設置為:0xA4;

(3)、地址:0x56;

(4)、數(shù)據(jù):0x55;

(5)、結束;

5、時間控制:


每完成一次寫操作后要進行一定的延時,讓芯片去處理數(shù)據(jù);從該圖看,保險的時間為5ms.


例子:

#include "at24c16.h"  

#include "i2c.h"  

  

#define E2PROM_SIZE 0x0800    //2k byte 16bit  

#define E2PROM_BASE_ID    0xA0  

  

#define E2PROM_WRITE 0x00  

#define E2PROM_READ     0x01  

  

#define E2PROM_BASE_WID E2PROM_BASE_ID + E2PROM_WRITE  

#define E2PROM_BASE_RID E2PROM_BASE_ID + E2PROM_READ  

  

#define E2PROM_PAGE_MASK    0x000F  

uint8_t writeAT24C16(uint16_t addr, uint8_t *data, uint16_t len)  

{  

    uint8_t wNum = 0;  

    uint16_t lenLeft = len;  

    uint8_t deviceId ;  

    uint8_t *p = data;  

      

    /*is the address overfolw*/  

    if(addr + len >= E2PROM_SIZE)  

        return 1;  

      

    /*calculate the current write position to know how many word can write continully*/  

    wNum = 16 - addr & E2PROM_PAGE_MASK;  

    if(wNum == 0)  

        wNum = 16;  

    wNum = lenLeft>=wNum ? wNum : lenLeft;  

      

    /*transmit the date to e2prom*/  

    while(lenLeft)  

    {  

        /*calculate the device id*/  

        deviceId = (addr >> 8)<=0 ?  E2PROM_BASE_WID : (E2PROM_BASE_WID | (uint8_t)((addr>>7)&0x0E));  

          

        if( HAL_I2C_Mem_Write(&hi2c1, deviceId, addr&0x00FF,   

                              I2C_MEMADD_SIZE_8BIT, p, wNum, 0x20) != HAL_OK)  

        {  

            printf("I2S Write error!\r\n");  

            HAL_Delay(5);  

            continue;  

        }              

        addr += wNum;  

        lenLeft -= wNum;  

        p += wNum;  

        wNum = lenLeft > 16 ? 16 : lenLeft;      

  

        HAL_Delay(5);  

    }  

      

    return HAL_OK;  

}  

  

uint8_t readAT24C16(uint16_t addr, uint8_t *data, uint16_t len)  

{  

    uint8_t rNum = 0;  

    uint16_t lenLeft = len;  

    uint8_t deviceId ;  

    uint8_t *p = data;  

  

    /*is the address overfolw*/  

    if(addr + len >= E2PROM_SIZE)  

        return 1;  

      

    /*calculate the current write position to know how many word can write continully*/  

    rNum = 16 - addr & E2PROM_PAGE_MASK;  

    if(rNum == 0)  

        rNum = 16;  

    rNum = lenLeft>=rNum ? rNum : lenLeft;  

      

    /*transmit the date to e2prom*/      

    while(lenLeft)  

    {  

        /*calculate the device id*/  

        deviceId = (addr >> 8)<=0 ?  E2PROM_BASE_RID : (E2PROM_BASE_RID | (uint8_t)((addr>>7)&0x0E));  

          

        if( HAL_I2C_Mem_Read(&hi2c1, deviceId, addr&0x00FF,   

                            I2C_MEMADD_SIZE_8BIT, p, rNum, 20) != HAL_OK)  

        {  

            printf("I2S Read error!\r\n");  

            continue;  

        }              

        addr += rNum;  

        lenLeft -= rNum;  

        p += rNum;  

        rNum = lenLeft > 16 ? 16 : lenLeft;      

    }  

      

    return HAL_OK;      

}  

  

  

void vE2romTest()  

{  

    uint8_t WriteBuffer[BufferSize],ReadBuffer[BufferSize];  

    uint16_t i;  

    printf("\r\n***************I2C Example*******************************\r\n");  

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

            WriteBuffer[i]=i;    /* WriteBuffer init */  

    /* wrinte date to EEPROM */  

    if(!writeAT24C16(0x05,WriteBuffer,BufferSize))  

            printf("\r\n EEPROM 24C16 Write Test OK \r\n");  

    else  

            printf("\r\n EEPROM 24C16 Write Test False \r\n");  

      

    /* read date from EEPROM */  

    readAT24C16(0x05,ReadBuffer, BufferSize);  

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

            printf("0x%02X  ",ReadBuffer[i]);  

  

    if(memcmp(WriteBuffer,ReadBuffer,BufferSize) == 0 ) /* check date */  

            printf("\r\n EEPROM 24C16 Read Test OK\r\n");  

    else  

            printf("\r\n EEPROM 24C16 Read Test False\r\n");  

}  

測試結果:


關鍵字:stm32  I2C  讀取AT24C16 引用地址:stm32cubemx I2C讀取AT24C16

上一篇:STM32-USB虛擬串口-學習筆記
下一篇:關于STM32的HAL庫硬件I2C簡單調(diào)試

推薦閱讀

? ?Find 7發(fā)布之后,OPPO Find系列再也沒有了聲音,作為OPPO旗下的真旗艦手機,不管是設計還是“堆硬件”的配置,F(xiàn)ind系列一直都被媒體和粉絲們“譽不絕口”。  在這四年的時間里,陸陸續(xù)續(xù)有傳出Find 9、Find 11的消息,但是最后都被OPPO無聲否決。  那么,F(xiàn)ind系列真的消失了嗎?  答案是并沒有!而且!Find王者回歸了!  6月1日,IT之家...
隨著5G時代的即將到來,越來越多的企業(yè)開始著手布局5G,而智能汽車作為5G時代中重要的一環(huán),可以說在未來很有可能會改變我們的生活。  近日,華為內(nèi)部由任正非親自簽發(fā)組織變動文件,華為成立智能汽車解決方案業(yè)務部,歸ICT管理委員會直管。任命了此前華為無線網(wǎng)絡業(yè)務部和日本運營商業(yè)務部總裁王軍為智能汽車解決方案業(yè)務部的總裁。  華為智能汽車解...
此前美方宣布全面斷供華為芯片,凡是使用美技術和設備的芯片廠商,都不能接受華為及其子公司海思的訂單。美商務部考慮到該措施會給晶圓代工廠帶來巨大經(jīng)濟影響,因此給予120天的緩沖期,以降低該規(guī)定變更帶來的沖擊。 如今“緩沖期”已過,臺積電在取得美國政府許可前將無法為華為海思制造芯片,華為已開始同聯(lián)發(fā)科、紫光展銳商討,以擴大芯片的采購,維持...
記者從工信部網(wǎng)站獲悉,6月1日,工信部發(fā)布《工業(yè)互聯(lián)網(wǎng)和物聯(lián)網(wǎng)無線電頻率使用指南(2021年版)》(以下簡稱《指南》),以引導用戶根據(jù)應用場景的特點,選擇適合的無線電通信技術,提高工業(yè)應用與頻率資源適配性,有效提升頻率資源利用效率和效益;同時,通過規(guī)范頻率使用和臺(站)設置,降低無線電有害干擾風險,保障相關無線通信系統(tǒng)安全穩(wěn)定運行和工...

史海拾趣

小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 弥勒县| 彩票| 杭锦后旗| 深水埗区| 嘉义市| 新津县| 武义县| 富宁县| 朝阳区| 新民市| 炉霍县| 新巴尔虎左旗| 张家口市| 扬中市| 新兴县| 辽中县| 白城市| 江门市| 东光县| 张家港市| 咸丰县| 周至县| 定兴县| 永安市| 武鸣县| 嵩明县| 文化| 吉木萨尔县| 迁安市| 黑龙江省| 滕州市| 宁陵县| 东乌珠穆沁旗| 海门市| 天台县| 彩票| 留坝县| 阆中市| 津市市| 靖宇县| 酒泉市|