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 __cplusplus
extern "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_SCL
PB7/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 __cplusplus
extern "C" {
#endif
#include #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 /* 地址字节个数 */ #endif uint8_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笔记之十八 ETH--以太网
下一篇:秉火429笔记之五控制RGB彩灯
推荐阅读最新更新时间:2024-11-09 20:08