当前位置:   article > 正文

EEPROM驱动详解_eeprom数据多块存储

eeprom数据多块存储

在单片机开发中,经常使用EEPROM作为存储设备保存数据,如何根据数据手册编写驱动,我们以24LC16为例进行分析。

一.分析数据手册

1.1容量的计算

The Microchip Technology Inc. 24AA16/24LC16B (24XX16*) is a 16 Kbit Electrically Erasable PROM,Organized as 8 blocks of 256 bytes (8 x 256 x 8)

解释:16 Kbit 是多少字节的容量 ,1K是1024 16*1024/8=16*128=2048字节。

所以:24C01 容量 1*128=128字节

24C02 容量 2*128=256字节 24C08 容量 8*128=1024字节

1.2 地址空间

24LC16有2048个字节的地址空间,用户在分配地址范围时,地址范围为0x0--0x7ff,手册中写到2048个字节被分成8个块,每个块256字节。那么地址范围中的(9-11位)0-7代表着8个块地址。

二.看写操作时序

开始->写控制字->ACK->写字节地址->ACK- >数据->ACK->结束

 1.开始位的时序

 根据上图可知:

 I2C开始条件:SCL高电平, SDA 由高变低

 I2C结束条件:SCL高电平, SDA 由低变高

  1. void I2CStart()
  2. {
  3. SDA_OUT_high();
  4. SCL_high();
  5. I2CDelay();
  6. SDA_OUT_low();
  7. I2CDelay();
  8. SCL_low();
  9. }

2.写控制字:告诉机是读操作,还是写操作,读写那个块地址

  用户编码地址范围(0-0x7ff)共2048个字节,那么地址0x700的地址,7就是块地址,写控制字时要将块地址写入从机。

 2.1 写函数

  1. static unsigned char I2C_WriteByte(unsigned char byte)
  2. {
  3. unsigned char i;
  4. SDA_OUT();
  5. for(i=0;i<8;i++)
  6. {
  7. if(byte & 0x80)
  8. {
  9. SDA_OUT_high();
  10. }
  11. else
  12. {
  13. SDA_OUT_low();
  14. }
  15. I2CDelay();
  16. SCL_high();
  17. I2CDelay();
  18. SCL_LOW(); //scl=0 data change
  19. byte <<= 1;
  20. }
  21. SDA_in(); //SDA PORT input
  22. I2CDelay();
  23. SCL_high();
  24. I2CDelay();
  25. if(I2C_SDA == 1) //ACK read SDA port
  26. {
  27. SCL_high(); no ack
  28. return 0;
  29. }
  30. SCL_LOW();
  31. I2CDelay();
  32. return 1;
  33. }

使用  I2C_WriteByte()函数 写入控制字I2C_WriteByte(addr);

3.ACK 应答位

当主机给从机写入地址后,要求从机在接收一个字节后产生一个应答,因此主机会产生一个时钟

在这个时钟期间,从机必须把SDA 拉低,并在SCL高电平期间保持住。如果SDA没有拉低就是没有ACK,即NOACK。

  1. static void I2CACK(void)
  2. {
  3. SDA_OUT(); //SDA置输出口
  4. SDA_OUT_low();
  5. I2CDelay();
  6. SCL_high();
  7. I2CDelay();
  8. SCL_low();
  9. I2CDelay();
  10. }
  1. static void I2C_NOACK(void)
  2. {
  3. SDA_OUT(); //SDA置输出口
  4. SDA_OUT_high();
  5. I2CDelay();
  6. SCL_high();
  7. I2CDelay();
  8. SCL_low();
  9. I2CDelay();
  10. }

4.写地址   将数据放在EE的地址,       I2C_WriteByte(data);

5.  I2结束

  1. void I2CStop()
  2. {
  3. SDA_OUT_low();
  4. SCL_high();
  5. I2CDelay();
  6. SDA_OUT_hight();
  7. I2CDelay();
  8. SCL_low();
  9. }

6.一个完整的写函数

  1. static unsigned char write_eeprom(unsigned int addr, void const *buf, unsigned int len)
  2. {
  3. unsigned char w_wait,e2page,SlaveAddr;
  4. unsigned char const *src=(unsigned char *)buf;
  5. e2page = 16;
  6. I2CDelay();
  7. reStart:
  8. SlaveAddr = 0xA0 + (unsigned char)((addr & 0x0700)>>7);
  9. I2CStart();
  10. I2C_WriteByte(SlaveAddr);
  11. I2C_WriteByte((unsigned char)(addr%0x100)))
  12. while(len--)
  13. {
  14. I2C_WriteByte(*src++))
  15. addr++;
  16. if((addr % e2page) == 0)
  17. {
  18. break;
  19. }
  20. }
  21. I2CStop();
  22. DelayMs(5);
  23. if(len != 0xffff)
  24. {
  25. goto reStart;
  26. }
  27. I2CDelay();
  28. SCL_low();
  29. retrun 1;
  30. }

三.看读操作时序进行EE读操作

 读操作时,先写入芯片,要读的地址,然后在读,如上述标计:

1,2步写入写操作控制字及要读的地址;第3步是写入读控制字,数据就可以读出。

读函数代码:

  1. static unsigned char I2C_Recv_byte(void)
  2. {
  3. unsigned char byte;
  4. unsigned char i = 0;
  5. SDA_IN(); //SDA 置输入口
  6. for(i=0;i<8;i++)
  7. {
  8. byte <<= 1;
  9. SCL_high();
  10. I2CDelay();
  11. if(SDA == 1)
  12. {
  13. byte |= 0x01;
  14. }
  15. SCL_LOW();
  16. I2CDelay();
  17. }
  18. return(byte);
  19. }
  20. static unsigned char read_eeprom(unsigned int addr, void *buf, unsigned int len)
  21. {
  22. unsigned char w_wait,SlaveAddr;
  23. unsigned char *dest=(unsigned char *)buf;
  24. I2CDelay();
  25. SlaveAddr = 0xA0 + (unsigned char)((addr & 0x0700)>>7);
  26. I2CStart();
  27. I2C_WriteByte(SlaveAddr))
  28. I2C_WriteByte((unsigned char)(addr%0x100)))
  29. I2CStart();
  30. I2C_WriteByte((SlaveAddr+1)) //read
  31. while(len--)
  32. {
  33. *dest++ = I2C_Recv_byte();
  34. if(n != 0)
  35. {
  36. I2CACK();
  37. }
  38. addr++;
  39. }
  40. I2CNOACK();
  41. I2CStop();
  42. DelayMs(1);
  43. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/461762
推荐阅读
相关标签
  

闽ICP备14008679号