📄 24c02.c
字号:
** 全局变量: 无
** 调用模块: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge(),Send_UnAcknowledge()
** 输入: *buffer:读出的数据存放缓冲首地址,n:读出数据个数,addr:读出首地址
** 输出: bit-当写入正确时反回1,否则返回0。
******************************************************************************/
bit Read_N_Bytes(unsigned char *buffer,unsigned char n,unsigned char addr)
{
bit acktemp=1;
unsigned char i=0;
I2C_Start();
WriteI2CByte(SLAW); /*write the SLAW*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
WriteI2CByte(addr); /*write memory address*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
I2C_Start();
WriteI2CByte(SLAR); /*write the SLAR*/
acktemp=Check_Acknowledge();
if(!acktemp)
{
I2C_Stop();
return(FALSE);
}
for(i=0;i<n;i++)
{
*buffer=ReadI2CByte();
buffer++;
if(i!=n-1)
SEND_0(); /*发送应答*/
else
Send_UnAcknowledge(); /*发送非应答*/
}
I2C_Stop();
return(TRUE);
}
void Delay1Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
void SaveXYToNVRAM(void) /*保存当前的坐标值*/
{
Write_One_Byte(1,LOWBYTE(Pref_x)) ;
Delay5Ms();
Write_One_Byte(2,HIGHBYTE(Pref_x)) ;
Delay5Ms();
Write_One_Byte(3,LOWBYTE(Pref_y)) ;
Delay5Ms();
Write_One_Byte(4,HIGHBYTE(Pref_y)) ;
}
void ReadXYFromNVRAM(void) /*读当前的坐标值 */
{
Pref_x= (int)Read_One_Byte(2);
Pref_x=(Pref_x<<8)&0xff00;
Pref_x+=(int)Read_One_Byte(1);
Pref_y= (int)Read_One_Byte(4);
Pref_y=(Pref_y<<8)&0xff00;
Pref_y+=(int)Read_One_Byte(3);
}
void SaveGcodeToI2C(void)
{
unsigned char i=10,k=0;
while(!(buf[k]==0xff))
{
Write_One_Byte(i++,buf[k++]);
Delay1Ms();
}
}
void ReadGcodeToI2C(void)
{
unsigned char i=10,k=0;
while(1)
{
buf[k++]=Read_One_Byte(i++);
if(buf[--k]==M02) break;
k++;
Delay1Ms();
}
}
#endif
#if 0
#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 = P3^7;
sbit I2C_SDA = P3^6;
//用户变量声明
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);
}
void SaveXYToNVRAM(void)
{ uchar *date0=&Pref_x;
uchar *date1=&Pref_y;
Write_Date(1,date0,1) ;
Write_Date(10,date1,1);
}
void ReadXYFromNVRAM(void)
{
uchar *date0=&Pref_x;
uchar *date1=&Pref_y;
Read_Date(1,date0,1);
Read_Date(10,date1,1);
}
void SaveGcodeToI2C(unsigned char start_add,unsigned char *p,unsigned char lenth)
{
int i;
for(i=0;i<lenth;i++)
{
// Write_One_Byte(start_add,*p);
start_add++;
p++;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -