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.
167 lines
5.1 KiB
167 lines
5.1 KiB
#ifndef EEPROM_H_
|
|
#define EEPROM_H_
|
|
/*
|
|
* 两种方法:
|
|
* 一种直接调用读写多字节, 多任务下可能导致阻塞
|
|
* 一种设置size send_buf 实现
|
|
*/
|
|
#include "main.h"
|
|
// #include "platform.h"
|
|
#include "i2c.h"
|
|
#include "i2c_helper.h"
|
|
|
|
#include "FreeRTOSConfig.h"
|
|
#include "cmsis_os2.h"
|
|
#include "elog.h"
|
|
|
|
#define EEPROM_BYTE_DELAY_ENABLE 1
|
|
|
|
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)();
|
|
typedef struct
|
|
{
|
|
I2C_HandleTypeDef *hi2c;
|
|
// I2CHelper_TypeDef *i2chelper;
|
|
EEPROM_MODEL_TypeDef model; // AT24C01 AT24C02 AT24C256
|
|
EEPROM_MEM_ADDR_TypeDef mem_addr_type; // 1: 8bit 2: 16bit I2C_MEMADD_SIZE_8BIT I2C_MEMADD_SIZE_16BIT
|
|
// EEPROM_MEM_ADDR_BIT_TypeDef mem_addr_bit; // 1: 7bit 2: 10bit
|
|
EEPROM_DEV_ADDR_TypeDef dev_addr; // 8bit 写地址
|
|
uint8_t page_addr;
|
|
|
|
volatile EEPROM_STATE_TypeDef state;
|
|
uint8_t write_delay_ms; // 5-8ms
|
|
uint32_t time_base; // 从系统获得一个systick的毫秒数
|
|
|
|
uint8_t mode; // polling 0 , it 1, dma 2
|
|
uint8_t writeCplt;
|
|
uint8_t readCplt;
|
|
|
|
// 设置任务参数 发送一个 mem_addr++ send_buf++ size--
|
|
uint8_t *send_buf;
|
|
uint16_t size;
|
|
uint16_t mem_addr;
|
|
uint8_t is_busy;
|
|
uint8_t error;
|
|
|
|
HAL_I2C_StateTypeDef stat;
|
|
}EEPROM_TypeDef;
|
|
extern EEPROM_TypeDef *eeprom;
|
|
|
|
typedef struct
|
|
{
|
|
void (*init)(void);
|
|
void (*deinit)(void);
|
|
void (*port)(void) ;
|
|
EEPROM_MODEL_TypeDef model; // AT24C01 AT24C02 AT24C256
|
|
EEPROM_MEM_ADDR_TypeDef mem_addr_type;
|
|
// EEPROM_MEM_ADDR_BIT_TypeDef data_addr_bit;
|
|
EEPROM_DEV_ADDR_TypeDef dev_addr;
|
|
uint8_t page_addr;
|
|
}My_EEPROM_TypeDef;
|
|
extern My_EEPROM_TypeDef my_eeprom;
|
|
|
|
void Eeprom_Init( );
|
|
void Eeprom_DeInit( );
|
|
void Eeprom_Port( );
|
|
int Eeprom_SET_I2CHelper( EEPROM_TypeDef *eeprom, I2CHelper_TypeDef *i2chelper );
|
|
int Eeprom_SET_Device_Model( EEPROM_TypeDef *eeprom, EEPROM_MODEL_TypeDef model );
|
|
int Eeprom_SET_Device_Addr( EEPROM_TypeDef *eeprom, uint8_t dev_addr );
|
|
int Eeprom_SET_Mem_Addr ( EEPROM_TypeDef *eeprom, uint16_t mem_addr );
|
|
int Eeprom_SET_Mem_Addr_Type( EEPROM_TypeDef *eeprom, EEPROM_MEM_ADDR_TypeDef mem_addr_type );
|
|
int Eeprom_SET_Mem_Addr_Bit_Type( EEPROM_TypeDef *eeprom, EEPROM_MEM_ADDR_BIT_TypeDef mem_addr_bit );
|
|
|
|
int Eeprom_SET_WorkMode( EEPROM_TypeDef *eeprom, I2C_HELPER_MODE_TypeDef mem_addr_type);
|
|
int Eeprom_SET_Write_Delay_ms( EEPROM_TypeDef *eeprom, 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(EEPROM_TypeDef *eeprom, uint8_t * buf, uint16_t size );
|
|
// int Eeprom_Write(EEPROM_TypeDef *eeprom, uint8_t * buf, uint16_t size );
|
|
|
|
void Eeprom_Set_Sendbuf_Size(EEPROM_TypeDef *eeprom, uint8_t * buf, uint16_t size);
|
|
|
|
int Eeprom_Test( );
|
|
|
|
#ifdef EEPROM_BYTE_DELAY_ENABLE
|
|
int Eeprom_Write_By_Byte_Delay(EEPROM_TypeDef *eeprom, 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]);
|
|
*/ |