#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即可)下载本文