nongye/STM32F103_App1/HardWare/24C02/24c02.c

232 lines
8.0 KiB
C
Raw Normal View History

#include "24c02.h"
#include "iic.h"
#include "app_loop.h" /* storage_lock/unlock<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʻ<EFBFBD><CABB><EFBFBD> */
#include <string.h>
#include <stdio.h>
/* MQTT <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD> <20><> <20>״<EFBFBD><D7B4>ϵ<EFBFBD><CFB5>Զ<EFBFBD>д<EFBFBD><D0B4> EEPROM
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> main.h <EFBFBD><EFBFBD> MQTT_xxx <EFBFBD><EFBFBD><EFBFBD>֤ȫ<EFBFBD><EFBFBD>Ψһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
*/
MqttInfo_Str MqttInfoStr = {
.ClientID = MQTT_CLIENT_ID,
.Username = MQTT_USERNAME,
.Passward = MQTT_PASSWORD,
.ServerIP = MQTT_SERVER_IP,
.Topic = MQTT_TOPIC,
.ServerPort = MQTT_SERVER_PORT,
.Relay_State = {0},
.Magic = 0, /* <20>״<EFBFBD><D7B4>ϵ<EFBFBD><CFB5><EFBFBD> eepromReadInfo() д<><D0B4> EEPROM_MAGIC */
};
/*-------------------------------------------------*/
/*<2A><>ȡAT24C02ָ<32><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ReadAddr:<3A><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݵĵ<DDB5>ַ */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
uint8_t m24c02ReadOneByte(uint8_t ReadAddr) {
uint8_t receive;
uint8_t err = 0;
iicStart();
err |= iicSendByteAck(M24C02_WADDR);
err |= iicSendByteAck(ReadAddr);
iicStart();
err |= iicSendByteAck(M24C02_RADDR);
if (err) {
iicStop();
log_warn("> EE <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> err=0x%02X", err);
return 0xFF;
}
receive=iicReadByte(0);
iicStop();
HAL_Delay(5);
return receive;
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַд<D6B7><D0B4>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:WriteAddr :д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>Ŀ<EFBFBD>ĵ<EFBFBD>ַ */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:DataToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0=<3D>ɹ<EFBFBD>, 1=<3D><>ACK(<28>豸δ<E8B1B8><CEB4>Ӧ) */
/*-------------------------------------------------*/
uint8_t m24c02WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite) {
uint8_t ack_err = 0;
uint8_t retry = 3;
while (retry--) {
ack_err = 0;
iicStart();
ack_err |= iicSendByteAck(M24C02_WADDR);
ack_err |= iicSendByteAck(WriteAddr);
ack_err |= iicSendByteAck(DataToWrite);
iicStop();
HAL_Delay(10);
if (ack_err == 0) break;
log_warn("> EE д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> @%u, <20><><EFBFBD><EFBFBD>=%u", WriteAddr, retry);
HAL_Delay(5);
}
return ack_err;
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ReadAddr:<3A><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݵĵ<DDB5>ַ */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:Redata:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĻ<DDB5><C4BB><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:Redatalen:<3A><>ȡ<EFBFBD><C8A1><EFBFBD>ݵij<DDB5><C4B3><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0=<3D>ɹ<EFBFBD>, 1=<3D><EFBFBD><E8B1B8>ACK */
/*-------------------------------------------------*/
uint8_t m24c02ReadSequential(uint8_t ReadAddr,uint8_t *Redata,uint16_t Redatalen) {
uint16_t i;
uint8_t ack_err = 0;
iicStart();
ack_err |= iicSendByteAck(M24C02_WADDR);
ack_err |= iicSendByteAck(ReadAddr);
iicStart();
ack_err |= iicSendByteAck(M24C02_RADDR);
for(i=0; i<(Redatalen-1); i++) {
Redata[i]=iicReadByte(1);
}
Redata[Redatalen-1]=iicReadByte(0);
iicStop();
HAL_Delay(5);
return ack_err;
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEpromָ<6D><D6B8><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:addr:<3A><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݵĵ<DDB5>ַ */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:data:<3A><>ȡ<EFBFBD><C8A1><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:len:Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0=<3D>ɹ<EFBFBD>, 1=<3D><EFBFBD><E8B1B8>ACK */
/*-------------------------------------------------*/
uint8_t eepromReadData(uint8_t addr,void *data, uint16_t len) {
uint8_t *ptr;
uint8_t ret;
ptr = data;
storage_lock();
ret = m24c02ReadSequential(addr,ptr,len);
storage_unlock();
return ret;
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 24C02 д<><D0B4>ͬһҳ<D2BB>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:WriteAddr:<3A><>ʼ<EFBFBD><CABC>ַ */
/* data :<3A><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD> */
/* len :<3A><><EFBFBD><EFBFBD>(<28><><EFBFBD>ÿ<EFBFBD>ҳ, ҳ<><D2B3>С 8 <20>ֽ<EFBFBD>) */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0=<3D>ɹ<EFBFBD>, 1=<3D><>ACK(<28>豸δ<E8B1B8><CEB4>Ӧ) */
/*-------------------------------------------------*/
#define M24C02_PAGE_SIZE 8u
static uint8_t m24c02WritePage(uint8_t WriteAddr, const uint8_t *data, uint8_t len) {
uint8_t ack_err = 0;
uint8_t retry = 3;
uint8_t i;
while (retry--) {
ack_err = 0;
iicStart();
ack_err |= iicSendByteAck(M24C02_WADDR);
ack_err |= iicSendByteAck(WriteAddr);
for (i = 0; i < len && ack_err == 0; i++) {
ack_err |= iicSendByteAck(data[i]);
}
iicStop();
HAL_Delay(10);
if (ack_err == 0) break;
log_warn("> EE ҳд<D2B3><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> @%u, <20><><EFBFBD><EFBFBD>=%u", WriteAddr, retry);
HAL_Delay(5);
}
return ack_err;
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEpromָ<6D><D6B8><EFBFBD><EFBFBD>ַд<D6B7><D0B4>ָ<EFBFBD><D6B8><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD> */
/* <20><>ҳ<EFBFBD>߽<EFBFBD><DFBD>з<EFBFBD>, ҳд<D2B3><D0B4>, ÿҳһ<D2B3><D2BB>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:addr<64><72><EFBFBD><EFBFBD>ַ */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:data<74><61>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:len<65><6E>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0=<3D>ɹ<EFBFBD>, 1=<3D><>ҳд<D2B3><D0B4>ʧ<EFBFBD><CAA7> */
/*-------------------------------------------------*/
uint8_t eepromWriteData(uint8_t addr, void *data, uint16_t len) {
uint8_t *ptr = data;
uint8_t err = 0;
storage_lock();
while (len > 0) {
/* <20><>ǰ<EFBFBD><C7B0>ַ<EFBFBD><D6B7>ҳ<EFBFBD>߽<EFBFBD><DFBD>ľ<EFBFBD><C4BE><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD>ؾ<EFBFBD> */
uint8_t chunk = M24C02_PAGE_SIZE - (addr % M24C02_PAGE_SIZE);
if (chunk > len) chunk = (uint8_t)len;
uint8_t e = m24c02WritePage(addr, ptr, chunk);
if (e) {
log_warn("> EE д<><D0B4>ʧ<EFBFBD><CAA7> @%u, err=0x%02X", addr, e);
}
err |= e;
addr += chunk;
ptr += chunk;
len -= chunk;
}
storage_unlock();
if (err) {
log_warn("> EEPROM д<><D0B4><EFBFBD><EFBFBD> ACK <20><><EFBFBD><EFBFBD>=0x%02X", err);
} else {
log_info("> EEPROM д<><D0B4><EFBFBD>ɹ<EFBFBD>");
}
return err;
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEprom<6F><6D>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>֤MQTT<54><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ */
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void eepromReadInfo(void) {
MqttInfo_Str tmp_read;
uint8_t read_err;
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5>ֽڶ<D6BD>д̽<D0B4>⣬ȷ<E2A3AC><C8B7>IIC<49><43><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint8_t probe_wr = 0xA5;
m24c02WriteOneByte(250, probe_wr);
uint8_t probe_rd = m24c02ReadOneByte(250);
log_info("> EEPROM ̽<><CCBD>: д=0x%02X, <20><>=0x%02X", probe_wr, probe_rd);
/* <20><>EEPROM<4F><4D>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
memset(&MqttInfoStr, 0, MQTT_STRUCT_LEN);
read_err = eepromReadData(0, &MqttInfoStr, MQTT_STRUCT_LEN);
log_info("> EEPROM <20><>ȡ err=%d, Magic=0x%08X, Ver=%u",
read_err, MqttInfoStr.Magic, MqttInfoStr.Ver);
/* MQTT<54>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD> (Ver<65><72>OTA<54><41><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>) */
if (MqttInfoStr.Magic == EEPROM_MAGIC &&
strcmp(MqttInfoStr.ClientID, MQTT_CLIENT_ID) == 0 &&
strcmp(MqttInfoStr.Username, MQTT_USERNAME) == 0 &&
strcmp(MqttInfoStr.Passward, MQTT_PASSWORD) == 0 &&
strcmp(MqttInfoStr.ServerIP, MQTT_SERVER_IP) == 0 &&
strcmp(MqttInfoStr.Topic, MQTT_TOPIC) == 0 &&
MqttInfoStr.ServerPort == MQTT_SERVER_PORT) {
log_info("EEPROM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч, Ver=%u", MqttInfoStr.Ver);
} else {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><><CEB4>ʼ<EFBFBD><CABC> */
uint16_t savedVer = MqttInfoStr.Ver;
int magic_ok = (MqttInfoStr.Magic == EEPROM_MAGIC);
memset(&MqttInfoStr, 0, MQTT_STRUCT_LEN);
strcpy(MqttInfoStr.ClientID, MQTT_CLIENT_ID);
strcpy(MqttInfoStr.Username, MQTT_USERNAME);
strcpy(MqttInfoStr.Passward, MQTT_PASSWORD);
strcpy(MqttInfoStr.ServerIP, MQTT_SERVER_IP);
strcpy(MqttInfoStr.Topic, MQTT_TOPIC);
MqttInfoStr.ServerPort = MQTT_SERVER_PORT;
/* ħ<><C4A7>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEPROM<4F><EFBFBD><E6B1BE>; ħ<><C4A7><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0(<28>°<EFBFBD>/<2F><><EFBFBD><EFBFBD>) */
MqttInfoStr.Ver = magic_ok ? savedVer : 0;
/* <20>°<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>Ĭ<EFBFBD><C4AC>ȫ<EFBFBD><C8AB>(0)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>հ<EFBFBD>EEPROM<4F><4D>0xFF */
memset(MqttInfoStr.Relay_State, 0, sizeof(MqttInfoStr.Relay_State));
MqttInfoStr.Magic = EEPROM_MAGIC;
eepromWriteData(0, &MqttInfoStr, MQTT_STRUCT_LEN);
log_info("> EEPROM д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Magic=0x%08X", MqttInfoStr.Magic);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>֤ */
memset(&tmp_read, 0, MQTT_STRUCT_LEN);
read_err = eepromReadData(0, &tmp_read, MQTT_STRUCT_LEN);
log_info("> EEPROM <20>ض<EFBFBD>У<EFBFBD><D0A3> err=%d, Magic=0x%08X, Ver=%u",
read_err, tmp_read.Magic, tmp_read.Ver);
log_info("EEPROM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>, Ver=%u", MqttInfoStr.Ver);
}
}