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

📄 main.c

📁 F2812实现电机控制源程序.rar
💻 C
字号:
/*********************************************************************
**	Module Name:		IIC-EEPROM 				    				**
**	Author:				Cbq  			    						**
**	Version:			1.0			    							**
**	CreateDate:			2008-05-23		    						**
**	Description:		            			    				**
**	Remark:				Huozq		    							**
**	Revision History:	2008-11-10			    					**
**********************************************************************/

/*********************************************************************
**	实验目的:学习IIC接口的EEPROM数据读写                            **
**	实验说明:EEPROM采用24LC64芯片,串行数据线和串行时钟线分别由DSP的 **
**           PA13和PA15控制                                         **
**	实验结果:按照我们下面所设置的断点运行可读出我们写入EEPROM里的值 **                                   **
**********************************************************************/


#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"


#define	  SDA1    	GpioDataRegs.GPADAT.bit.GPIOA13 = 1////串行数据输出高
#define	  SDA0      GpioDataRegs.GPADAT.bit.GPIOA13 = 0////串行数据输出低
#define	  SCL1	    GpioDataRegs.GPADAT.bit.GPIOA15 = 1////串行时钟输出高
#define	  SCL0      GpioDataRegs.GPADAT.bit.GPIOA15 = 0////串行时钟输出低

     
#define	  SDAIN  	EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13  = 0; EDIS
#define	  SDAOUT    EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13  = 1;EDIS

#define	  SDADATA  	GpioDataRegs.GPADAT.bit.GPIOA13

//24C64  =8K Bytes =13bit Add
//页编程平均400us写一字节,随机读平均1.8ms读一字节,连续读平均600us一字节
#define  uchar unsigned char 	/*宏定义*/
#define  uint  unsigned int


void delay(unsigned int t);
unsigned char ByteRead(unsigned int add,unsigned char *temp);
unsigned char ByteWrite(unsigned int add,unsigned char dat);

void main(void)
{    
    unsigned char t,s,a;

	/*初始化系统*/
	InitSysCtrl();

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	/*初始化PIE*/
	InitPieCtrl();

	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	

    
	InitGpio();
    SDA1;
	SCL1;

    t=0;

    s=ByteWrite(0,0x12);
    delay(10000);
    s=ByteRead(0,&t);
    a=0;//设断点,看变量t的值

    s=ByteWrite(1,0x34);
    delay(10000);
    s=ByteRead(1,&t);
	a=1; //设断点

	s=ByteWrite(2,0x56);
	delay(10000);
    s=ByteRead(2,&t);
	a=2; //设断点

	s=ByteWrite(3,0x78);
	delay(10000);
    s=ByteRead(3,&t);
	a=3; //设断点


	for(;;);

} 	

void delay(unsigned int t)
{
  while(t>0) t--;
  
}



//总线无效期间二线全为主高,总线有效期间时钟线为低,一个高低跳变为一个时钟
//周期,时钟线为低时才能改变数据线状态,若时钟线为高时改变数据线状态,则只
//能是开始或结束总线操作

unsigned char ack;	         	/*应答标志位*/
   

/*******************************************************************
                     起动总线函数   
时钟线在高电平时,数据线从高向低的跳变开始总线,最终二线全变低            
函数原型: void  Start_I2c();  
功能:     启动I2C总线,即发送I2C起始条件.  
********************************************************************/
void Start_I2c()
{
  SDA1;   		/*先跳高,为稍后的从高向低跳作准备*/
  delay(60);
  SCL1;
  delay(500);   /*起始条件建立时间大于4.7us,延时*/
  SDA0;   		/*发送起始信号*/
  delay(60);    /* 起始条件锁定时间大于4μs*/ 
  SCL0;   		/*钳住I2C总线,准备发送或接收数据 */
  delay(60); 
}


