注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
billbot501的个人空间 https://home.eeworld.com.cn/space-uid-274536.html [收藏] [复制] [分享] [RSS]
日志

分享ARM7学习经验—I2C操作EEPROM-24C04(七)

已有 2526 次阅读2011-4-11 08:25 |个人分类:LPC21XX

I2C是一种两线串行总线,结构简单,可以直接使用导线连接各个设备,简化系统的硬件设计.需要注意的是I2C接口为开漏输出,需要上来电阻.

程序设计的步骤分别为

1初始化端口功能和I2C时钟设置

PINSEL0=(PINSEL0&0xffffff0f)|0x50;    /*设置I2C控制口有效*/

       /* 设置I2C时钟为100KHz */

   // 晶振为12MHzFpclk = 15MHz,I2C时钟速率=15M/30=100k

   I2C0SCLH=(FOSC/FI2C0+1)/2;                  /*设置I2C时钟为fi2c*/

   I2C0SCLL=(FOSC/FI2C0)/2;

   I2C0CONCLR = STA|SI|AA|STO;

   I2C0CONSET = I2CEN;                  //I2EN=1,使能I2C功能

2 根据寄存器说明和I2C时序要求写好发送函数与接收函数

/*************************发送起始信号*********************/

void I2C_Start(void)

{

  I2C0CONSET = STA;                    //启动发送START脉冲

//I2CONSET=SI;                     //发送完起始位会自动置1

  do{}while(0x08!=I2C0STAT);        //等待完成start脉冲发送

  I2C0CONCLR = STA;                    //清除STA,结束过程

}

 

/*****************发送结束信号*********************/

void I2C_Stop(void)

{

  I2C0CONSET = STO;                    //启动发送STop脉冲,STO位是自动清除的.不必判断是否结束

  I2C0CONCLR = SI;                     //只能清除SI,清除STO还是会有影响,STO同时清除,返回到初始化的状态

}

 

/************************延时*********************************/

void  DelayMs(unsigned int  dly)

{  unsigned int  i;

 

   for(; dly>0; dly--)

      for(i=0; i<1000; i++);

}

 

/***************8位数据*****************************/

void WriteByte(unsigned char data)

{

  I2C0DAT = data;

  I2C0CONCLR = SI;                     //启动发送

}

 

/***************写器件地址和读写信号*****************************/

void WriteAddr(unsigned char ReadMode)

{

  WriteByte(C02MasterAddr+ReadMode);

  if(ReadMode)  do{}while(I2C0STAT!=0x40); //等待器件地址和读信号完成

  else   do{}while(I2C0STAT!=0x18);        //等待器件地址和写信号完成

}

 

 

/***************写数据*****************************/

void WriteData(unsigned char data)

{

  WriteByte(data);

  do{}   while(I2C0STAT!=0x28);            //等待写数据完成

}

 

/***************8位数据*****************************/

unsigned char ReadByte(unsigned char last)                       //last:最后一位数据

{

  if(last)

  {

    I2C0CONCLR=AA;

    I2C0CONCLR=SI;                   //启动接收最后数据

    do{}while(I2C0STAT!=0X58);

  }

  else

  {

    I2C0CONSET=AA;

    I2C0CONCLR=SI;                   //启动接收数据

    do{}while(I2C0STAT!=0X50);

  }

  return I2C0DAT;

}

/***************num个字节到24c02*****************************/

void WriteC02(unsigned char num)

{

  unsigned char i=0;

  I2C_Start();

  WriteAddr(WRMode);                   //写地址和写模式

  WriteData(C02SlaveAddr);             //24c02的存储地址

  //for(i=0;i<4;i++)  I2C_buf1[i]=i+5;   //I2C_buf初始化

  for(i=0;i<num;i++)

  {

    WriteData(I2C_buf1[i]);

  }

  I2C_Stop();

  DelayMs(10);                       // 延时等待eeprom写操作

  //把写到I2C上的数据在串口上打印出来

  DelayMs(100);

  puts(" \nWrite to I2C BUS:");

  for(i=0;i<num;i++)

  {

    putchar(I2C_buf1[i]);

    puts("\n");

  }

}

/******************24c02地址读num个字节数据************/

void ReadC02(unsigned char num)

{

  unsigned char i=0;

  I2C_Start();

  WriteAddr(WRMode);

  WriteData(C02SlaveAddr);

  I2C_Stop();

 

  I2C_Start();

  WriteAddr(RDMode);

  for(i=0;i<num;i++) I2C_buf2[i]=0;//0

  for(i=0;i<num-1;i++)

  {

    I2C_buf2[i]=ReadByte(!lastbyte);

  }

  I2C_buf2[num]=ReadByte(lastbyte);

  I2C_Stop();

  //把从I2C上读到的数据在串口上打印出来

   puts(" \nRead form I2C BUS:\n");

  for(i=0;i<num;i++)

  {

    putchar(I2C_buf2[i]);

    puts("\n");

  }

}

下面我们就往24C04写入EEWORLD这几个字,再读出来.

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章