📄 i2c eeprom.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 + -