在LPC2103平台软件包基础上实现I2C读写24c02的一些经验

 

 

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值