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

227 lines
7.5 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><E8B1B8><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB> EEPROM<4F><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SETMQTT <20><><EFBFBD><EFBFBD><EBA3A9><EFBFBD>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ/<EFBFBD>˿<EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD> main.h <EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SETIP <EFBFBD>޸<EFBFBD> */
uint8_t g_mqtt_configured = 0; /* 1=EEPROM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD> */
MqttInfo_Str MqttInfoStr = {
.ClientID = "",
.Username = "",
.Passward = "",
.ServerIP = MQTT_SERVER_IP,
.Topic = MQTT_TOPIC,
.ServerPort = MQTT_SERVER_PORT,
.Relay_State = {0},
.Magic = 0, /* <20><><EFBFBD><EFBFBD>д<EFBFBD>루SETMQTT<54><54>ʱ<EFBFBD><CAB1> 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) {
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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD>쳣ʱ<ECB3A3>ű<EFBFBD><C5B1><EFBFBD> */
uint8_t probe_wr = 0xA5;
m24c02WriteOneByte(250, probe_wr);
uint8_t probe_rd = m24c02ReadOneByte(250);
if (probe_rd != probe_wr) {
log_warn("> EEPROM ̽<><CCBD><EFBFBD>쳣: д=0x%02X, <20><>=0x%02X", probe_wr, probe_rd);
}
/* <20><>EEPROM<4F><4D>ȡ<EFBFBD><C8A1><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>err <20>쳣ʱ<ECB3A3>ű<EFBFBD><C5B1><EFBFBD> */
memset(&MqttInfoStr, 0, MQTT_STRUCT_LEN);
read_err = eepromReadData(0, &MqttInfoStr, MQTT_STRUCT_LEN);
if (read_err != 0) {
log_warn("> EEPROM <20><>ȡ<EFBFBD>쳣 err=%d", read_err);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч = ħ<><C4A7>ƥ<EFBFBD><C6A5> <20><> <20>ͻ<EFBFBD><CDBB><EFBFBD>ID<49>ǿգ<C7BF><D5A3><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB> EEPROM<4F><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶԣ<C8B6> */
if (MqttInfoStr.Magic == EEPROM_MAGIC && MqttInfoStr.ClientID[0] != 0) {
g_mqtt_configured = 1;
log_info("EEPROM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч, Ver=%u", MqttInfoStr.Ver);
return;
}
/* δ<><CEB4><EFBFBD>ã<EFBFBD><C3A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD> SETMQTT <20><><EFBFBD><EFBFBD><EBA3A8>д EEPROM<4F><4D> */
g_mqtt_configured = 0;
if (MqttInfoStr.Magic != EEPROM_MAGIC) {
/* ȫ<>°<EFBFBD>/<2F><>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>(ȫ0xFF)<29><>ȫ<EFBFBD><C8AB><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>Ĭ<EFBFBD><C4AC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><E6B1BE>/<2F>̵<EFBFBD><CCB5><EFBFBD>״̬<D7B4><CCAC> 0 */
memset(&MqttInfoStr, 0, MQTT_STRUCT_LEN);
strcpy(MqttInfoStr.ServerIP, MQTT_SERVER_IP);
strcpy(MqttInfoStr.Topic, MQTT_TOPIC);
MqttInfoStr.ServerPort = MQTT_SERVER_PORT;
} else {
/* <20><> Magic <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ֻ SETIP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EEPROM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶη<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ֵ */
MqttInfoStr.ClientID[0] = 0;
MqttInfoStr.Username[0] = 0;
MqttInfoStr.Passward[0] = 0;
if (MqttInfoStr.ServerIP[0] < '0' || MqttInfoStr.ServerIP[0] > '9') {
strcpy(MqttInfoStr.ServerIP, MQTT_SERVER_IP);
strcpy(MqttInfoStr.Topic, MQTT_TOPIC);
MqttInfoStr.ServerPort = MQTT_SERVER_PORT;
}
}
log_warn("> EEPROM <20><><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SETMQTT <20><><EFBFBD>");
}