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

歷史上的今天

今天是:2025年06月21日(星期六)

2019年06月21日 | 嵌入式stm32學(xué)習(xí):I2C-讀寫EEPROM

發(fā)布者:Tianyun2021 來源: eefocus關(guān)鍵字:stm32  I2C  讀寫EEPROM 手機看文章 掃描二維碼
隨時隨地手機看文章

bsp_i2c_gpio.h


#ifndef _BSP_I2C_GPIO_H

#define _BSP_I2C_GPIO_H


#include "stm32f4xx.h"

#include



#define EEPROM_I2C_WR   0       /* 寫控制bit */

#define EEPROM_I2C_RD   1       /* 讀控制bit */



/* 定義I2C總線連接的GPIO端口,用戶只需要修改下面四行代碼即可任意改變SCL和SDA的引腳 */

#define EEPROM_I2C_GPIO_PORT                GPIOB           

#define EEPROM_I2C_GPIO_CLK             RCC_AHB1Periph_GPIOB        

#define EEPROM_I2C_SCL_PIN                  GPIO_Pin_6          /* 連接到SCL時鐘線的GPIO */

#define EEPROM_I2C_SDA_PIN                  GPIO_Pin_7          /* 連接到SDA數(shù)據(jù)線的GPIO */



/* 定義讀寫SCL和SDA的宏,增加代碼可讀性和可移植性 */

#if 1   /* 條件編譯:1 選擇GPIO庫函數(shù)實現(xiàn)IO讀寫 */

    #define EEPROM_I2C_SCL_1()  GPIO_SetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN)      /* SCL = 1 */

    #define EEPROM_I2C_SCL_0()  GPIO_ResetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN)        /* SCL = 0 */


    #define EEPROM_I2C_SDA_1()  GPIO_SetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN)      /* SDA = 1 */

    #define EEPROM_I2C_SDA_0()  GPIO_ResetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN)        /* SDA = 0 */


    #define EEPROM_I2C_SDA_READ()  GPIO_ReadInputDataBit(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN)  /* 讀SDA口線狀態(tài) */

#else   /* 這個分支選擇直接寄存器操作實現(xiàn)IO讀寫 */

    /*注意: 如下寫法,在IAR最高級別優(yōu)化時會被編譯器錯誤優(yōu)化 */

    #define EEPROM_I2C_SCL_1()  EEPROM_I2C_GPIO_PORT->BSRRL = EEPROM_I2C_SCL_PIN                /* SCL = 1 */

    #define EEPROM_I2C_SCL_0()  EEPROM_I2C_GPIO_PORT->BSRRH = EEPROM_I2C_SCL_PIN                /* SCL = 0 */


    #define EEPROM_I2C_SDA_1()  EEPROM_I2C_GPIO_PORT->BSRRL = EEPROM_I2C_SDA_PIN                /* SDA = 1 */

    #define EEPROM_I2C_SDA_0()  EEPROM_I2C_GPIO_PORT->BSRRH = EEPROM_I2C_SDA_PIN                /* SDA = 0 */


    #define EEPROM_I2C_SDA_READ()  ((EEPROM_I2C_GPIO_PORT->IDR & EEPROM_I2C_SDA_PIN) != 0)  /* 讀SDA口線狀態(tài) */

#endif



void i2c_Start(void);

void i2c_Stop(void);

void i2c_SendByte(uint8_t _ucByte);

uint8_t i2c_ReadByte(void);

uint8_t i2c_WaitAck(void);

void i2c_Ack(void);

void i2c_NAck(void);

uint8_t i2c_CheckDevice(uint8_t _Address);



#endif


bsp_i2c_gpio.c


/*

    應(yīng)用說明:

    在訪問I2C設(shè)備前,需要先調(diào)用i2c_CheckDevice()檢測I2C設(shè)備是否正常,該函數(shù)會配置GPIO

*/

#include "./i2c/bsp_i2c_gpio.h"




static void i2c_CfgGpio(void);



/*

*********************************************************************************************************

*   I2C總線位延遲,最快400KHz

*********************************************************************************************************

*/

static void i2c_Delay(void)

{

    uint8_t i;

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

}


/*

*********************************************************************************************************

*   CPU發(fā)起I2C總線啟動信號

*********************************************************************************************************

*/

