Files
Power-Pico/software/Power_Pico/BSP/EEPROM/BL24C02.c
不吃油炸鸡 495baa3905 update
2026-02-26 17:20:03 +08:00

191 lines
4.1 KiB
C

#include "BL24C02.h"
#include "i2c.h"
// hardware settings
#include "lcd_init.h"
typedef struct {
uint8_t backlight_level; // 0-100
uint8_t key_sound_enable; // 0:disable, 1:enable
uint8_t language_select; // 0:English, 1:Chinese
uint16_t rotation; // 0, 90, 180, 270
} SysSettings_T;
static SysSettings_T sys_settings = {
.backlight_level = 50,
.key_sound_enable = 1,
.language_select = 0,
.rotation = 0
};
static void BL24C02_Write(uint8_t addr, uint16_t length, uint8_t buff[])
{
HAL_I2C_Mem_Write(&hi2c1, BL24C02_ADDRESS<<1, addr, I2C_MEMADD_SIZE_8BIT, buff, length, 10);
}
static void BL24C02_Read(uint8_t addr, uint8_t length, uint8_t buff[])
{
HAL_I2C_Mem_Read(&hi2c1, BL24C02_ADDRESS<<1, addr, I2C_MEMADD_SIZE_8BIT, buff, length, 10);
}
static void delay_ms(uint32_t ms)
{
HAL_Delay(ms);
}
/******************************************
EEPROM Data description:
[0x00]: 0x55 for check
[0x01]: 0xAA for check
[0x10]: user backlight_level setting
[0x11]: user key_sound_enable setting
[0x12]: user language_select setting
[0x13-14]: user rotation setting
[0x20-]: update command storage area, "update\r\n"
*******************************************/
// to check the Data is right and the EEPROM is working, 0-ok, 1-erro
uint8_t EEPROM_Init_Check(void)
{
uint8_t check_buff[2];
delay_ms(10);
BL24C02_Read(0,2,check_buff);
if(check_buff[0] == 0x55 && check_buff[1] == 0xAA)
{
return 0;//check OK
}
else
{
check_buff[0] = 0x55;
check_buff[1] = 0xAA;
delay_ms(10);
BL24C02_Write(0,2,check_buff);
memset(check_buff,0,2);
delay_ms(10);
BL24C02_Read(0,2,check_buff);
if(check_buff[0] == 0x55 && check_buff[1] == 0xAA)
return 0;//check ok
}
return 1;//check erro
}
// to Save the settings
void EEPROM_SysSetting_Save(void)
{
uint8_t buff[5];
buff[0] = sys_settings.backlight_level;
buff[1] = sys_settings.key_sound_enable;
buff[2] = sys_settings.language_select;
buff[3] = (uint8_t)(sys_settings.rotation & 0x00FF);
buff[4] = (uint8_t)((sys_settings.rotation >> 8) & 0x00FF);
BL24C02_Write(0x10,5,buff);
}
// to Get the settings
void EEPROM_SysSetting_Get(void)
{
uint8_t buff[5];
BL24C02_Read(0x10,5,buff);
// 判断是否在范围内
if(buff[0] <= 100)
sys_settings.backlight_level = buff[0];
else
sys_settings.backlight_level = 60;
if(buff[1] <= 1)
sys_settings.key_sound_enable = buff[1];
else
sys_settings.key_sound_enable = 1;
if(buff[2] <= 1)
sys_settings.language_select = buff[2];
else
sys_settings.language_select = 0;
uint16_t rotation = (uint16_t)buff[3] | ((uint16_t)buff[4] << 8);
if(rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270)
sys_settings.rotation = rotation;
else
sys_settings.rotation = 180;
}
// to write the update command
void EEPROM_UpdateCommand_Write(bool is_update)
{
if(is_update) {
char cmd[] = "update\r\n";
BL24C02_Write(0x20, strlen(cmd), (uint8_t *)cmd);
} else {
char cmd[] = "-nope-\r\n";
BL24C02_Write(0x20, strlen(cmd), (uint8_t *)cmd);
}
}
// to check the update command
bool EEPROM_UpdateCommand_Check(void)
{
char cmd[10] = {0};
BL24C02_Read(0x20, 8, (uint8_t *)cmd);
if(strcmp(cmd, "update\r\n") == 0) {
return true;
} else {
return false;
}
}
// Set functions
void Sys_Set_BacklightLevel(uint8_t level)
{
if(level <= 100 && level >= 0) {
sys_settings.backlight_level = level;
LCD_Set_Light(level);
}
}
void Sys_Set_KeySoundEnable(bool enable)
{
if(enable) {
sys_settings.key_sound_enable = 1;
} else {
sys_settings.key_sound_enable = 0;
}
}
void Sys_Set_LanguageSelect(uint8_t lang)
{
if(lang <= 1) {
sys_settings.language_select = lang;
}
}
void Sys_Set_Rotation(uint16_t rotation)
{
if(rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270) {
sys_settings.rotation = rotation;
LCD_SetRotation(rotation);
}
}
// Get functions
uint8_t Sys_Get_BacklightLevel(void)
{
return sys_settings.backlight_level;
}
uint8_t Sys_Get_KeySoundEnable(void)
{
return sys_settings.key_sound_enable;
}
uint8_t Sys_Get_LanguageSelect(void)
{
return sys_settings.language_select;
}
uint16_t Sys_Get_Rotation(void)
{
return sys_settings.rotation;
}