eeprom.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*
  2. * eeprom.h
  3. *
  4. * Created on: 2020. 4. 22.
  5. * Author: parkyj
  6. */
  7. #ifndef EEPROM_H_
  8. #define EEPROM_H_
  9. #define EEPROM_M24C08_ID 0xA0
  10. #define EEPROM_Block0_ADDRESS EEPROM_M24C08_ID
  11. #define EEPROM_ATT_BASE 0x0000 + 96
  12. #if 0 // PYJ.2020.04.25_BEGIN --
  13. #define EEPROM_ATT_DL1_TABLE_ADDRESDS (( EEPROM_ATT_BASE +(sizeof(ATT_TABLE_st)) ) & 0xFFFF) //128
  14. #define EEPROM_ATT_DL2_TABLE_ADDRESDS (( EEPROM_ATT_DL1_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  15. #define EEPROM_ATT_DL3_TABLE_ADDRESDS (( EEPROM_ATT_DL2_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  16. #define EEPROM_ATT_DL4_TABLE_ADDRESDS (( EEPROM_ATT_DL3_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  17. #define EEPROM_ATT_UL1_TABLE_ADDRESDS (( EEPROM_ATT_DL4_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  18. #define EEPROM_ATT_UL2_TABLE_ADDRESDS (( EEPROM_ATT_UL1_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  19. #define EEPROM_ATT_UL3_TABLE_ADDRESDS (( EEPROM_ATT_UL2_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  20. #define EEPROM_ATT_UL4_TABLE_ADDRESDS (( EEPROM_ATT_UL3_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)//128
  21. #define EEPROM_DET_DL1_TABLE_ADDRESDS (( EEPROM_ATT_UL4_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st)+ 2)) & 0xFFFF)
  22. #define EEPROM_DET_DL2_TABLE_ADDRESDS (( EEPROM_DET_DL1_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st)+ 2)) & 0xFFFF)
  23. #define EEPROM_DET_DL3_TABLE_ADDRESDS (( EEPROM_DET_DL2_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st)+ 2)) & 0xFFFF)
  24. #define EEPROM_DET_DL4_TABLE_ADDRESDS (( EEPROM_DET_DL3_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st)+ 2)) & 0xFFFF)
  25. #define EEPROM_DET_UL1_TABLE_ADDRESDS (( EEPROM_DET_DL4_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st) + 4)) & 0xFFFF)
  26. #define EEPROM_DET_UL2_TABLE_ADDRESDS (( EEPROM_DET_UL1_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st)+ 4)) & 0xFFFF)
  27. #define EEPROM_DET_UL3_TABLE_ADDRESDS (( EEPROM_DET_UL2_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st)+ 4)) & 0xFFFF)
  28. #define EEPROM_DET_UL4_TABLE_ADDRESDS (( EEPROM_DET_UL3_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st)+ 4)) & 0xFFFF)
  29. #define EEPROM_TEMP_DL1_TABLE_ADDRESDS (( EEPROM_DET_UL4_TABLE_ADDRESDS + (sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  30. #define EEPROM_TEMP_DL2_TABLE_ADDRESDS (( EEPROM_TEMP_DL1_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  31. #define EEPROM_TEMP_DL3_TABLE_ADDRESDS (( EEPROM_TEMP_DL2_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  32. #define EEPROM_TEMP_DL4_TABLE_ADDRESDS (( EEPROM_TEMP_DL3_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  33. #define EEPROM_TEMP_UL1_TABLE_ADDRESDS (( EEPROM_TEMP_DL4_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  34. #define EEPROM_TEMP_UL2_TABLE_ADDRESDS (( EEPROM_TEMP_UL1_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  35. #define EEPROM_TEMP_UL3_TABLE_ADDRESDS (( EEPROM_TEMP_UL2_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  36. #define EEPROM_TEMP_UL4_TABLE_ADDRESDS (( EEPROM_TEMP_UL3_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st)+12)) & 0xFFFF)
  37. #define EEPROM_USER_ATTEN_VALUE_ADDRESDS (( EEPROM_TEMP_UL4_TABLE_ADDRESDS +( sizeof(USER_ATTEN_st)+16)) & 0xFFFF)
  38. #define EEPROM_WINDOW_STATUS_ADDRESDS ((EEPROM_USER_ATTEN_VALUE_ADDRESDS + (sizeof(BLUESTATUS_st))) & 0xFFFF) //96byte
  39. #define EEPROM_WINDOW_STATUS_ADDRESDS ((EEPROM_ATT_BASE + (sizeof(BLUESTATUS_st))) & 0xFFFF) //96byte
  40. #define EEPROM_ATT_DL1_TABLE_ADDRESDS (( EEPROM_WINDOW_STATUS_ADDRESDS + (sizeof(ATT_TABLE_st)) )& 0xFFFF) //128
  41. #define EEPROM_ATT_DL2_TABLE_ADDRESDS (( EEPROM_ATT_DL1_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  42. #define EEPROM_ATT_DL3_TABLE_ADDRESDS (( EEPROM_ATT_DL2_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  43. #define EEPROM_ATT_DL4_TABLE_ADDRESDS (( EEPROM_ATT_DL3_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  44. #define EEPROM_ATT_UL1_TABLE_ADDRESDS (( EEPROM_ATT_DL4_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  45. #define EEPROM_ATT_UL2_TABLE_ADDRESDS (( EEPROM_ATT_UL1_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  46. #define EEPROM_ATT_UL3_TABLE_ADDRESDS (( EEPROM_ATT_UL2_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)
  47. #define EEPROM_ATT_UL4_TABLE_ADDRESDS (( EEPROM_ATT_UL3_TABLE_ADDRESDS + (sizeof(ATT_TABLE_st)) ) & 0xFFFF)//128
  48. #define EEPROM_DET_DL1_TABLE_ADDRESDS (( EEPROM_ATT_UL4_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st))) & 0xFFFF)
  49. #define EEPROM_DET_DL2_TABLE_ADDRESDS (( EEPROM_DET_DL1_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st))) & 0xFFFF)
  50. #define EEPROM_DET_DL3_TABLE_ADDRESDS (( EEPROM_DET_DL2_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st))) & 0xFFFF)
  51. #define EEPROM_DET_DL4_TABLE_ADDRESDS (( EEPROM_DET_DL3_TABLE_ADDRESDS + (sizeof(DET_TABLEDL_st))) & 0xFFFF)
  52. #define EEPROM_DET_UL1_TABLE_ADDRESDS (( EEPROM_DET_DL4_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st))) & 0xFFFF)
  53. #define EEPROM_DET_UL2_TABLE_ADDRESDS (( EEPROM_DET_UL1_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st))) & 0xFFFF)
  54. #define EEPROM_DET_UL3_TABLE_ADDRESDS (( EEPROM_DET_UL2_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st))) & 0xFFFF)
  55. #define EEPROM_DET_UL4_TABLE_ADDRESDS (( EEPROM_DET_UL3_TABLE_ADDRESDS + (sizeof(DET_TABLEUL_st))) & 0xFFFF)
  56. #define EEPROM_TEMP_DL1_TABLE_ADDRESDS (( EEPROM_DET_UL4_TABLE_ADDRESDS + (sizeof(TEMP_TABLE_st))) & 0xFFFF)
  57. #define EEPROM_TEMP_DL2_TABLE_ADDRESDS (( EEPROM_TEMP_DL1_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st))) & 0xFFFF)
  58. #define EEPROM_TEMP_DL3_TABLE_ADDRESDS (( EEPROM_TEMP_DL2_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st))) & 0xFFFF)
  59. #define EEPROM_TEMP_DL4_TABLE_ADDRESDS (( EEPROM_TEMP_DL3_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st))) & 0xFFFF)
  60. #define EEPROM_TEMP_UL1_TABLE_ADDRESDS (( EEPROM_TEMP_DL4_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st))) & 0xFFFF)
  61. #define EEPROM_TEMP_UL2_TABLE_ADDRESDS (( EEPROM_TEMP_UL1_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st))) & 0xFFFF)
  62. #define EEPROM_TEMP_UL3_TABLE_ADDRESDS (( EEPROM_TEMP_UL2_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st))) & 0xFFFF)
  63. #define EEPROM_TEMP_UL4_TABLE_ADDRESDS (( EEPROM_TEMP_UL3_TABLE_ADDRESDS +( sizeof(TEMP_TABLE_st))) & 0xFFFF)
  64. #endif // PYJ.2020.04.25_END --
  65. #define MAKE_ADDRESS(_addr, _e2) ((uint8_t)EEPROM_M24C08_ADDR | \
  66. ((_e2) ? EEPROM_M24C08_ADDR_E2 : 0) | \
  67. ((uint8_t)((_addr) >> 7) & EEPROM_M24C08_BYTE_ADDR_H))
  68. #define EEPROM_M24C08_ADDR 0xA0 //!< M24C08 device identifier
  69. #define EEPROM_M24C08_ADDR_E2 0x08 //!< M24C08 E2 address bit
  70. #define EEPROM_M24C08_BYTE_ADDR_H 0x06
  71. HAL_StatusTypeDef EEPROM_M24C08_Read(uint8_t devid,uint16_t Address,uint8_t* data,uint16_t size);
  72. HAL_StatusTypeDef EEPROM_M24C08_write(uint8_t devid,uint16_t Address,uint8_t* data,uint16_t size);
  73. HAL_StatusTypeDef EEPROM_M24C08_ByteRead(uint16_t devid,uint16_t Address,uint8_t* data,uint8_t size);
  74. HAL_StatusTypeDef EEPROM_M24C08_Bytewrite(uint16_t devid,uint16_t Address,uint8_t* data,uint8_t size);
  75. HAL_StatusTypeDef EEPROM_M24C08_Zerowrite(uint8_t devid,uint16_t Address);
  76. void EEPROM_M24C08_Init(void);
  77. // Exported type definitions --------------------------------------------------
  78. /**
  79. * The possible states the EEPROM driver can be in.
  80. */
  81. typedef enum
  82. {
  83. EE_UNINIT = 0, //!< Driver has not been initialized
  84. EE_IDLE, //!< Driver has been initialized and is ready to start a transfer
  85. EE_FINISH, //!< Driver has finished with a transfer
  86. EE_READ, //!< Driver is doing a read operation
  87. EE_WRITE_SEND, //!< Driver is writing data
  88. EE_WRITE_WAIT //!< Driver is waiting for the EEPROM to finish a write cycle
  89. } EEPROM_Status;
  90. /**
  91. * The possible outcomes of an operation.
  92. */
  93. typedef enum
  94. {
  95. EE_OK = 0, //!< Indicates success
  96. EE_BUSY, //!< Indicates that the driver is currently busy doing a transfer
  97. EE_ERROR //!< Indicates an error condition
  98. } EEPROM_Error;
  99. /**
  100. * Contains static configuration for the board such as populated peripherals, fitted resistor values and Ethernet MAC
  101. * address, that are stored on the EEPROM.
  102. */
  103. // Macros ---------------------------------------------------------------------
  104. #ifndef LOBYTE
  105. #define LOBYTE(x) ((uint8_t)(x & 0x00FF))
  106. #endif
  107. #ifndef HIBYTE
  108. #define HIBYTE(x) ((uint8_t)((x & 0xFF00) >> 8))
  109. #endif
  110. #define MAKE_ADDRESS(_addr, _e2) ((uint8_t)EEPROM_M24C08_ADDR | \
  111. ((_e2) ? EEPROM_M24C08_ADDR_E2 : 0) | \
  112. ((uint8_t)((_addr) >> 7) & EEPROM_M24C08_BYTE_ADDR_H))
  113. // Constants ------------------------------------------------------------------
  114. /**
  115. * @defgroup EEPROM_M24C08_ADDRESS M24C08 Address definitions
  116. *
  117. * The address byte that is sent to an M24C08 consists of 4 parts:
  118. * + The device identifier {@link EEPROM_M24C08_ADDR} (4 bits)
  119. * + An address bit {@link EEPROM_M24C08_ADDR_E2} that is either set or not, depending on the value of the `E2` pin on
  120. * the M24C08 device
  121. * + The two most significant bits of the memory address to be read/written {@link EEPROM_M24C08_BYTE_ADDR_H}
  122. * + The standard I2C read/write bit
  123. * @{
  124. */
  125. #define EEPROM_M24C08_ADDR 0xA0 //!< M24C08 device identifier
  126. #define EEPROM_M24C08_ADDR_E2 0x08 //!< M24C08 E2 address bit
  127. /**
  128. * Bitmask for the M24C08 I2C Address bits that are used for the high byte of the memory address. The address bits are
  129. * either the high byte shifted left by one or the 16 bit address shifted right by 7 and then masked.
  130. */
  131. #define EEPROM_M24C08_BYTE_ADDR_H 0x06
  132. /** @} */
  133. /**
  134. * Timeout in ms for I2C communication
  135. */
  136. #define EEPROM_I2C_TIMEOUT 0x200
  137. /**
  138. * EEPROM size in bytes
  139. */
  140. #define EEPROM_SIZE 0x400
  141. /**
  142. * Mask for the page address, a page write can only write to addresses which have the same page address
  143. */
  144. #define EEPROM_PAGE_MASK 0x03F0
  145. /**
  146. * Page size of the EEPROM, only one page can be written at a time
  147. */
  148. #define EEPROM_PAGE_SIZE 0x10
  149. /**
  150. * Configuration data offset, that is the first address of the configuration data space
  151. */
  152. #define EEPROM_CONFIG_OFFSET 0
  153. /**
  154. * Size of the configuration data section in bytes
  155. */
  156. #define EEPROM_CONFIG_SIZE 128
  157. /**
  158. * Data offset, that is the first address for arbitrary data
  159. */
  160. #define EEPROM_DATA_OFFSET 0x80
  161. /**
  162. * Size of the data section in bytes, this is the EEPROM size minus the data offset
  163. */
  164. #define EEPROM_DATA_SIZE (EEPROM_SIZE - EEPROM_DATA_OFFSET)
  165. /**
  166. * Size of the settings buffer in bytes
  167. */
  168. #define EEPROM_SETTINGS_SIZE 64
  169. // Exported functions ---------------------------------------------------------
  170. // ----------------------------------------------------------------------------
  171. #endif /* EEPROM_H_ */