不含stm32 底层的代码
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.
MyStm32Code/device/Inc/eeprom.h

167 lines
5.1 KiB

2 years ago
#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]);
*/