24c02为2K EEPROM存储器,每页可存储8bit*8的数据,共256页。
向24c02写入数据顺序:
1、启动总线
2、发送起始写信号
3、收到应答后发送地址
4、发送数据,应答,直至结束
读取数据顺序:
1、启动总线
2、发送起始写信号
3、收到应答后发送地址
4、收到应答后重新启动总线
5、发送起始读信号
6、接收数据,应答
地址表示方式:第一页或者第一bit都为0x00,第二bit为0x02,第八及第二页都为0x08。
周立功提供的I2C驱动包发送数据,接受数据函数初始化各项值,又中断函数来等待操作,所以每次写、读之间必须有充足的时间,保证上一次的操作已经全部完成。
EEPROM掉电不丢失,故一次调试后内部数据不会复位,下次调试仍然能得到,如必要,每次调试前线讲EEPROM内数据清零。
数组的指针操作:
如定义:int example[32];
则&example == &example[0] == example
&example[5] == example +5
*[example+5] == example[5]
#include "config.h"
#define DATNUM 32
void DelayNS(uint32 dly)
{
uint32 i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
void I2CInit(uint32 Fi2c) //i2c初始化
{
if(Fi2c>400000)
Fi2c = 400000;
PINSEL0 = (PINSEL0&0xffffff0f) | 0x50;
I2SCLH = (Fpclk/Fi2c + 1)/2;
I2SCLL = (Fpclk/Fi2c)/2;
I2CONCLR = 0x2c;
I2CONSET = 0x40;
VICIntSelect = 0x00000000;
VICVectCntl0 = (0x20 | 0x09);
VICVectAddr0 = (uint32)IRQ_I2C;
VICIntEnable = (1<<9);
}
int main (void)
{
uint8 i;
uint8 data_buf[DATNUM]; //数据数组,存放要输出的数据,也作为读回数据的存储位置
uint8 pagen; //数据满页的数量
uint8 bitn; //最后一页的数据数量
PINSEL1 = 0X00000000; //初始化IO
PINSEL0= 0x00000005; //初始化IO
IO0DIR = 0X01000000; //初始化IO
IO0SET = 0X01000000; //初始化IO
IRQEnable(); //开中断
I2CInit(400000); //I2C 初始化
UART0_Init(); //串口初始化,作为调试输出使用
for(i=0;i<DATNUM;i++)
{
data_buf[i]=i+'0'; //初始化数据数组
}
UART0_SendStr(data_buf); //打印数组内容
DelayNS(10);
pagen = DATNUM>>3; //得到将写满的页的数量
bitn = DATNUM&0x07; //得到最后一页未被写满页的数据的数量
for(i=0;i<pagen;i++)
{
I2C_WriteNByte(0xa0,1,i*8,&data_buf[i*8],8); //依次写满PAGEN页
DelayNS(10);
}
I2C_WriteNByte(0xa0,1,i*8,&data_buf[i*8],bitn); //在最后一页写入BITN个数据
DelayNS(10);
for(i=0;i<DATNUM;i++)
{
data_buf[i]='0'; //清空输入数组,方便读取后进行比较
}
UART0_SendStr(data_buf); //打印
// UART0_SendByte('/n');
I2C_ReadNByte(0xa0,1,0x00,data_buf,DATNUM); //读取内容
DelayNS(10);
UART0_SendStr(data_buf); //打印读取到的内容
for(i=0;i<DATNUM;i++)
{
if(data_buf[i]==(i+'0'));
else //不一致,则点亮LED
{
IO0CLR = 0X01000000; //点亮LED
while(1);//return ok?
}
}
while(1)
{
IO0CLR = 0X01000000; //点亮LED
DelayNS(50);
IO0SET = 0X01000000; //熄灭LED,即闪烁
DelayNS(50);
}
return 0;
}