EEPROM.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "config.h"
  2. #include "eeprom.h"
  3. //========================================================================
  4. // 函数: void ISP_Disable(void)
  5. // 描述: 禁止访问ISP/IAP.
  6. // 参数: non.
  7. // 返回: non.
  8. // 版本: V1.0, 2012-10-22
  9. //========================================================================
  10. void DisableEEPROM(void)
  11. {
  12. IAP_CONTR = 0; //禁止IAP操作
  13. IAP_CMD = 0; //去除IAP命令
  14. IAP_TRIG = 0; //防止IAP命令误触发
  15. IAP_ADDRH = 0xff; //清0地址高字节
  16. IAP_ADDRL = 0xff; //清0地址低字节,指向非EEPROM区,防止误操作
  17. }
  18. //========================================================================
  19. // 函数: void EEPROM_Trig(void)
  20. // 描述: 触发EEPROM操作.
  21. // 参数: none.
  22. // 返回: none.
  23. // 版本: V1.0, 2014-6-30
  24. //========================================================================
  25. void EEPROM_Trig(void)
  26. {
  27. F0 = EA; //保存全局中断
  28. EA = 0; //禁止中断, 避免触发命令无效
  29. IAP_TRIG = 0x5A;
  30. IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
  31. //送完A5H后,IAP命令立即被触发启动
  32. //CPU等待IAP完成后,才会继续执行程序。
  33. _nop_();
  34. _nop_();
  35. EA = F0; //恢复全局中断
  36. }
  37. //========================================================================
  38. // 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  39. // 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
  40. // 参数: EE_address: 读出EEPROM的首地址.
  41. // DataAddress: 读出数据放缓冲的首地址.
  42. // number: 读出的字节长度.
  43. // 返回: non.
  44. // 版本: V1.0, 2012-10-22
  45. //========================================================================
  46. void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  47. {
  48. IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  49. IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
  50. do
  51. {
  52. IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
  53. IAP_ADDRL = EE_address % 256; //送地址低字节
  54. EEPROM_Trig(); //触发EEPROM操作
  55. *DataAddress = IAP_DATA; //读出的数据送往
  56. EE_address++;
  57. DataAddress++;
  58. }while(--number);
  59. DisableEEPROM();
  60. }
  61. //========================================================================
  62. // 函数: void EEPROM_SectorErase(u16 EE_address)
  63. // 描述: 把指定地址的EEPROM扇区擦除.
  64. // 参数: EE_address: 要擦除的扇区EEPROM的地址.
  65. // 返回: non.
  66. // 版本: V1.0, 2013-5-10
  67. //========================================================================
  68. void EEPROM_SectorErase(u16 EE_address)
  69. {
  70. IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  71. IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
  72. //只有扇区擦除,没有字节擦除,512字节/扇区。
  73. //扇区中任意一个字节地址都是扇区地址。
  74. IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
  75. IAP_ADDRL = EE_address % 256; //送扇区地址低字节
  76. EEPROM_Trig(); //触发EEPROM操作
  77. DisableEEPROM(); //禁止EEPROM操作
  78. }
  79. //========================================================================
  80. // 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  81. // 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
  82. // 参数: EE_address: 写入EEPROM的首地址.
  83. // DataAddress: 写入源数据的缓冲的首地址.
  84. // number: 写入的字节长度.
  85. // 返回: non.
  86. // 版本: V1.0, 2012-10-22
  87. //========================================================================
  88. void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  89. {
  90. IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  91. IAP_WRITE(); //宏调用, 送字节写命令
  92. do
  93. {
  94. IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
  95. IAP_ADDRL = EE_address % 256; //送地址低字节
  96. IAP_DATA = *DataAddress; //送数据到IAP_DATA,只有数据改变时才需重新送
  97. EEPROM_Trig(); //触发EEPROM操作
  98. EE_address++; //下一个地址
  99. DataAddress++; //下一个数据
  100. }while(--number); //直到结束
  101. DisableEEPROM();
  102. }