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

📄 i2c eeprom.txt

📁 f2812的i2c及e2prom测试程序
💻 TXT
字号:
#include"DSP281x_Device.h"
#include"DSP281x_Examples.h"
#define CHECKNO 1024
#define PAGENO 32
void Scib_init(void);
void Scib_xmit(int a);
void delay(void);
void I2C_init(void);
void I2C_start(void);
void I2C_stop(void);
void I2C_readmode(void);
void I2C_writemode(void);
void I2C_writeOne(Uint16 data);
Uint16 I2C_readOne(void);
void I2C_checkack(void);
void I2C_returnnoack(void);
void I2C_returnack(void);
void I2C_write(Uint16 addr,Uint16 datanumber);
void I2C_read(Uint16 addr,Uint16 datanumber);

Uint16 Count;
Uint16 tmp[3500]= {0};
Uint16 errbit;

void main(void)
{   
    Uint16 k;
    InitSysCtrl();        //初始化系统控制寄存器、PLL、看门狗和时钟
    
    EALLOW;
    GpioMuxRegs.GPGMUX.all|=0x0030;      //SCIB口功能口
    GpioMuxRegs.GPAMUX.all&=0X3fff; //I2C SDA SCL
    //GpioMuxRegs.GPADIR.bit.GPIOA14=0x01; 
    GpioMuxRegs.GPADIR.bit.GPIOA15=0x01;
    EDIS;   
    
    DINT;                 //禁止和清除所有CPU中断向量表
    
    InitPieCtrl();        //初始化PIE控制寄存器
    
    IER=0x0000;
    IFR=0x0000;
    
    InitPieVectTable();   //初始化中断向量表
    
    Scib_init();
    I2C_init();
    
    for(;;)
    {
       I2C_write(0x00,CHECKNO);
       delay();
       I2C_read(0x00,CHECKNO);
       for(k=0;k<=CHECKNO;k++)
       { Scib_xmit(tmp[k]);
         delay();}
    }
}    

////////////////////////////////////////////////////////////////////////
void I2C_start(void)
{
	Uint16 i; 
    GpioDataRegs.GPASET.bit.GPIOA15 = 1;   //I2CSCL=1;
	for(i=0;i<15;i++) asm(" NOP"); //测下“NOP”的时间(通过对I/O口延迟取反)
    GpioDataRegs.GPASET.bit.GPIOA14 = 1;   //I2CSDA=1;
    for(i=0;i<15*2;i++) asm(" NOP"); 
	GpioDataRegs.GPACLEAR.bit.GPIOA14 = 1; //I2CSDA=0;
    for(i=0;i<15*2;i++) asm(" NOP");
    GpioDataRegs.GPACLEAR.bit.GPIOA15 = 1; //I2CSCL=0;  
    for(i=0;i<15;i++) asm(" NOP");      
}

void I2C_stop(void)
{
	Uint16 i; 
	GpioDataRegs.GPACLEAR.bit.GPIOA14 = 1; //I2CSDA=0;
	for(i=0;i<15*2;i++) asm(" NOP"); 
	GpioDataRegs.GPASET.bit.GPIOA15 = 1;   //I2CSCL=1;
	for(i=0;i<15*2;i++) asm(" NOP");  
    GpioDataRegs.GPASET.bit.GPIOA14 = 1;   //I2CSDA=1;
    for(i=0;i<15;i++) asm(" NOP");
}

void I2C_writeOne(Uint16 data)
{
	Uint16 i;
	Uint16 j=8;
	while(j--)
	{
		if((data&0x80)==0x80)   
			GpioDataRegs.GPASET.bit.GPIOA14 = 1; //I2CSDA=1;
		else
			GpioDataRegs.GPACLEAR.bit.GPIOA14 = 1; //I2CSDA=0;
		for(i=0;i<15;i++) asm(" NOP");
		data<<=1;
		data&=0xff;
		GpioDataRegs.GPASET.bit.GPIOA15 = 1;   //I2CSCL=1; 
		for(i=0;i<15;i++) asm(" NOP");
		GpioDataRegs.GPACLEAR.bit.GPIOA15 = 1; //I2CSCL=0;
    }
}

Uint16 I2C_readOne(void)
{
	Uint16 i;
	Uint16 receivebyte=0;
	Uint16 j=8;
	I2C_readmode();//设置I2CSDA为输入
	while(j--)
    {	
	   GpioDataRegs.GPASET.bit.GPIOA15 = 1;   //I2CSCL=1;
	   if(GpioDataRegs.GPADAT.bit.GPIOA14 == 0)//IF(I2CSDA==0)
			receivebyte=(receivebyte<<1);
	   else
			receivebyte=(receivebyte<<1)|0x01;
	   for(i=0;i<15;i++) asm(" NOP");
	   GpioDataRegs.GPACLEAR.bit.GPIOA15 = 1; //I2CSCL=0;
	   for(i=0;i<15;i++) asm(" NOP");
    }
    I2C_writemode();//设置I2CSDA为输出
	return receivebyte;
}
void I2C_checkack(void)//检查应答位
{
	Uint16 i;
	I2C_readmode();
	for(i=0;i<15;i++) asm(" NOP");
	GpioDataRegs.GPASET.bit.GPIOA15 = 1;   //I2CSCL=1;
	for(i=0;i<15;i++) asm(" NOP");
    while(GpioDataRegs.GPADAT.bit.GPIOA14 == 1)//return noack
    { 
    	errbit=1;
	    goto I2C_out;
    }
	GpioDataRegs.GPACLEAR.bit.GPIOA15 = 1; //I2CSCL=0;
	for(i=0;i<15;i++) asm(" NOP");
	I2C_writemode();
	I2C_out:
	if(errbit==1)
		I2C_stop();	
}

