?? 24c02.c
字號:
** 全局變量: 無
** 調(diào)用模塊: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
Check_Acknowledge(),Send_UnAcknowledge()
** 輸入: *buffer:讀出的數(shù)據(jù)存放緩沖首地址,n:讀出數(shù)據(jù)個數(shù),addr:讀出首地址
** 輸出: bit-當(dāng)寫入正確時反回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(); /*發(fā)送應(yīng)答*/
else
Send_UnAcknowledge(); /*發(fā)送非應(yīng)答*/
}
I2C_Stop();
return(TRUE);
}
void Delay1Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
void SaveXYToNVRAM(void) /*保存當(dāng)前的坐標(biāo)值*/
{
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) /*讀當(dāng)前的坐標(biāo)值 */
{
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; //重新定義數(shù)據(jù)類型
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; //讀寫錯誤標(biāo)志 1錯誤 0 正確
uchar idata ErrorCode; //錯誤碼
//************************函數(shù)聲明***************************
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
/*************************版權(quán)信息**************************
*CopyRight(c) **電子有限公司
*All rights reserved
*
*文件名稱: i2c.c
*當(dāng)前版本: v1.0
*作者: cptang
*完成日期:
*摘要: 24c02操作定義文件,注意I2C總線的數(shù)據(jù)格式
* 先讀寫數(shù)據(jù)高位后低位
************************************************************/
//************************頭文件****************************
//#include <reg51.h>
//#include <intrins.h>
//#include "i2c.h"
//***********************函數(shù)定義***************************
/***************************************
*函數(shù)名稱: void Start(void)
*功能描述: 讀寫開始
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Start(void)
{
I2C_SDA = 1; //起始條件的數(shù)據(jù)信號
_nop_();
I2C_SCL = 1; //起始條件時鐘信號
_nop_(); //信號建立時間>4.7us
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 0; //起始信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0; //鉗住I2C總線, 準(zhǔn)備發(fā)送或者接受數(shù)據(jù)
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Stop(void)
*功能描述: 讀寫結(jié)束
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Stop(void)
{
I2C_SDA = 0; //結(jié)束條件的數(shù)據(jù)信號
_nop_();
I2C_SCL = 1; //結(jié)束條件的時鐘信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 1; //結(jié)束信號
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Ack(void)
*功能描述: 正確應(yīng)答,讀一個字節(jié)后必須應(yīng)答
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Ack(void)
{
I2C_SDA = 0;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void NoAck(void)
*功能描述: 無應(yīng)答
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void NoAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void TestAck(void)
*功能描述: 讀寫錯誤測試,寫一個字節(jié)應(yīng)該測試應(yīng)答信號
*輸入: 無
*輸出: 返回一個位
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void TestAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
ErrorBit = I2C_SDA;
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Write_I2c(uchar date)
*功能描述: 寫I2C
*輸入: 待送數(shù)據(jù),高字節(jié)先送
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Write_I2c(uchar date)
{
uchar i;
for(i = 0; i < 8; i++)
{
I2C_SDA = date & 0x80; //送數(shù)據(jù)到數(shù)據(jù)線上
date <<= 1;
_nop_();
I2C_SCL = 1; //置時鐘信號為高電平,使數(shù)據(jù)有效
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
}
/***************************************
*函數(shù)名稱: uchar Read_I2c(void)
*功能描述: 讀I2C
*輸入: 無
*輸出: 返回一個字節(jié)的數(shù)據(jù),高字節(jié)在前
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
uchar Read_I2c(void)
{
uchar i;
uchar byte = 0;
for(i = 0; i < 8; i++)
{
I2C_SCL = 0; //置時鐘為低電平,準(zhǔn)備接受數(shù)據(jù)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 1; //置時鐘為高電平,使數(shù)據(jù)線數(shù)據(jù)有效
_nop_();
_nop_();
byte <<= 1;
byte |= I2C_SDA;
_nop_();
_nop_();
I2C_SCL = 0;
}
return(byte);
}
/***************************************
*函數(shù)名稱: void DelayMs(uchar time)
*功能描述: 延時
*輸入: 延時時間
*輸出: 無
*全局變量: 無
*調(diào)用模塊: 無
****************************************/
void DelayMs(uchar time)
{
uchar i;
do
{
for(i = 0; i < 125 ; i++); //*延時 8us x 125 = 1ms
}
while (time--);
}
/***************************************
*函數(shù)名稱: void Write_Date(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 寫數(shù)據(jù)
*輸入: 數(shù)據(jù)開始地址,保存數(shù)據(jù)指針,數(shù)據(jù)字節(jié)數(shù)
*輸出: 無
*全局變量: 無
*調(diào)用模塊: Start(),Write_I2c(),Stop(),TestAck()
*注意事項(xiàng): 調(diào)用之前,需要定義一個數(shù)組,用來存待發(fā)送的數(shù)據(jù)
****************************************/
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);
}
/***************************************
*函數(shù)名稱: void Read_Date(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 讀數(shù)據(jù)
*輸入: 數(shù)據(jù)開始地址,讀取數(shù)據(jù)指針,數(shù)據(jù)字節(jié)數(shù)
*輸出: 無
*全局變量: 無
*調(diào)用模塊: Start(),Write_I2c(),Read_I2c(),Ack(),NoAck(),Stop(),TestAck()
*注意事項(xiàng): 調(diào)用之前,需要定義一個數(shù)組,用來存讀取的數(shù)據(jù)
****************************************/
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -