秉火429笔记之十六 I2C--操作EEPROM

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

目录

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 __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 <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			/* 地址字节个数 */
#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__

猜你喜欢

转载自blog.csdn.net/XieWinter/article/details/93588728