void I2C_returnack(void)
{
	Uint16 i;
	I2C_writemode();
	GpioDataRegs.GPACLEAR.bit.GPIOA14 = 1; //I2CSDA=0;
	for(i=0;i<15;i++) asm(" NOP");
	GpioDataRegs.GPASET.bit.GPIOA15 = 1;   //I2CSCL=1;
	for(i=0;i<15;i++) asm(" NOP");
	GpioDataRegs.GPACLEAR.bit.GPIOA15 = 1; //I2CSCL=0;
	for(i=0;i<15;i++) asm(" NOP");
	I2C_readmode();
}

void I2C_returnnoack(void)
{
	Uint16 i;
	I2C_writemode();
	GpioDataRegs.GPASET.bit.GPIOA14 = 1;   //I2CSDA=1;
	for(i=0;i<15;i++) asm(" NOP");
	GpioDataRegs.GPASET.bit.GPIOA15 = 1;   //I2CSCL=1;
	for(i=0;i<15;i++) asm(" NOP");
	GpioDataRegs.GPACLEAR.bit.GPIOA15 = 1; //I2CSCL=0;
	for(i=0;i<15;i++) asm(" NOP");
}
    
void I2C_readmode(void)
{
	EALLOW;
    GpioMuxRegs.GPADIR.bit.GPIOA14 = 0;   //I2CSDA输入
    EDIS;
}

void I2C_writemode(void)
{
    EALLOW;
    GpioMuxRegs.GPADIR.bit.GPIOA14 = 1;   //I2CSDA输出
    EDIS;
}

void I2C_init(void)
{
	I2C_writemode();
	I2C_start();
	I2C_stop();
	
}

void I2C_write(Uint16 addr,Uint16 datanumber)
{
   Uint16 i;
   for(i=0;i<datanumber/PAGENO;i++)//PAGENO=32为一页的字数,i为页数
   {
   I2C_start();
   I2C_writeOne(0xa0);
   I2C_checkack();
   if(errbit==0)
   {
   	   I2C_writeOne(addr/256);
       I2C_checkack();
       if(errbit==0)
   	   {
   	       I2C_writeOne(addr%256);
           I2C_checkack();
           if(errbit==0)
           {
   			   for(Count=0;Count<PAGENO;Count++)
   			   {
	  			   I2C_writeOne(tmp[i*PAGENO+Count]);
	               I2C_checkack();
	  			   if(errbit==1)
	    		       goto I2C_write_OUT;
               }
               I2C_stop();
               delay();
               addr+=PAGENO;//为下页首地址
           }
           else
              goto I2C_write_OUT;
       }
       else
          goto I2C_write_OUT;
    }
    else
       goto I2C_write_OUT;
   }
 I2C_write_OUT:
   I2C_init();
}

void I2C_read(Uint16 addr,Uint16 datanumber)
{
   I2C_start();
   I2C_writeOne(0xa0);
   I2C_checkack();
   I2C_writeOne(addr/256);
   I2C_checkack();
   I2C_writeOne(addr%256);
   I2C_checkack();
   I2C_start();
   I2C_writeOne(0xa1);
   I2C_checkack();
   for(Count=0;Count<datanumber;Count++)
   {
	  tmp[Count]=I2C_readOne();
	  if(Count==(datanumber-1))
   		  I2C_returnnoack();//页写,最后才加应答信号
   	  else
	  	  I2C_returnack();
   }
   I2C_stop();	
}

void Scib_xmit(int a)
{
  ScibRegs.SCITXBUF=(a&0xff);             //发送数据缓冲寄存器
  while(ScibRegs.SCICTL2.bit.TXRDY!=1){}; //发送缓冲寄存器准备好标志位
}

void Scib_init(void)
{
	
	ScibRegs.SCIFFTX.all =0xE040;         //允许接收,使能FIFO,没有FIFO中断
                                         //清除TXFIFINT,
    ScibRegs.SCIFFRX.all =0x2021;         //使能FIFO接收,清除RXFFINT,16级FIFO
    ScibRegs.SCIFFCT.all =0x0000;         //禁止波特率校验
    ScibRegs.SCICCR.all  =0x0007;         //1个停止位,无校验,禁止自测试,
    									 //空闲地址模式,字长8位    									 																																										
   	ScibRegs.SCICTL1.all =0x0003;        //复位
	ScibRegs.SCICTL2.all =0x0003;  
    ScibRegs.SCIHBAUD    =0x0001;        //设定波特率9600bps
    ScibRegs.SCILBAUD    =0x00E7;        //设定波特率9600bps
	ScibRegs.SCICTL1.all =0x0023;        //退出RESET
}   

void delay(void)
{
	Uint16 i;
	for(i=0;i<0xffff;i++)
	   asm("NOP");
}
//////////////////////////////////////  
 
  
    

⌨️ 快捷键说明

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