24c02读写程序(C语言版本)

flowercity 2005-10-27 10:20:19
/*************************版权信息**************************
*CopyRight(c) **电子有限公司
*All rights reserved
*
*文件名称: i2c.h
*当前版本: v1.0
*作者: cptang
*完成日期: 03-11
*摘要: 24c02外存操作声明文件
************************************************************/
#ifndef I2C_H
#define I2C_H
typedef unsigned char uchar; //重新定义数据类型
typedef unsigned int uint;
//************************变量声明***************************
//读写控制命令
const uchar WR24C02 = 0xA0; //EEPROM地址+写命令
const uchar RD24C02 = 0xA1; //EEPROM地址+读命令
//I/O口定义
sbit I2C_SCL = P2^6;
sbit I2C_SDA = P2^7;
//用户变量声明
bit ErrorBit; //读写错误标志 1错误 0 正确
uchar idata ErrorCode; //错误码
//************************函数声明***************************
void Start(void);
void Stop(void);
void Ack(void);
void NoAck(void);
void TestAck(void);
void Write_I2c(uchar date);
uchar Read_I2c(void);
void DelayMs(uchar time);
void Write_Date(uchar StartAddress,uchar *date,uchar bytes);
void Read_Date(uchar StartAddress,uchar *date,uchar bytes);
#endif
/*************************版权信息**************************
*CopyRight(c) **电子有限公司
*All rights reserved
*
*文件名称: i2c.c
*当前版本: v1.0
*作者: cptang
*完成日期:
*摘要: 24c02操作定义文件,注意I2C总线的数据格式
* 先读写数据高位后低位
************************************************************/
//************************头文件****************************
#include <reg51.h>
#include <intrins.h>
#include "i2c.h"
//***********************函数定义***************************
/***************************************
*函数名称: void Start(void)
*功能描述: 读写开始
*输入: 无
*输出: 无
*全局变量: I2C_SCL,I2C_SDA
*调用模块: 无

****************************************/
void Start(void)
{
I2C_SDA = 1; //起始条件的数据信号
_nop_();
I2C_SCL = 1; //起始条件时钟信号
_nop_(); //信号建立时间>4.7us
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 0; //起始信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0; //钳住I2C总线, 准备发送或者接受数据
_nop_();
_nop_();
}
/***************************************
*函数名称: void Stop(void)
*功能描述: 读写结束
*输入: 无
*输出: 无
*全局变量: I2C_SCL,I2C_SDA
*调用模块: 无

****************************************/
void Stop(void)
{
I2C_SDA = 0; //结束条件的数据信号
_nop_();
I2C_SCL = 1; //结束条件的时钟信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 1; //结束信号
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************************
*函数名称: void Ack(void)
*功能描述: 正确应答,读一个字节后必须应答
*输入: 无
*输出: 无
*全局变量: I2C_SCL,I2C_SDA
*调用模块: 无

****************************************/
void Ack(void)
{
I2C_SDA = 0;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函数名称: void NoAck(void)
*功能描述: 无应答
*输入: 无
*输出: 无
*全局变量: I2C_SCL,I2C_SDA
*调用模块: 无

****************************************/
void NoAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函数名称: void TestAck(void)
*功能描述: 读写错误测试,写一个字节应该测试应答信号
*输入: 无
*输出: 返回一个位
*全局变量: I2C_SCL,I2C_SDA
*调用模块: 无

****************************************/
void TestAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
ErrorBit = I2C_SDA;
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函数名称: void Write_I2c(uchar date)
*功能描述: 写I2C
*输入: 待送数据,高字节先送
*输出: 无
*全局变量: I2C_SCL,I2C_SDA
*调用模块: 无

****************************************/
void Write_I2c(uchar date)
{
uchar i;
for(i = 0; i < 8; i++)
{
I2C_SDA = date & 0x80; //送数据到数据线上
date <<= 1;
_nop_();
I2C_SCL = 1; //置时钟信号为高电平,使数据有效
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();

}
}
/***************************************
*函数名称: uchar Read_I2c(void)
*功能描述: 读I2C
*输入: 无
*输出: 返回一个字节的数据,高字节在前
*全局变量: I2C_SCL,I2C_SDA
*调用模块: 无

****************************************/
uchar Read_I2c(void)
{
uchar i;
uchar byte = 0;
for(i = 0; i < 8; i++)
{
I2C_SCL = 0; //置时钟为低电平,准备接受数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 1; //置时钟为高电平,使数据线数据有效
_nop_();
_nop_();
byte <<= 1;
byte |= I2C_SDA;
_nop_();
_nop_();
I2C_SCL = 0;
}
return(byte);
}
/***************************************
*函数名称: void DelayMs(uchar time)
*功能描述: 延时
*输入: 延时时间
*输出: 无
*全局变量: 无
*调用模块: 无

****************************************/
void DelayMs(uchar time)
{
uchar i;
do
{
for(i = 0; i < 125 ; i++); //*延时 8us x 125 = 1ms
}
while (time--);

}
/***************************************
*函数名称: void Write_Date(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 写数据
*输入: 数据开始地址,保存数据指针,数据字节数
*输出: 无
*全局变量: 无
*调用模块: Start(),Write_I2c(),Stop(),TestAck()
*注意事项: 调用之前,需要定义一个数组,用来存待发送的数据
****************************************/
void Write_Date(uchar StartAddress,uchar *date,uchar bytes)
{
uchar i = 0;
Start();
Write_I2c(WR24C02);
TestAck();
Write_I2c(StartAddress);
TestAck();
for(i = 0;i < bytes; i++)
{
Write_I2c(*date);
TestAck();
date++;
}
Stop();
DelayMs(20);
}
/***************************************
*函数名称: void Read_Date(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 读数据
*输入: 数据开始地址,读取数据指针,数据字节数
*输出: 无
*全局变量: 无
*调用模块: Start(),Write_I2c(),Read_I2c(),Ack(),NoAck(),Stop(),TestAck()
*注意事项: 调用之前,需要定义一个数组,用来存读取的数据
****************************************/
void Read_Date(uchar StartAddress,uchar *date,uchar bytes)
{
uchar i;
Start();
Write_I2c(WR24C02);
TestAck();
Write_I2c(StartAddress);
TestAck();
Write_I2c(RD24C02);
TestAck();
for (i = 0; i < bytes; i++)
{
*date = Read_I2c();
Ack();
date++;
}
NoAck();
Stop();
DelayMs(10);
}
/////////////////////////////////////////////////
///////////////////////////////////////////////
...全文
574 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