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

歷史上的今天

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

2018年06月02日 | STM32F030 硬件I2C驅(qū)動 AT24C16

發(fā)布者:InspiredDreamer 來源: eefocus關鍵字:STM32F030  硬件I2C  驅(qū)動  AT24C16 手機看文章 掃描二維碼
隨時隨地手機看文章

I2C 的配置


static void InitI2C()

{

  I2C_InitTypeDef I2C_InitStructure;

  GPIO_InitTypeDef GPIO_InitA;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);//使能I2C1,I2C2的時鐘

  RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);//時鐘源設定

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_1);  //配置PB8 成第二功能引腳 I2C1_SCL

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_1);  //配置PB9 成第二功能引腳 I2C1_SDA

  GPIO_InitA.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;

  GPIO_InitA.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitA.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitA.GPIO_OType = GPIO_OType_PP;

  GPIO_InitA.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_Init(GPIOB, &GPIO_InitA);

  I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost;

  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;

  I2C_InitStructure.I2C_DigitalFilter = 0x01;

  I2C_InitStructure.I2C_OwnAddress1 = 0x00;

  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

  I2C_InitStructure.I2C_Timing = 0x0090174F;

  I2C_Init(I2C1, &I2C_InitStructure);

  I2C_Cmd(I2C1, ENABLE);

}


一樣的配置方案,I2C_Timing的意思請移步本博客GY30那篇文章。 

I2C引腳為PB8 與PB9(使用的C8T6,f4p6可以用PA的)


#define AT24C16_Base_Address 0xA0

void AT24C16_WriteByte(uint8_t Page,uint8_t WordAddress,uint8_t Data);

uint8_t AT24C16_ReadByte(uint8_t Page,uint8_t WordAddress);

void AT24C16_PageWrite(uint8_t Page,uint8_t WordAddress,uint8_t Length,uint8_t* Data);

void AT24C16_SequentialRead(uint8_t Page,uint8_t WordAddress, uint8_t length , uint8_t* p);


下面是相關函數(shù):


void AT24C16_WriteByte(uint8_t Page,uint8_t WordAddress,uint8_t Data)

{

    if(WordAddress > 0x10)

    {

        return;

    }

    WordAddress |= ( Page & 0x0F ) << 4;

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);//IF BUSY

    I2C_TransferHandling(I2C1,AT24C16_Base_Address | ( ( Page & 0xF0 ) >> 3 ),2,I2C_AutoEnd_Mode,I2C_Generate_Start_Write);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK

    I2C_SendData(I2C1,WordAddress);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK

    I2C_SendData(I2C1,Data);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);

}

uint8_t AT24C16_ReadByte(uint8_t Page,uint8_t WordAddress)

{

    uint8_t Recev = 0x00;

    if(WordAddress > 0x10)

    {

        return 0;

    }

    WordAddress |= ( Page & 0x0F ) << 4;

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);//IF BUSY

    I2C_TransferHandling(I2C1,AT24C16_Base_Address | ( ( Page & 0xF0 ) >> 3 ),1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK

    I2C_SendData(I2C1,WordAddress);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET);

    I2C_TransferHandling(I2C1,AT24C16_Base_Address | ( ( Page & 0xF0 ) >> 3 ),1,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET);

    Recev = I2C_ReceiveData(I2C1);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);

    return Recev;

}


下面是頁讀取,頁寫入:


void AT24C16_PageWrite(uint8_t Page,uint8_t WordAddress,uint8_t Length,uint8_t* Data)

{

    uint8_t i = 0;

    if(WordAddress > 0x10)

    {

        return;

    }

    WordAddress |= ( Page & 0x0F ) << 4;

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);//IF BUSY

    I2C_TransferHandling(I2C1,AT24C16_Base_Address | ( ( Page & 0xF0 ) >> 3 ),Length + 1,I2C_AutoEnd_Mode,I2C_Generate_Start_Write);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK

    I2C_SendData(I2C1,WordAddress);

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

    {

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK

        I2C_SendData(I2C1,Data[i]);

    }

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);

}

void AT24C16_SequentialRead(uint8_t Page,uint8_t WordAddress, uint8_t length , uint8_t* p)

{

    uint8_t i;

    if(WordAddress > 0x10)

    {

        return;

    }

    WordAddress |= ( Page & 0x0F ) << 4;

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);//IF BUSY

    I2C_TransferHandling(I2C1,AT24C16_Base_Address | ( ( Page & 0xF0 ) >> 3 ),1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK

    I2C_SendData(I2C1,WordAddress);

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET);

    I2C_TransferHandling(I2C1,AT24C16_Base_Address | ( ( Page & 0xF0 ) >> 3 ),length,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);

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

    {

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET);

        p[i] = I2C_ReceiveData(I2C1);

    }

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);

}


