首页 » 业界动态 » 24C64 EEPROM读写的C语言程序

24C64 EEPROM读写的C语言程序

作者:  时间:2009-06-21 23:28  来源:
/*24C64子程序 */
bit   I2C_Start(void);
void  I2C_Stop(void);
void  I2C_Ack(void);
void  I2C_Nack(void);
bit   I2C_Send_Byte( uchar);
uchar I2C_Receive_Byte(void);
void  AT24C64_R(void *mcu_address,uint AT24C64_address,uint count);
void  AT24C64_W(void *mcu_address,uint AT24C64_address,uint count);
void  Delay_10_uS(void)
{
 char i=10;
 while(i--);
}
void Delay_N_mS( uint n_milisecond)  /* n mS delay */
{
 uchar i;
 while(n_milisecond--)
 {
  i=37;
  while(i--);
 }
}
bit I2C_Start(void)
{
 Delay_10_uS();
 I2C_SDA =1;
 Delay_10_uS();
 I2C_SCK =1;
 Delay_10_uS();
 if ( I2C_SDA == 0) return 0;
 if ( I2C_SCK == 0) return 0;
 I2C_SDA = 0;
 Delay_10_uS();
 I2C_SCK = 0;
 Delay_10_uS();
 return 1;
}
void  I2C_Stop(void)
{
 Delay_10_uS();
 I2C_SDA = 0;
 Delay_10_uS();
 I2C_SCK = 1;
 Delay_10_uS();
 I2C_SDA = 1;
 Delay_10_uS();
}
void I2C_Ack(void)
{
 Delay_10_uS();
 I2C_SDA=0;
 Delay_10_uS();
 I2C_SCK=1;
 Delay_10_uS();
 I2C_SCK=0;
 Delay_10_uS();
}
void I2C_Nack(void)
{
 Delay_10_uS();
 I2C_SDA=1;
 Delay_10_uS();
 I2C_SCK=1;
 Delay_10_uS();
 I2C_SCK=0;
 Delay_10_uS();
}
bit I2C_Send_Byte( uchar d)
{
 uchar i = 8;
 bit bit_ack;
 while( i-- )
 {
  Delay_10_uS();
  if ( d &0x80 )   I2C_SDA =1;
  else             I2C_SDA =0;
  Delay_10_uS();
  I2C_SCK = 1;
  Delay_10_uS();
  I2C_SCK = 0;
  d = d << 1;
 }
 Delay_10_uS();
 I2C_SDA = 1;
 Delay_10_uS();
 I2C_SCK = 1;
 Delay_10_uS();
 bit_ack = I2C_SDA;
 I2C_SCK =0;
 Delay_10_uS();
 return bit_ack;
}
uchar I2C_Receive_Byte(void)
{
 uchar i = 8, d;
 Delay_10_uS();
 I2C_SDA = 1;
 while ( i--)
 {
  d = d << 1;
  Delay_10_uS();
  I2C_SCK =1;
  if ( I2C_SDA ) d++;
  Delay_10_uS();
  I2C_SCK =0;
 }
 return d;
}
void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count)
{
 DOG_WDI=!DOG_WDI;
 DOGTIME=0;
 while(count--)
 {
  I2C_Start();
  /*I2C_Send_Byte( 0xa0 + AT24C64_address /256 *2);*/  /* 24C16  USE */
  I2C_Send_Byte( 0xa0 );
  I2C_Send_Byte(  AT24C64_address/256 );
  I2C_Send_Byte( AT24C64_address %256 );
  I2C_Send_Byte( *(uchar*)mcu_address );
  I2C_Stop();
  Delay_N_mS(10);       /* waiting for write cycle to be completed */
  ((uchar*)mcu_address)++;
  AT24C64_address++;
 }
}
void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count)
{
 DOG_WDI=!DOG_WDI;
 DOGTIME=0;
 while(count--)
 {
  I2C_Start();
  /*I2C_Send_Byte( 0xa0 + AT24C64_address / 256 *2 );*/   /* 24C16 USE */
  I2C_Send_Byte( 0xa0 );
  I2C_Send_Byte( AT24C64_address/256 );
  I2C_Send_Byte( AT24C64_address % 256 );
  I2C_Start();
  /*I2C_Send_Byte( 0xa1 + AT24C64_address /256 *2 );*/
  I2C_Send_Byte( 0xa1 );
  *(uchar*)mcu_address = I2C_Receive_Byte();
  I2C_Nack();
  I2C_Stop();
  ((uchar*)mcu_address)++;
  AT24C64_address++;
 }
}

相关推荐

基于STM8S微处理器内部EEPROM的数据存储方法

EEPROM  微处理器  2011-08-05

意法半导体(ST)推具快速写入功能存储器产品

ST  EEPROM  2011-07-13

安森美半导体扩充串行EEPROM产品阵容

安森美半导体  EEPROM  2011-07-04

I2C总线应用下的EEPROM测试

I2C  EEPROM  24LC02  2011-02-17

Microchip 推出单I/O总线UNI/O EEPROM器件

Microchip  EEPROM  UNI/O  2010-04-07

意法半导体(ST)推出双接口EEPROM,实现电子设备参数无线存取

在线研讨会
焦点