视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
24C02 I2C 驱动程序(详细 全)
2025-09-29 09:05:17 责编:小OO
文档
/*---------------------------------------24C02.h-----------------------------------*/

#ifndef _24C02_H

#define

/* Includes ----------------------------------------------------------------*/

#include "STC15F2K60S2.h"

#include "stdbool.h"

/* Define ------------------------------------------------------------------*/

#define WC24C02 0xa0                      器件地址 写

#define RC24C02 0xa1                      器件地址 读

#                 最多256个字节 2K bits 32页

#                每页有8个字节

#define delayNOP() _nop_();_nop_();_nop_();_nop_()  //延时

sbit SDA = P2^5;                        定义数据线

sbit SCL = P2^6;                        定义时钟线

/* Private ------------------------------------------------------------------*/

/* Public -------------------------------------------------------------------*/

uint idata ucSendBuffer[8]={0x01,0x02,0x04,0x08,

 0x10,0x20,0x40,0x80};

uint idata ucReceData;

uint idata ucReceiveBuffer[8];                 从器件中读出的多字节数据暂存区

/* Function Declaration -----------------------------------------------------*/

bool I2CStart(void);                      启动I2C

void I2CStop(void);                       停止I2C

void I2CAck(void);                       应答信号

void I2CNoAck(void);                      发送非应答信号

bool I2CWaitAck(void);                     检测应答位

void I2CSendByte(u8 demand);                  发送一字节数据

u8 I2CReceiveByte(void);                    接收一字节数据

//extern bool I2C_ByteWrite(u8* pBuffer, u8 WriteAddr);     向24c02中写入1个字节

extern bool I2C_PageWrite(u8* pBuffer, u8 WriteAddr, u8 n);   页写 (不超过一页)

extern bool I2C_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 n); 数据块写 (不超过256个字节)

extern bool I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 n);  从24C02中读出N字节数据(不超过256个字节)

#endif

/*----------------------------------------------end file-----------------------------------------------*/

/*---------------------------------------------24C02.c------------------------------------------------*/

/******************** (C) COPYRIGHT 2014 xxxx **********************************

 * 文件名  :24c02.c

 * 描述 :本函数是xxxxx的24C02的读写函数 注:器件地址0xa0 数据地址:00H-FFH 2K bits 256Byte

 * 平台  :Keil 4 A51 

* 库版本  :使用了宏晶科技的相关资料及程序\\ STM库3.50 I2C程序

 * 作者 :xxxxxx

 * 时间 :2014.9.3

**********************************************************************************/

/* Includes ------------------------------------------------------------------*/

#include "24c02.h"

/********开启24c02的I2C总线********/

bool I2CStart(void)

{

  线为低电平则总线忙,退出

  线为高电平则总线出错,退出

}

/********关闭24c02的I2C总线*******/

void I2CStop(void)

{

}

/*********发送 ACK*********/

void I2CAck(void)

{

//

//

}

/*********发送NO ACK*********/

void I2CNoAck(void)

{

//

//

}

/*********读取ACK信号*********/

bool I2CWaitAck(void)  返回为:1=有ACK,0=无ACK

{

   设置SDA为输入 

//

//

 

 

}

/************MCU向24c02发送一个字节数据 *************/

void I2CSendByte(u8 demand) //数据从高位到低位//

{

 

 

  

  

  

  

  

//  

  

  

//     

 

 

}

/*********MCU从24c02读入一字节数据*********/

u8 I2CReceiveByte(void)  //数据从高位到低位//

{

    设置SDA为输入

  数据从高位开始读取

 

 

// 

 

   从高位开始 ddata|=SDA;ddata<<=1

// 

 

 

  

 

}

/****************向24c02中写入1个字节****************/

/*bool I2C_ByteWrite(u8* pBuffer, u8 WriteAddr)

{

 启动I2C

 发送器件地址 写

 

 

 

}*/

/*

 * 函数名:I2C_PageWrite

 * 描述  :在EEPROM的一个写循环中可以写多个字节,但一次写入的字节数

 不能超过EEPROM页的大小。AT24C02每页有8个字节。

 * 输入  :-pBuffer 缓冲区指针

 接收数据的EEPROM的地址 

 要写入EEPROM的字节数

 * 返回  :0:失败 1:成功

 * 调用  :外部调用

 */

bool I2C_PageWrite(u8* pBuffer, u8 WriteAddr, u8 n)

{

 

 启动I2C

 发送器件地址 写

 

 

 写入8字节数据

 

 

  

}

/*

 * 函数名:I2C_BufferWrite

 * 描述  :将缓冲区中的数据写到I2C EEPROM中

 * 输入  :-pBuffer 缓冲区指针

 接收数据的EEPROM的地址

 要写入EEPROM的字节数

 * 返回  :0:失败 1:成功

 * 调用  :外部调用

 */

bool I2C_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 n)

{

  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;

 

  Addr = WriteAddr % I2C_PAGESIZE;

  count = I2C_PAGESIZE - Addr;

  NumOfPage =  n / I2C_PAGESIZE;

  NumOfSingle = n % I2C_PAGESIZE;

 

  /* If WriteAddr is I2C_PAGESIZE aligned  */

  if(Addr == 0) 

  {

   

    

   

    

  }

  /* If WriteAddr is not I2C_PAGESIZE aligned  */

  else 

  {

   

 

   

    

   

    

   

    

  }  

}

/*************************************************************

**名称:bool I2C_BufferRead

**功能:从24C02中读出读取一块数据(不超过256个字节)

 * 输入  :-pBuffer 缓冲区指针

 的数据地址

 要从EEPROM读出的字节数

 * 返回  :0:失败 1:成功

 * 调用  :外部调用

**************************************************************/

bool I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 n)

{

 

 启动I2C

 发送器件地址 写

 

 发送器件内部地址

 

  发送器件地址 读

 

 读取字节数据

  读取数据

 

}

/**************************************************************/

//本程序采用软件延时的方法产生SCL脉冲,为保证有足够的延时,特延时100us,在使

//用时可根据要求适当调整。(如12M晶振时,只要4.7us即可)下载本文

显示全文
专题