⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24cxx.c

📁 DSP部分功能测试 串口
💻 C
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------------------------//
//---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 + -