void i2c_Start(void)

{

    /* 當(dāng)SCL高電平時,SDA出現(xiàn)一個下跳沿表示I2C啟動信號 */

    EEPROM_I2C_SDA_1();

    EEPROM_I2C_SCL_1();

    i2c_Delay();

    EEPROM_I2C_SDA_0();

    i2c_Delay();

    EEPROM_I2C_SCL_0();

    i2c_Delay();

}


/*

*********************************************************************************************************

*   CPU發(fā)起I2C總線停止信號

*********************************************************************************************************

*/

void i2c_Stop(void)

{

    /* 當(dāng)SCL高電平時,SDA出現(xiàn)一個下跳沿表示I2C停止信號 */

    EEPROM_I2C_SDA_0();

    EEPROM_I2C_SCL_1();

    i2c_Delay();

    EEPROM_I2C_SDA_1();

}


/*

*********************************************************************************************************

*   CPU向I2C總線設(shè)備發(fā)送8bit數(shù)據(jù)

*   _ucByte:等待發(fā)送的字節(jié)

*********************************************************************************************************

*/

void i2c_SendByte(uint8_t _ucByte)

{

    uint8_t i;


    /* ?è·¢?í×??úμ?????bit7 */

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

    {       

        if (_ucByte & 0x80)

        {

            EEPROM_I2C_SDA_1();

        }

        else

        {

            EEPROM_I2C_SDA_0();

        }

        i2c_Delay();

        EEPROM_I2C_SCL_1();

        i2c_Delay();    

        EEPROM_I2C_SCL_0();

        if (i == 7)

        {

             EEPROM_I2C_SDA_1(); // 釋放總線

        }

        _ucByte <<= 1;  /* 左移一個bit */

        i2c_Delay();

    }

}


/*

*********************************************************************************************************

*   CPU向I2C總線設(shè)備讀寫8bit數(shù)據(jù)

*   返回值為讀到的數(shù)據(jù)

*********************************************************************************************************

*/

uint8_t i2c_ReadByte(void)

{

    uint8_t i;

    uint8_t value;


    value = 0;

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

    {

        value <<= 1;

        EEPROM_I2C_SCL_1();

        i2c_Delay();

        if (EEPROM_I2C_SDA_READ())

        {

            value++;

        }

        EEPROM_I2C_SCL_0();

        i2c_Delay();

    }

    return value;

}


/*

*********************************************************************************************************

*   CPU產(chǎn)生一個時鐘,并讀取器件的ACK應(yīng)答信號

*   返回0表示正確應(yīng)答,返回1表示無器件響應(yīng)

*********************************************************************************************************

*/

uint8_t i2c_WaitAck(void)

{

    uint8_t re;


    EEPROM_I2C_SDA_1(); /* CPU釋放SDA總線 */

    i2c_Delay();

    EEPROM_I2C_SCL_1(); /* CPU驅(qū)動SCL = 1,此時器件會返回ACK應(yīng)答 */

    i2c_Delay();

    if (EEPROM_I2C_SDA_READ())  /* CPU訪問SDA口線狀態(tài) */

    {

        re = 1;

    }

    else

    {

        re = 0;

    }

    EEPROM_I2C_SCL_0();

    i2c_Delay();

    return re;

}


/*

*********************************************************************************************************

*   CPU產(chǎn)生一個ACK信號

*********************************************************************************************************

*/

void i2c_Ack(void)

{

    EEPROM_I2C_SDA_0(); /* CPU驅(qū)動SDA = 0 */

    i2c_Delay();

    EEPROM_I2C_SCL_1(); /* CPU產(chǎn)生1個時鐘 */

    i2c_Delay();

    EEPROM_I2C_SCL_0();

    i2c_Delay();

    EEPROM_I2C_SDA_1(); /* CPU釋放SDA總線 */

}


/*

*********************************************************************************************************

*   CPU產(chǎn)生一個NACK信號

*********************************************************************************************************

*/

void i2c_NAck(void)

{

    EEPROM_I2C_SDA_1(); /* CPU驅(qū)動SDA = 1 */

    i2c_Delay();

    EEPROM_I2C_SCL_1(); /* CPU產(chǎn)生1個時鐘 */

    i2c_Delay();

    EEPROM_I2C_SCL_0();

    i2c_Delay();    

}


/*

*********************************************************************************************************

*   配置I2C總線的GPIO,采用模擬IO的方式實現(xiàn)

*********************************************************************************************************

*/

static void i2c_CfgGpio(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_AHB1PeriphClockCmd(EEPROM_I2C_GPIO_CLK, ENABLE);    /* 打開GPIO時鐘 */


    GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SCL_PIN | EEPROM_I2C_SDA_PIN;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   

    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;      /* 開漏輸出 */

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    GPIO_Init(EEPROM_I2C_GPIO_PORT, &GPIO_InitStructure);


    /* 給一個停止信號,復(fù)位I2C總線上的所有設(shè)備到待機模式 */

    i2c_Stop();

}


/*

*********************************************************************************************************

*   檢測I2C總線設(shè)備,CUP發(fā)送設(shè)備地址,讀取設(shè)備應(yīng)答判斷設(shè)備是否存在

*   返回0表示設(shè)備存在,返回1表示未探測到

*********************************************************************************************************

*/

uint8_t i2c_CheckDevice(uint8_t _Address)

{

    uint8_t ucAck;


    i2c_CfgGpio();      /* 配置GPIO */



    i2c_Start();        /* 發(fā)送啟動信號 */


    /* 發(fā)送設(shè)備地址+讀寫控制bit(0=w,1=r)bit7先傳 */

    i2c_SendByte(_Address | EEPROM_I2C_WR);

    ucAck = i2c_WaitAck();  /* 檢測設(shè)備的ACK應(yīng)答 */


    i2c_Stop();         /* 發(fā)送停止信號 */


    return ucAck;

}


關(guān)鍵字:stm32  I2C  讀寫EEPROM 引用地址:嵌入式stm32學(xué)習(xí):I2C-讀寫EEPROM

上一篇:嵌入式STM32學(xué)習(xí):I2C-讀寫EEPROM2
下一篇:嵌入式stm32學(xué)習(xí):DMA-存儲到外設(shè)

推薦閱讀

#include<reg52.h> #define uchar unsigned char uchar rtemp,sflag; void SerialInit() //11.0592M晶振,波特率9600 { TMOD=0x20; //設(shè)置定時器1工作方式為方式2 TH1=0xfd; TL1=0xfd; TR1=1; //啟動定時器1 SM0=0; //串口方式1 SM1=1; REN=1; //...
智能芯片的“先行者”寒武紀(jì)又給我們帶來了新的驚喜和成績。2019年6月20日,寒武紀(jì)正式宣布推出云端AI芯片中文品牌“思元”、第二代云端AI芯片思元270(MLU270)及板卡產(chǎn)品。寒武紀(jì)官宣顯示,產(chǎn)品參數(shù)在低精度訓(xùn)練領(lǐng)域?qū)崿F(xiàn)重大突破,印證之前知乎網(wǎng)友的爆料。這對寒武紀(jì),對AI行業(yè),都是一個重大利好。▲思元270芯片中文品牌“思元”這回不僅有中文名思元2...
一.低功耗模式介紹系統(tǒng)提供了多個低功耗模式,可在 CPU 不需要運行時(例如等待外部事件時)節(jié)省功耗。由用戶根據(jù)應(yīng)用選擇具體的低功耗模式,以在低功耗、短啟動時間和可用喚醒源之間尋求最佳平衡。 當(dāng)系統(tǒng)斷電時,仍然可以通過電池供電保留備份域的數(shù)據(jù)。備份域中包含RTC實時時鐘,4KB備份SRAM以及調(diào)壓器,調(diào)壓器為備份域和待機電路以外數(shù)字電路供電,輸...
您可以把大多數(shù)波分成下面幾類■正弦波■方波和矩形波■鋸齒波和三角波■階躍和脈沖形狀■周期信號和非周期信號■同步信號和異步信號■復(fù)合波 正弦波基于多種原因,正弦波是基礎(chǔ)波形。它擁有和諧的數(shù)學(xué)特點,在三角形教學(xué)中,您可能已經(jīng)學(xué)過同樣的正弦形狀墻上插座中的電壓以正弦波形式變化。信號發(fā)生器的振蕩器電路生成的信號通常是正弦波。大多數(shù)AC電源生成...