感覺沒什么說的,GY30那篇文章基本都說完了,添點小知識點吧。


I2C_AutoEnd_Mode,顧名思義,操作length字節(jié)后自動添加STOP。 

I2C_SoftEnd_Mode ,同樣顧名思義,操作length字節(jié)后需要手動添加STOP。( I2C_GenerateSTOP() ) 

這個模式比自動多了一步,需要 I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) ,Translate Completed,是否傳輸完成,自動模式下訪問這個會得到Reset值,然而手動模式下需要訪問他,然后生成Stop。


然后……差不多了吧?舉個 上面網(wǎng)址的例子吧,我覺得很多人不會看……


所以在編寫程序對AT24C16第100頁的第3個字節(jié)進行寫數(shù)據(jù)的時候,步驟如下: 

1)發(fā)送起始信號; 

2)發(fā)送器件地址0XA6(1010 0110,1010是固定地址,011是頁地址的高三位,0表示寫操作); 

3)發(fā)送操作地址0X43(0100 0011,0100是頁地址的低四位,0011是頁地址偏移量,即第100頁內(nèi)的第三個字節(jié), 

4)發(fā)送要寫的數(shù)據(jù), 

5)發(fā)送終止信號。

我相信各位最起碼都看了AT24C16的地址了,0xA0。(再次引用暢學電子網(wǎng)的圖片) 

這里寫圖片描述

P0P1P2為頁地址高三位,發(fā)送的字地址(WordAddress)高四位為頁地址的第四位,低四位為字地址。 

AT24C16有128頁,每頁16bytes。所以正好匹配上。 

寫的間隔至少為5ms,否則用循環(huán)等待的話I2C會卡死。


以上。 

另:代碼我測試是通過的,若有Bug歡迎指出。


關鍵字:STM32F030  硬件I2C  驅(qū)動  AT24C16 引用地址:STM32F030 硬件I2C驅(qū)動 AT24C16

上一篇:EEPROM(AT24C16)頁寫算法
下一篇:最后一頁

推薦閱讀

近日有外媒曝光了iPhone SE2的草稿圖,從曝光的圖片來看,iPhone SE2也采用了劉海屏設計,但外觀不會采用大圓角設計。報道稱,曝光的圖片來自來自德高貝登廣告公司,是蘋果批準的草稿,所以可信度很高。據(jù)悉,iPhone SE2可能加入了無線充電功能,會同自家的AirPower無線充電板一同發(fā)售。售價方面可能會超過4000元。蘋果已經(jīng)發(fā)出了2018年WWDC大會邀請函...
相較于服務機器人,工業(yè)機器人更能在研發(fā)、制造上體現(xiàn) “中國智造”的競爭力。但由于工業(yè)機器人產(chǎn)業(yè)存在一系列需要攻克的“隘口”:激烈的國際競爭、較長的研發(fā)周期、較高的技術及資金門檻、非標準的落地場景、模糊的市場爆發(fā)前景等。使得其從技術到市場的路徑顯得并非那么清晰,與資本市場上一個投資周期中追求 “短平快”的激進打法適配度較低。 20...
IT之家6月1日消息 Beats by Dr。 Dre(Beats)今天正式推出Powerbeats Pro真無線耳機的四款全新配色:活力黃、云彩粉、熔巖紅及冰川藍。 IT之家了解到,Powerbeats Pro可提供給用戶最長可達9小時的聆聽時間 (使用充電盒時可達24小時以上),得益于Fast Fuel閃充技術的加持,Powerbeats Pro充電5分鐘即可持續(xù)播放1.5小時。同時...
目前,顯示屏按數(shù)據(jù)的傳輸方式主要有兩類:一類是采用與計算機顯示同一內(nèi)容的實時視頻屏;另一類為通過USB、以太網(wǎng)等通信手段把顯示內(nèi)容發(fā)給顯示屏的獨立視頻源顯示屏,若采用無線通信方式,還可以隨時更新顯示內(nèi)容,靈活性高。此外,用一套嵌入式系統(tǒng)取代計算機來提供視頻源,既可以降低成本,又具有很高的可行性和靈活性,易于工程施工。因此,獨立視頻源...

史海拾趣

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

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 峨山| 扎鲁特旗| 聂荣县| 图木舒克市| 叶城县| 米易县| 瑞丽市| 册亨县| 利川市| 自贡市| 黄大仙区| 于都县| 中阳县| 子洲县| 蕉岭县| 山阴县| 泸定县| 宣化县| 年辖:市辖区| 神农架林区| 东兴市| 吉安县| 祁门县| 上思县| 沈丘县| 同德县| 紫金县| 来安县| 手游| 泰来县| 南宁市| 湄潭县| 高平市| 从江县| 科技| 确山县| 博野县| 西华县| 沐川县| 黔东| 芮城县|