📄 24cxx.c
字号:
//----------------------------------------------------------------------//
//---FileName : 24CXX.c ------------------------------------------------//
//---Author : GuoJinf ---------------------------------------------//
//---Date : 2007.05.20 -------------------------------------------------//
//---FUNCTION : the functions to op AT24CXX ----------------------------//
//---Version : V1.0 ------------------------------------------------------//
//---编译环境 : Code Composer Studio 3.1 -------------------------------//
//---实现环境 : TMS320LF2407 -------------------------------------//
//---comment : I2C的读写时序的软件模拟 -------------------------------//
//修改者姓名: 修改时间:07.05.31. add 24C16 &24LC256 ---------//
//版权声明 : 转载请注明出处--Copyright(C) SSC .All rights reserved.----//
//----------------------------------------------------------------------//
//--相当然了,24C02与24LC256的读写是不一样的,24LC256有两个地址字节--//
//--Be careful ,the time to write 24CXX, and the time to cycle---//
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
#include "f2407_c.h"
#include "string.h"
//#include "math.h"
//#include "stdlib.h"
#include "ioports.h"
//#include "time.h"
//#include "register.h"
#define LC256_24
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE 1 //~FALSE
#define WRITE 0xA0 //24Cxx的地址和方向位W
#define READ 0xA1 //24Cxx的地址和方向位R
#define T_EEDLY 2
#define PA *PADATDIR
#define PB *PBDATDIR
#define PC *PCDATDIR
#define PD *PDDATDIR
#define PE *PEDATDIR
#define PF *PFDATDIR
//00_10 0000 0000 0000
#define SCLDIR_O {\
PB = PB | 0x2000;\
}
//SDA DIR out //0000 _100_1 0000 1000
#define SDADIR_O {\
PB = PB | 0x0908;\
}
//SDA DIR in // 1111 1110 1111 0110
#define SDADIR_I {\
PB = PB & 0x0fef6;\
}
//11_11 1101 11_11 1010//
#define SCL_H {\
PB = PB | 0x2020;\
}
//1111 1111 11_01 1111
#define SCL_L {\
PB = PB & 0xffdf;\
}
// 000_1 0000 000_1 0000
#define SDA_H {\
PB = PB | 0x0101;\
}
//1111 1111 111_0 1111
#define SDA_L {\
PB = PB & 0xfffe;\
}
unsigned int comarr[10];
unsigned int ReadArr[10];
extern void test24LC256();
extern void test24();
extern int EEPROM_LC256(int *,int,int,int);
extern unsigned long ReadPara(int addr,int n);
//IOPB0 : TERM--out; IO_PB1 : DBIT_485--in; IOPB2 : DI_E_485--out;//
//IOPB3 : ; IOPB4 : SDA_B24CXX--I/O; IOPB5 : SCL_B24CXX--out;//
//IOPB6:; IOPB7:;//
//#define BLOCK_SIZE 12 //定义指定字节个数
//-------------------------------------------//
//--void read_para(uint add,uchar n);-------------------//
//--------参数所在的地址,字节数------//
//-------------------------------------------//
/*unsigned long read_para(unsigned int add,unsigned int n)
{
register unsigned int i;
unsigned long para=0;
I_init();
if(E_read_block(add,n,comarr))
{
for(i=0;i<n;i++)
{
para = para*10 + comarr[n-1-i];
}
}
else
{
// wr_letter(2,0,0x25);
// wr_letter(2,0x10,0x32 );
}
return para;
}
*/
//----------------------------------------------//
//-------Start IIC------------------------------//
//----IIC BUS ,OPREATe at 100kHz----------------//
//----------------------------------------------//
void I2CStart() //I2C启动//
{
//int k;
SCL_L; // // (IOPC0)SCL=0 //
SDADIR_O; // // (IOPC1)SDA为输出1 //
delay(2* T_EEDLY ); //for (k = 17;k >= 0;k--) { } // 软件延时5.1us //
SDA_H;// // SDA=SCL=1 //
SCL_H;
delay( T_EEDLY ); //for (k = 8;k >= 0;k--) { } // 软件延时2.55us //
SDA_L; // // SDA=0 //
delay( T_EEDLY ); // // 软件延时2.55us //
SCL_L; // // SCL=0 //
}
//--------------------------------------//
//---write data to IIC------------------//
//-------------------------------------//
void I2CSendByte(int data) // 向I2C总线写入数据子程序 //
{
int flag,sz,k; // 定义局部寄存器 //
SCL_L;
SDADIR_O; // // SDA为输出0 //
for (flag = 0x0080;flag != 0x00; flag = flag/2)
{
SCL_L; // // SCL=0 //
delay( T_EEDLY ); // // 软件延时2.55us //
sz = data & flag; // 屏蔽掉相应的位 //
if (sz == 0)
{
SDA_L; // // 如果相应的位为0,则(IOPC1)SDA=0//
}
else
{
SDA_H ; // // 如果相应的位为1,则SDA=1 //
}
delay( T_EEDLY ); //for (k = 8;k >= 0;k--) { } // 软件延时2.55us //
SCL_H; // // SCL=1,在SCL=1期间数据线上的状态必须保持不变 //
delay(2* T_EEDLY ); //for (k = 17;k >= 0;k--) { } // 软件延时5.1us //
}
SCL_L; // // SCL=0 //
}
//--------------------------------------//
//-----Receive ack------------------------//
//--------------------------------------//
int I2CRecAck() //检查应答位子程序 //
{
int k;
SCL_L; // // SCL=0//
delay(2* T_EEDLY ); //for (k = 17; k >= 0; k--) { } // 软件延时5.1us//
SCL_H; // // SCL=1,在SCL=1期间数据线上的状态必须保持不变//
delay( T_EEDLY ); //for (k = 8; k >= 0; k--) { } // 软件延时2.55us//
SDADIR_I; // // IOPC0(SDA为输入)//
delay( T_EEDLY ); //for (k = 1; k >= 0; k--) { } // 软件延时600ns //
//for (k = 6; k >= 0; k--) { } // 软件延时1.95us //
SCL_L; // // SCL=0//
k = PB & 0x0001; // // k值存储应答位,若K=0,则表示操作成功 若k=1,则表示操作失败//
return ( k );
}
//---------------------------------------//
//---read from IIC-----------------------//
//---------------------------------------//
int I2CRecByte() // 从I2C总线读取数据//
{
int k = 0;
int flag;
int sz;
int rev = 0;
SCL_L; // SCL=0 //
SDADIR_I; // // (SDA为输入)//
//
for (flag = 0x0080;flag != 0x0000;flag = flag/2)
{
delay(2* T_EEDLY ); // // 软件延时5.1us//
SCL_H; // // SCL=1 //
delay( T_EEDLY ); //for (k = 8; k >= 0; k--) { } // 软件延时2.55us//
sz = PB & 0x0001; // // 取得应该读取的相应位 //
if (sz == 0x0001) rev = rev | flag; // 若读取的相应位为1,则rev值的相应位置1 //
delay( T_EEDLY ); //for (k = 8; k >= 0; k--) { } // 软件延时2.55us//
SCL_L; // // SCL=0 //
}
return(rev);
}
//-----------------------------------//
//------Ack IIC----------------------//
//-----------------------------------//
void I2CAck() // 对I2C总线产生应答//
{
// int k;
SCL_L; // // SCL=0 //
delay( T_EEDLY ); //for (k = 8; k >= 0; k--) {k=k;} // 软件延时2.55us//
SDADIR_O; // // 设置(IOPC1)SDA为输出//
SDA_L; // // SDA=0 //
delay( T_EEDLY ); //for (k = 8; k >= 0; k--) {k=k;} // 软件延时2.55us//
SCL_H; // // SCL=1 //
delay( T_EEDLY ); //for (k = 17; k >= 0; k--) { } // 软件延时5.1us//
SCL_L; // // SCL=0 //
}
//---------------------------------------//
//-----no ack to IIC---------------------//
//---------------------------------------//
void I2CNoAck() // 不对I2C总线产生应答//
{
// int k;
SCL_L; // // SCL=0 //
delay( T_EEDLY ); //for (k = 8;k > 0;k--) { } // 软件延时2.55us //
SDADIR_O; // // 设置(IOPC1)SDA为输出口 //
SDA_H; // // SDA=1 //
delay( T_EEDLY ); //for (k = 8;k > 0;k--) { } // 软件延时2.55us //
SCL_H; // // SCL=1 //
delay(2* T_EEDLY ); //for (k = 17;k > 0;k--){ } // 软件延时5.1us//
SCL_L; // // SCL=0//
}
//---------------------------------------//
//----------Stop IIC--------------------//
//--------------------------------------//
void I2CStop() // 停止I2C总线 //
{
SCL_L; // // (IOPC0)SCL=0 //
delay( T_EEDLY ); //for (k = 8;k > 0;k--) { } // 软件延时2.55us //
SDADIR_O; // // 设置(IOPC1)SDA为输出口 //
SDA_L; // // SDA=0 //
delay( T_EEDLY ); //for (k = 8;k > 0;k--) { } // 软件延时2.55us //
SCL_H; // // SCL=1 //
delay(2* T_EEDLY ); //for (k = 17;k > 0;k--){ } // 软件延时5.1us //
SDA_H; // // (IOPC1)SDA=1 //
delay(2* T_EEDLY ); //for (k = 17;k > 0;k--){ } // 软件延时5.1us//
// SCL_L; // // SCL=0 //
}
//---Start IIC--
void II2CStart()
{
int k;
SCL_L;
SDADIR_O;
delay(2* T_EEDLY );
SDA_H;
SCL_H;
delay( T_EEDLY );
SDA_L;
delay( T_EEDLY );
SCL_L;
// delay(5);
// SDA_H;
}
//--------------------------------------//
//---write data to IIC------------------//
//-------------------------------------//
void II2CSendByte(int data)
{
int flag,sz,k;
SCL_L;
SDADIR_O;
for(flag = 0x0080;flag != 0x00;flag = flag/2)
{
SCL_L;
delay( T_EEDLY );
sz = data & flag;
if(sz == 0)
{
SDA_L;
}
else
{
SDA_H;
}
delay( T_EEDLY );
SCL_H ;
delay(2* T_EEDLY );
}
SCL_L;
}
/**/
//--------------------------------------//
//-----Receive ack------------------------//
//--------------------------------------//
int II2CRecAck()
{
int k;
SCL_L;
delay( T_EEDLY );
//
delay( T_EEDLY );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -