《I2C 24CXX驱动程序(真正实用 全)》由会员分享,可在线阅读,更多相关《I2C 24CXX驱动程序(真正实用 全)(14页珍藏版)》请在金锄头文库上搜索。
1、#ifndef _24cXX_H#define_24cXX_H/* Includes -*/#include stm32f10x.h#include value.h/#include stdbool.h/* Define -*/* EEPROM Addresses defines */注:32 64 的字地址是16位 2个字节 如果使用32或64请简单修改驱动即可#define WC24cXX 0x00/ 器件地址 写#define RC24cXX 0x01/ 器件地址 读#define USE_24C08 /使用24C08#ifdef USE_24C02#define MAXSIZE24cX
2、X256/ 总容量 Bytes /级联时请修改本参数和硬件驱动#define BLOCK_SIZE256/ 块容量 Bytes#define I2C_PAGESIZE8/ 8个字节每页#endif#ifdef USE_24C04#define MAXSIZE24cXX512/ 总容量 Bytes /级联时请修改本参数和硬件驱动#define BLOCK_SIZE256/ 块容量 Bytes#define I2C_PAGESIZE16/ 16个字节每页#endif#ifdef USE_24C08#define MAXSIZE24cXX1024/ 总容量 Bytes /级联时请修改本参数和硬件驱动
3、#define BLOCK_SIZE256/ 块容量 Bytes#define I2C_PAGESIZE16/ 16个字节每页/* user define */#define YBCV_ADDR_0 0x0000/定义仪表控制数据结构体的EEPROM存储地址0#define YBCV_ADDR_10x0200/定义仪表控制数据结构体的EEPROM存储地址1#define EEPROM_VERIFY YB_CTRL_VALE_SIZE /EEPROM仪表通道修正参数存储地址#endif#ifdef USE_24C16#define MAXSIZE24cXX2048/ 总容量 Bytes#defi
4、ne I2C_PAGESIZE16/ 16个字节每页#endif#ifdef USE_24C32#define MAXSIZE24cXX4096/ 总容量 Bytes /级联时请修改本参数和硬件驱动#define BLOCK_SIZE4096/ 块容量 Bytes#define I2C_PAGESIZE32/ 16个字节每页#endif#ifdef USE_24C64#define MAXSIZE24cXX8192/ 总容量 Bytes /级联时请修改本参数和硬件驱动#define BLOCK_SIZE8192/ 块容量 Bytes#define I2C_PAGESIZE32/ 16个字节每页
5、#endif#define I2CInit I2C_GPIO_Config#define SCL(a) if (a) GPIO_SetBits(GPIOB, GPIO_Pin_10);else GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define SDA(a) if (a) GPIO_SetBits(GPIOB, GPIO_Pin_11);else GPIO_ResetBits(GPIOB,GPIO_Pin_11)#define SCLO GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)#define SDAO GPIO_ReadI
6、nputDataBit(GPIOB, GPIO_Pin_11)/* Private -*/* Public -*/*uint idata ucSendBuffer8=0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80;uint idata ucReceData;uint idata ucReceiveBuffer8;/从器件中读出的多字节数据暂存区*/* Function Declaration -*/extern bool I2C2_Init(void);/I2C初始化/extern bool I2C_ByteWrite(u8* pBuffer, u8 Writ
7、eAddr);/向24cXX中写入1个字节extern bool I2C_PageWrite(u8* pBuffer, u8 BlockCode, u16 WriteAddr, u8 n);/24cXX页写 (不超过一页)extern bool I2C_BlockWrite(u8* pBlock, u8 BlockCode, u16 WriteAddr, u16 n);/24cXX数据块写(不超过BLOCK_SIZE个字节)extern bool I2C_BufferWrite(u8* pBuffer, u16 WriteAddr, u16 n);/24cXX数据写(不超过MAXSIZE24c
8、XX个字节)extern bool I2C_BufferRead(u8* pBuffer, u16 ReadAddr, u16 n);/从24cXX中读出N字节数据(不超过MAXSIZE24cXX个字节)/extern void I2C_EE_WaitEepromStandbyState(void);/等待24CXX内部写周期结束#endif /*_24cXX_H*/* (C) COPYRIGHT 2015 XXXXX * * 文件名 :24cXX.c * 描述 :本函数是xx项目的24cXX的读写函数 * 平台 :Keil 4 MDK stm32 3.5.0库 * 库版本 :基于野火相关资料
9、及程序上优化修改 * 作者 :天涯月下红颜醉 * 时间 :2015.4.19*/* Includes -*/#include 24cXX.h#include value.h#include systick.h#include /* * 函数名:I2C2_Init * 描述 :I2C2初始化 * 输入 :无 * 输出 :无 * 调用 :内部调用 */bool I2C2_Init(void)bool s = true; GPIO_InitTypeDef GPIO_InitStructure; /* 使能与 I2CGPIO 有关的时钟 */RCC_APB2PeriphClockCmd(RCC_APB
10、2Periph_GPIOB,ENABLE); /* PB10-I2C2_SCL、PB11-I2C2_SDA*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; / 普通开漏输出 GPIO_Init(GPIOB, &GPIO_InitStructure);SDA(1);SCL(1);Delay_nop();Delay_nop();if(
11、!SDAO) s = false;if(!SCLO) s = false;SDA(0);Delay_nop();Delay_nop();if(SDAO) s = false;SCL(0);Delay_nop();SDA(0);SCL(0);Delay_nop();Delay_nop();if(SDAO) s = false;if(SCLO) s = false;SCL(1);Delay_nop();Delay_nop();SDA(1);return s;/*开启24cXX的I2C总线*/static bool I2CStart(void)SDA(1);SCL(1);Delay_nop();De
12、lay_nop();if(!SDAO)return false;/SDA线为低电平则总线忙,退出SDA(0);Delay_nop();Delay_nop();if(SDAO)return false;/SDA线为高电平则总线出错,退出SCL(0);Delay_nop();return true;/*关闭24cXX的I2C总线*/static void I2CStop(void)SDA(0);SCL(0);Delay_nop();Delay_nop();SCL(1);Delay_nop();Delay_nop();SDA(1);/*发送 ACK*/static void I2CAck(void)