秉火429笔记之十六 I2C--操作EEPROM
生活随笔
收集整理的這篇文章主要介紹了
秉火429笔记之十六 I2C--操作EEPROM
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1. I2C 概述
2. 硬件設計
3. 代碼實現
1. I2C 概述
參考該鏈接,不在贅述:https://blog.csdn.net/XieWinter/article/details/91903678
介于ST I2C接口相對不好用,在此直接采用模擬I2C方式操作設備
2. 硬件設計
?
特征:兼容400KHZ,百萬次寫入,詳見數據手冊
?
EEPROM的7位設備地址是:,A0/A1/A2均為0, 0x50
EEPROM芯片中還有一個WP引腳,具有寫保護功能,當該引腳電平為高時,禁止寫入數據,當引腳為低電平時,可寫入數據,直接接地,則禁用寫保護功能。
EEPROM操作圖
- 字節寫
- ?頁寫
- 當前地址讀
- 隨機讀
- 順序讀
3. 代碼實現
模擬I2C源碼鏈接:https://download.csdn.net/download/xiewinter/11258552
/******************************************************************************Copyright(c) 2018-2020 Xanthium All rights reserved.******************************************************************************文 件 名 : bsp_i2c_gpio.h版 本 號 : 初稿作 者 : Xanthium生成日期 : 2019年6月25日最近修改 :功能描述 : I2C模擬總線驅動模塊H文件函數列表 :修改歷史 :1.日 期 : 2019年6月25日作 者 : Xanthium修改內容 : 創建文件******************************************************************************/#ifndef __BSP_I2C_GPIO_H__ #define __BSP_I2C_GPIO_H__#ifdef __cplusplusextern "C" { #endif#include "stm32f4xx.h"#define I2C_WR 0 /* 寫控制bit */ #define I2C_RD 1 /* 讀控制bit */void bsp_InitI2C(void); 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);#ifdef __cplusplus } #endif#endif // end of __BSP_I2C_GPIO_H__ /* -------------- 部分代碼---------完整代碼見個人資源庫*/ /*i2c總線GPIO:PB6/I2C1_SCLPB7/I2C1_SDA *//* 定義I2C總線連接的GPIO端口, 用戶只需要修改下面4行代碼即可任意改變SCL和SDA的引腳 */#define RCC_I2C_PORT RCC_AHB1Periph_GPIOB /* GPIO端口時鐘 */#define PORT_I2C_SCL GPIOB /* GPIO端口 */ #define PIN_I2C_SCL GPIO_Pin_6 /* GPIO引腳 */#define PORT_I2C_SDA GPIOB /* GPIO端口 */ #define PIN_I2C_SDA GPIO_Pin_7 /* GPIO引腳 */#define I2C_SCL_PIN GPIO_Pin_6 /* 連接到SCL時鐘線的GPIO */ #define I2C_SDA_PIN GPIO_Pin_7 /* 連接到SDA數據線的GPIO *//* 定義讀寫SCL和SDA的宏 */ #define I2C_SCL_1() GPIO_SetBits(PORT_I2C_SCL,I2C_SCL_PIN) /* SCL = 1 */ #define I2C_SCL_0() GPIO_ResetBits(PORT_I2C_SCL,I2C_SCL_PIN) /* SCL = 0 */#define I2C_SDA_1() GPIO_SetBits(PORT_I2C_SDA,I2C_SDA_PIN) /* SDA = 1 */ #define I2C_SDA_0() GPIO_ResetBits(PORT_I2C_SDA,I2C_SDA_PIN) /* SDA = 0 */#define I2C_SDA_READ() (GPIO_ReadInputDataBit(PORT_I2C_SDA,I2C_SDA_PIN)) /* 讀SDA口線狀態 */ #define I2C_SCL_READ() (GPIO_ReadInputDataBit(PORT_I2C_SCL,I2C_SCL_PIN)) /* 讀SCL口線狀態 *//* ********************************************************************************************************* * 函 數 名: bsp_InitI2C * 功能說明: 配置I2C總線的GPIO,采用模擬IO的方式實現 * 形 參: 無 * 返 回 值: 無 ********************************************************************************************************* */ void bsp_InitI2C(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打開GPIO時鐘 */GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /* 開漏輸出模式 */GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = PIN_I2C_SCL;GPIO_Init(PORT_I2C_SCL, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = PIN_I2C_SDA;GPIO_Init(PORT_I2C_SDA, &GPIO_InitStructure);/* 給一個停止信號, 復位I2C總線上的所有設備到待機模式 */i2c_Stop(); }/* ********************************************************************************************************* * 函 數 名: i2c_Start * 功能說明: CPU發起I2C總線啟動信號 * 形 參: 無 * 返 回 值: 無 ********************************************************************************************************* */ void i2c_Start(void) {/* 當SCL高電平時,SDA出現一個下跳沿表示I2C總線啟動信號 */I2C_SDA_1();I2C_SCL_1();i2c_Delay();I2C_SDA_0();i2c_Delay();I2C_SCL_0();i2c_Delay(); }/* ********************************************************************************************************* * 函 數 名: i2c_Start * 功能說明: CPU發起I2C總線停止信號 * 形 參: 無 * 返 回 值: 無 ********************************************************************************************************* */ void i2c_Stop(void) {/* 當SCL高電平時,SDA出現一個上跳沿表示I2C總線停止信號 */I2C_SDA_0();I2C_SCL_1();i2c_Delay();I2C_SDA_1();i2c_Delay(); }// .... /******************************************************************************Copyright(c) 2018-2020 Xanthium All rights reserved.******************************************************************************文 件 名 : bsp_eeprom_24xx.h版 本 號 : 初稿作 者 : Xanthium生成日期 : 2019年6月25日最近修改 :功能描述 : 串行EEPROM 24xx02驅動模塊H文件函數列表 :修改歷史 :1.日 期 : 2019年6月25日作 者 : Xanthium修改內容 : 創建文件******************************************************************************/#ifndef __BSP_EEPROM_24XX_H__ #define __BSP_EEPROM_24XX_H__#ifdef __cplusplusextern "C" { #endif#include <stdint.h>#define AT24C02 //#define AT24C128#ifdef AT24C02#define EE_MODEL_NAME "AT24C02"#define EE_DEV_ADDR 0xA0 /* 設備地址 */#define EE_PAGE_SIZE 8 /* 頁面大小(字節) */#define EE_SIZE 256 /* 總容量(字節) */#define EE_ADDR_BYTES 1 /* 地址字節個數 */ #endif#ifdef AT24C128#define EE_MODEL_NAME "AT24C128"#define EE_DEV_ADDR 0xA0 /* 設備地址 */#define EE_PAGE_SIZE 64 /* 頁面大小(字節) */#define EE_SIZE (16*1024) /* 總容量(字節) */#define EE_ADDR_BYTES 2 /* 地址字節個數 */ #endifuint8_t bsp_ee_CheckOk(void); uint8_t bsp_ee_ReadBytes(uint8_t *_pReadBuf, uint16_t _usAddress, uint16_t _usSize); uint8_t bsp_ee_WriteBytes(uint8_t *_pWriteBuf, uint16_t _usAddress, uint16_t _usSize);#ifdef __cplusplus } #endif#endif // end of __BSP_EEPROM_24XX_H__?
總結
以上是生活随笔為你收集整理的秉火429笔记之十六 I2C--操作EEPROM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript百炼成仙 第一章 掌
- 下一篇: Swift-ScrollView轮播图的