/*******************************************************************
                      结束总线函数   
时钟线在低电平时,数据线从低向高的跳变结束总线,最终二线都变高            
函数原型: void  Stop_I2c();  
功能:     结束I2C总线,即发送I2C结束条件.  
********************************************************************/
void Stop_I2c()
{
  SDA0;  		/*先跳低,为稍后的从低向高跳变作准备*/
  delay(60); 
  SCL1;  		/*发送结束条件的时钟信号,结束条件建立时间大于4μs*/
  delay(60);
  SDA1;  		/*发送I2C总线结束信号*/
  delay(60); 
}



/*******************************************************************
                 字节数据发送函数               
函数原型: void  SendByte(uchar c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
          此状态位进行操作.(不应答或非应答都使ack=0)     
     	  发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
unsigned char   SendByte(uchar c)
{
 uchar BitCnt,t[8];
 for(BitCnt=0;BitCnt<8;BitCnt++)  	/*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80)
        t[BitCnt]=1;   				/*判断发送位*/
     else  
       t[BitCnt]=0;  
	}
	 
	 SCL0;
	 delay(4); 

 for(BitCnt=0;BitCnt<8;BitCnt++)  	/*要传送的数据长度为8位*/
    { SCL0;
     if(t[BitCnt])SDA1;   			/*判断发送位*/
       else  SDA0;                
     delay(60);
     SCL1;               		/*置时钟线为高,通知被控器开始接收数据位*/ 
     delay(60);             	/*保证时钟高电平周期大于4μs*/
       
     // if((BitCnt==7) && t[BitCnt])
	//	SDAIN;  //设为输入 	              
    }         
	 
    SCL0;
	SDAIN;  //设为输入
    delay(60); 	  
     SCL1; 

    if(SDADATA)ack=1;    		//没有收到应答信号 
       else ack=0;        		//收到应答信号


	delay(60); 
    SCL0;
    delay(60); 	
	SDAOUT; 					//重新设为输出
	 
	
	return ack;
}




/*******************************************************************
                 字节数据接收函数               
函数原型: uchar  RcvByte();
功能:  	  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
          发完后请用应答函数应答从机。  
********************************************************************/	
uchar  RcvByte()
{
  uchar retc;
  uchar BitCnt;
  
  retc=0; 
  SCL0;                       	//先将时钟线拉低

  SDAIN;             			/*置数据线为输入方式*/
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {      
        SCL0;                  	/*置时钟线为低,准备接收数据位*/
        delay(60);             	/*时钟低电平周期大于4.7μs*/      
        SCL1;                  	/*置时钟线为高使数据线上数据有效*/
        retc=retc<<1;
        if(SDADATA)
		   retc=retc+1;  		/*读数据位,接收的数据位放入retc中 */
        delay(60); 
      }
  SCL0; //从器件数据输了阶段在这一位后没有响应,数据线补外部上拉电阻临时拉为高
  
  delay(60);
  SDAOUT;
  return(retc);
  
}



/*******************************************************************
                 接口函数                                   
*******************************************************************/


unsigned char ByteRead(unsigned int add,unsigned char *temp)
{ 
	unsigned char rt;
  	rt=0;
  	Start_I2c();               	/*启动总线*/
  	if(SendByte(0xa0))         	/*发送写命令*/
    	rt=1;
  	if(SendByte(add>>8))      	//发送地址
    	rt= 2;
  	if(SendByte(add))     		//发送地址
    	rt= 3;
  	Start_I2c();               	/*启动总线*/
  	if(SendByte(0xa1))   		//发送读命令 
   		rt= 4;
   
  	*temp=RcvByte();
	
  	Stop_I2c();                	/*结束总线*/ 
  
  	return rt;
}

unsigned char ByteWrite(unsigned int add,unsigned char dat)
{ 

	unsigned char rt;
  	rt=0;
  	Start_I2c();               /*启动总线*/
  	if(SendByte(0xa0))         /*发送写命令*/
    	rt= 1;
  	if(SendByte(add>>8))      //发送地址
    	rt= 2;
  	if(SendByte(add))     //发送地址
    	rt= 3;
  	if(SendByte(dat) )  
   		rt= 4;
	
  Stop_I2c();                /*结束总线*/ 
  
  return rt;
}


//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -