111 lines
5.2 KiB
C
111 lines
5.2 KiB
C
#include "main.h" //包含需要的头文件
|
||
|
||
/*-------------------------------------------------*/
|
||
/*函数名:从24c02指定的地址读一字节数据 */
|
||
/*参 数:ReadAddr:需要读数据的地址 */
|
||
/*返回值:读到的数据 */
|
||
/*-------------------------------------------------*/
|
||
uint8_t m24c02ReadOneByte(uint8_t ReadAddr) {
|
||
uint8_t receive; //定义一个变量用于保存接收到的数据
|
||
|
||
iicStart(); //IIC开始信号
|
||
iicSendByte(M24C02_WADDR); //发送24c02器件地址+写操作
|
||
iicWaitAck(); //等待应答
|
||
iicSendByte(ReadAddr); //发送需要读数据的地址
|
||
iicWaitAck(); //等待应答
|
||
iicStart(); //IIC开始信号
|
||
iicSendByte(M24C02_RADDR); //发送24c02器件地址+读操作
|
||
iicWaitAck(); //等待应答
|
||
receive=iicReadByte(0); //读一字节数据,保存在receive变量中
|
||
iicStop(); //停止信号
|
||
HAL_Delay(5); //延迟
|
||
return receive; //返回读取的数据
|
||
}
|
||
/*-------------------------------------------------*/
|
||
/*函数名:指定地址写入一个数据 */
|
||
/*参 数:WriteAddr :写入数据的目的地址 */
|
||
/*参 数:DataToWrite:要写入的数据 */
|
||
/*返回值:无 */
|
||
/*-------------------------------------------------*/
|
||
void m24c02WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite) {
|
||
iicStart(); //开始信号
|
||
iicSendByte(M24C02_WADDR); //发送器件地址+写操作
|
||
iicWaitAck(); //等待应答
|
||
iicSendByte(WriteAddr); //发送写入数据的目的地址
|
||
iicWaitAck(); //等待应答
|
||
iicSendByte(DataToWrite); //发送要写入的数据
|
||
iicWaitAck(); //等待应答
|
||
iicStop(); //停止信号
|
||
HAL_Delay(5); //延迟
|
||
}
|
||
/*-------------------------------------------------*/
|
||
/*函数名:从指定的地址读指定数量数据 */
|
||
/*参 数:ReadAddr:需要读数据的地址 */
|
||
/*参 数:Redata:保存数据的缓冲区 */
|
||
/*参 数:Redatalen:读多少数据 */
|
||
/*返回值:无 */
|
||
/*-------------------------------------------------*/
|
||
void m24c02ReadSequential(uint8_t ReadAddr,uint8_t *Redata,uint16_t Redatalen) {
|
||
uint16_t i; //定义一个变量用于for循环
|
||
|
||
iicStart(); //IIC开始信号
|
||
iicSendByte(M24C02_WADDR); //发送器件地址+写操作
|
||
iicWaitAck(); //等待应答
|
||
iicSendByte(ReadAddr); //发送需要读数据的地址
|
||
iicWaitAck(); //等待应答
|
||
iicStart(); //IIC开始信号
|
||
iicSendByte(M24C02_RADDR); //发送器件地址+读操作
|
||
iicWaitAck(); //等待应答
|
||
for(i=0; i<(Redatalen-1); i++) { //循环读取前Redatalen-1个字节
|
||
Redata[i]=iicReadByte(1); //读一字节数据,发送ACK信号
|
||
}
|
||
Redata[Redatalen-1]=iicReadByte(0); //读最后一字节数据,不发送ACK信号
|
||
iicStop(); //停止信号
|
||
HAL_Delay(5); //延迟
|
||
}
|
||
/*-------------------------------------------------*/
|
||
/*函数名:从EEprom指定的地址读数据 */
|
||
/*参 数:addr:需要读数据的地址 */
|
||
/*参 数:data:保存数据缓冲区 */
|
||
/*参 数:len:要读取的数据长度 */
|
||
/*返回值:无 */
|
||
/*-------------------------------------------------*/
|
||
void eepromReadData(uint8_t addr,void *data, uint16_t len) {
|
||
uint8_t *ptr; //定义一个指针用于读取数据
|
||
|
||
ptr = data; //ptr指向需要读取数据的缓冲区
|
||
m24c02ReadSequential(addr,ptr,len); //读取数据
|
||
}
|
||
/*-------------------------------------------------*/
|
||
/*函数名:EEprom指定地址写入指定字节的数据 */
|
||
/*参 数:addr:地址 */
|
||
/*参 数:data:写入的数据 */
|
||
/*参 数:len:写入多少数据 */
|
||
/*返回值:无 */
|
||
/*-------------------------------------------------*/
|
||
void eepromWriteData(uint8_t addr, void *data, uint16_t len) {
|
||
uint16_t i; //用于for循环
|
||
uint8_t *ptr; //定义一个指针用于写入数据
|
||
ptr = data; //ptr指向需要写入数据的缓冲区
|
||
for(i=0; i<len; i++) { //循环写入数据
|
||
m24c02WriteOneByte(addr,ptr[i]); //写一字节数据
|
||
addr++; //地址+1
|
||
}
|
||
}
|
||
/*-------------------------------------------------*/
|
||
/*函数名:从EEprom读取所有证书参数信息 */
|
||
/*参 数:无 */
|
||
/*返回值:无 */
|
||
/*-------------------------------------------------*/
|
||
void eepromReadInfo(void) {
|
||
#if Download
|
||
log_info("当前为下载模式,准备将MQTT信息写入EEPROM");
|
||
eepromWriteData(0, &MqttInfoStr, MQTT_STRUCT_LEN);
|
||
#else
|
||
log_info("当前为运行模式,准备从EEPROM读出MQTT信息");
|
||
memset(&MqttInfoStr,0,MQTT_STRUCT_LEN); //清空结构体
|
||
eepromReadData(0,&MqttInfoStr,MQTT_STRUCT_LEN); //从继电器状态后的扇区开始读取
|
||
#endif
|
||
}
|
||
|