You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
4.6 KiB
176 lines
4.6 KiB
#ifndef EEPROM_H_
|
|
#define EEPROM_H_
|
|
/*
|
|
* 两种方法:
|
|
* 一种直接调用读写多字节, 多任务下可能导致阻塞
|
|
* 一种设置size send_buf 实现
|
|
*/
|
|
#include "main.h"
|
|
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
#include "main.h"
|
|
#include "cmsis_os.h"
|
|
#include "bsp_i2c.h"
|
|
#include "elog.h"
|
|
|
|
#define EEPROM_BYTE_DELAY_ENABLE 1
|
|
#define EEPROM_WRITE_ADDRESS 0xA0
|
|
#define EEPROM_READ_ADDRESS 0xA1
|
|
|
|
typedef enum {
|
|
EEPROM_EVT_WRITE,
|
|
EEPROM_EVT_READ,
|
|
EEPROM_EVT_WRITE_BYTE_DELAY,
|
|
}EEPROM_EVT_TypeDef;
|
|
|
|
typedef enum {
|
|
EEPROM_STATE_READY,
|
|
EEPROM_STATE_WRITE,
|
|
EEPROM_STATE_READ,
|
|
}EEPROM_STATE_TypeDef;
|
|
|
|
typedef enum {
|
|
EEPROM_MEM_ADDR_TYPE_Bit8,
|
|
EEPROM_MEM_ADDR_BIT_TYPE_Bit16,
|
|
}EEPROM_MEM_ADDR_TypeDef;
|
|
|
|
typedef enum {
|
|
EEPROM_MEM_ADDR_BIT_8,
|
|
EEPROM_MEM_ADDR_BIT_16,
|
|
}EEPROM_MEM_ADDR_BIT_TypeDef;
|
|
|
|
typedef enum {
|
|
EEPROM_DEV_ADDR_BIT_8,
|
|
EEPROM_DEV_ADDR_BIT_10,
|
|
} EEPROM_DEV_ADDR_TypeDef;
|
|
|
|
typedef enum {
|
|
AT24C01 =127, // 8bit mem_addr
|
|
AT24C02 =255,
|
|
AT24C04 =511, // 16bit mem_addr,先发 high8 后 low8
|
|
AT24C08 =1023,
|
|
AT24C16 =2047,
|
|
AT24C32 =4095,
|
|
AT24C64 =8191,
|
|
AT24C128 =16383,
|
|
AT24C256 =32767,
|
|
}EEPROM_MODEL_TypeDef;
|
|
|
|
// typedef void (*read_callback)();
|
|
// typedef void (*write_callback)();
|
|
|
|
extern I2C_HELPER_TypeDef *eeprom_helper;
|
|
|
|
typedef enum {
|
|
EEPROM_WORK_STATE_WAITING,
|
|
EEPROM_WORK_STATE_READY,
|
|
EEPROM_WORK_STATE_Writing,
|
|
EEPROM_WORK_STATE_WRITE_Waiting,
|
|
EEPROM_WORK_STATE_Reading,
|
|
EEPROM_WORK_STATE_ERROR,
|
|
EEPROM_WORK_STATE_STOP
|
|
}EEPROM_WORK_STATE_TypeDef;
|
|
|
|
typedef struct
|
|
{
|
|
void (*init)(void);
|
|
void (*port)(void) ;
|
|
int (*test)(void);
|
|
|
|
EEPROM_MODEL_TypeDef model; // AT24C01 AT24C02 AT24C256
|
|
uint16_t mem_addr_size;
|
|
EEPROM_DEV_ADDR_TypeDef dev_addr;
|
|
uint8_t page_addr;
|
|
uint8_t write_delay_ms;
|
|
uint32_t size;
|
|
uint8_t *buf;
|
|
volatile EEPROM_WORK_STATE_TypeDef state;
|
|
}My_EEPROM_TypeDef;
|
|
|
|
extern My_EEPROM_TypeDef my_eeprom;
|
|
|
|
void Eeprom_Init( );
|
|
|
|
void Eeprom_Port( );
|
|
void Eeprom_Task( );
|
|
int Eeprom_Test( void );
|
|
|
|
int Eeprom_callback(My_EEPROM_TypeDef *pEeprom, uint8_t *buf, uint16_t size);
|
|
|
|
// int Eeprom_SET_WorkMode( uint16_t mem_addr_type);
|
|
int Eeprom_SET_Device_Model(EEPROM_MODEL_TypeDef model);
|
|
int Eeprom_SET_Write_Delay_ms( uint8_t write_delay_ms);
|
|
|
|
// int Eeprom_Transmit(EEPROM_TypeDef *eeprom, uint8_t * buf, uint16_t size);
|
|
// int Eeprom_Begin_Rcv(EEPROM_TypeDef *eeprom, uint8_t * buf, uint16_t size);
|
|
|
|
int Eeprom_Read( uint8_t * buf, uint16_t size );
|
|
int Eeprom_Write( uint8_t * buf, uint16_t size );
|
|
|
|
// void Eeprom_Set_Sendbuf_Size(EEPROM_TypeDef *eeprom, uint8_t * buf, uint16_t size);
|
|
|
|
|
|
// #ifdef EEPROM_BYTE_DELAY_ENABLE
|
|
// int Eeprom_Write_By_Byte_Delay(EEPROM_TypeDef *eeprom, uint8_t * buf, uint16_t size);
|
|
|
|
// int Eeprom_callback(My_EEPROM_TypeDef *pEeprom, uint8_t *buf, uint16_t size);
|
|
|
|
// #endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
*
|
|
* @brief 用非阻塞方法写 EEPROM 会写不进去--> 写数据到EEPROM,每个字节加5-8ms 延时
|
|
* 还是用阻塞的方法区写, 读可以考虑非阻塞 --> IT DMA
|
|
* 不用 i2chelper 直接用hi2c,
|
|
*
|
|
* Eeprom_SET_Mem_Addr 设置eeprom数据地址
|
|
* Eeprom_Set_Sendbuf_Size 设置buf size 进行写入 EEprom
|
|
*
|
|
* 读取
|
|
* Eeprom_SET_Mem_Addr 设置eeprom数据地址
|
|
* HAL_I2C_Mem_Read
|
|
* @details
|
|
*
|
|
* uint8_t buf1[4] ={0x05, 0x03 , 0x04, 0x05};
|
|
uint8_t buf2[4] = {0x08,0x08,0x08,0x08} ;
|
|
int st;
|
|
// Eeprom_Set_Sendbuf_Size(eeprom, buf1, 4);
|
|
// my_eeprom.port();
|
|
Eeprom_SET_Mem_Addr( eeprom, 0 );
|
|
st = HAL_I2C_Mem_Write(eeprom->hi2c, eeprom->dev_addr, eeprom->mem_addr, eeprom->mem_addr_type, buf1, 4, eeprom->write_delay_ms);
|
|
osDelay( 10 );
|
|
// Eeprom_Read( eeprom, buf2, 4);
|
|
// st = HAL_I2C_Mem_Read(eeprom->hi2c, eeprom->dev_addr, eeprom->mem_addr, eeprom->mem_addr_type, buf2, 4, eeprom->write_delay_ms);
|
|
|
|
Eeprom_SET_Mem_Addr( eeprom, 0 );
|
|
if ( Eeprom_Read(eeprom, buf2, 4) != 0 )
|
|
{
|
|
log_i(" Eeprom Read Config Error ");
|
|
}else{
|
|
log_i(" Eeprom Read Config OK! ");
|
|
}
|
|
|
|
osDelay(10);
|
|
log_i( "buf2 %d %d ", buf2[0] , buf2[1]);
|
|
|
|
uint8_t buf1[24] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09,0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09,0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
|
|
uint8_t buf2[24] ={0};
|
|
my_eeprom.buf = buf1;
|
|
my_eeprom.size = 24;
|
|
my_eeprom.state = EEPROM_WORK_STATE_Writing;
|
|
|
|
while(my_eeprom.size != 0) { osDelay(2);};
|
|
log_i("write ok....");
|
|
|
|
HAL_Delay(200);
|
|
my_eeprom.state = EEPROM_WORK_STATE_Reading;
|
|
*/
|
|
|