史海拾趣

問答坊 | AI 解惑

紅外溫度傳感器

求助: 誰有紅外溫度傳感器的資料發(fā)給我一份啊? 或者大家把常用的紅外溫度傳感器型號和價格或者介紹紅外溫度傳感器的網(wǎng)址貼到論壇哦! 謝謝啦~~~…

查看全部問答∨

基于verilog的FPGA學(xué)習(xí)方向

說明一下,我學(xué)習(xí)verilogFPGAD的時間不是很長,曾經(jīng)試著寫過像數(shù)字頻率計,數(shù)字時鐘之類的程序,并且在FPGA上面運行成功。有人告訴我用fpga干那些單片機可以實現(xiàn)的東西沒有必要,而且沒有意義,比如說顯示(數(shù)碼管,lcd,。vga不知道算不算),按鍵 ...…

查看全部問答∨

【申請加精】ARM 2009 Technical Symposium照片 圖大殺貓。。。

首先先說一句:我這里有當(dāng)時的全部PPT資料,如果有人想要,可以站內(nèi)聯(lián)系我,或者郵箱jikai#eeworld.com.cn 廢話不說,還是給大家上圖。 門口展覽的兩家公司大牌子,包括Dell的Z600上網(wǎng)本,其中用到了Montavista操作系統(tǒng)、TI的OMAP處理器以及采 ...…

查看全部問答∨

集成運放的噪聲到底有多大?

集成運放的固有噪聲到底有多大呢? 雖然用的是精密放大器op07 但信號源確是微伏級的 會不會淹沒在噪聲中啊? 哪位大俠解答一下 怎么測運放的固有噪聲呢?…

查看全部問答∨

WinCE 6.0 在調(diào)試DLL中的函數(shù)時傳入的char*類型的參數(shù),看到的值是空的,但函數(shù)的執(zhí)行結(jié)果卻是正確的

dll 頭文件   Function.h class _declspec(dllexport)CFunction : public CObject { public:       CFunction();       virtual ~CFunction();       int Add(i ...…

查看全部問答∨

MDK&STM32系列ARMCortex-M3視頻培訓(xùn)教程

為了滿足部分初學(xué)者的需求,我們制作了一份STM32培訓(xùn)視頻,供大家下載。結(jié)合兩本書,還有低成本的工具,我想對于初學(xué)者來說應(yīng)該會一定的幫助。目前提供的資料:《STM32系列ARM Cortex-M3微制器原理與應(yīng)用》《ARM開發(fā)工具RealView MD ...…

查看全部問答∨

I2C &CAN 的優(yōu)缺 對比?

最近想做點東西,由于模塊有點多,所以想用總線通信。但在IIC和CAN總線的選取上,由于自身對兩種總線了解不夠深,在此希望各位高手能指點一下。634796840是我QQ,可以留言也可以QQ聯(lián)系,謝謝啦!…

查看全部問答∨

買了 飛行器 是空心杯的電機 這是不是 參加競賽不行啊

本帖最后由 paulhyde 于 2014-9-15 03:09 編輯 求解惑 咋辦啊    …

查看全部問答∨

2013年全國大學(xué)生電子設(shè)計競賽

本帖最后由 paulhyde 于 2014-9-15 03:06 編輯 2013年全國大學(xué)生電子設(shè)計競賽 全國一等獎候選隊及抽測的復(fù)評測試隊員名單(C題)    …

查看全部問答∨

關(guān)于IAR variable "Fx" was set but never

我用的是iar for msp430v5.5.02這個版本#include #include \"Config.h\"                  void main(void) {  int  Fx,F;   int k3=18,k2=-40,k ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 安西县| 江阴市| 揭西县| 黎城县| 连州市| 宁强县| 芷江| 沂水县| 崇州市| 广河县| 玉田县| 桐柏县| 衡山县| 澄迈县| 揭西县| 卫辉市| 永城市| 方城县| 淳安县| 抚松县| 瓦房店市| 榆树市| 出国| 甘谷县| 雷波县| 江油市| 宁陵县| 和顺县| 岳普湖县| 洛南县| 恩平市| 财经| 麟游县| 华宁县| 广丰县| 九台市| 普格县| 肇东市| 东乌| 巴中市| 铅山县|