【ESP32 IDF eeprom驱动】

esp32 idf eeprom驱动代码编写

最近买了一个esp32s3的开发板,想在春节期间学习一下freeRTOS,春节期间各种吃喝玩乐也没怎么学。
看到了eeprom的章节,觉得开发板提供的代码也不太好用。又去翻看了一下乐鑫官网代码,依然不符合我的心里预期。所以参考我之前写的linux用户态eeprom接口代码,重写了一个esp idf的eeprom驱动代码。2025过年期间deepseek也是出尽风头,其实我在vscode上使用“通义灵码”插件也有一段时间了,源于一个阿里的客服打电话给我推荐使用,这段时间亲眼见证了它的进化,简直强大的让我感到害怕。
这个驱动代码也是在AI的帮助下调出来的,所以强力安利一下使用AI助手写代码,虽然它不能完全取代程序员,但是确实是一个高级助手。
风格是按照linux编程的风格来写的,有问题还请各位看官多多指导,初次尝试freeRTOS。
按照我之前写的代码,把所有的eeprom型号都支持上,如果有不同厂家只需要调整一下芯片的那几个参数获取函数就可以适配了。
at24cxx.h
其实这个设备结构体应该隐藏在c文件中的,反正都公开源码了,也懒得再去修改。

#ifndef __24CXX_H
#define __24CXX_H

#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "driver/gpio.h"
#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
#include "esp_log.h"
#include "driver/i2c.h"

#define AT24CXX_FREQ_HZ          100000  
#define I2C_MASTER_TIMEOUT_MS	 1000
/// @brief 
typedef enum
{
   
  	AT24C01  = 1,
	AT24C02 ,
	AT24C04 ,
	AT24C08 ,
	AT24C16 ,
	AT24C32 ,
	AT24C64 ,
	AT24C128,
	AT24C256,
	AT24C512,
	AT24CM01,
	AT24CM02,
	MODEL_COUNT 
} E2_Models;

struct at24c_dev_t{
   
	//i2c_端口信息
	i2c_port_t		i2c_port;	//控制器
	int 		  sda_io_num;	//数据线
	int 		  clk_io_num;	//时钟线
	/*EEPROM特征属性*/
	E2_Models      model_type;	//芯片类型
	unsigned char   chip_addr;	//芯片从机地址
	unsigned int    word_mask;	//芯片位宽掩码,用于多个DIE叠加的E2
	int				chip_size;	//E2的最大存储空间
	int				page_size;	//E2的页大小
	int 			self_time;	//E2的页自写入时间us

	SemaphoreHandle_t mutex;  // 添加互斥锁
};



/* 函数声明 */
struct at24c_dev_t* at24cxx_init(i2c_port_t i2c_obj, int clk, int sda, unsigned char chip, E2_Models model);	/* 初始化AT24Cxx */
int at24cxx_exit(struct at24c_dev_t *dev);
int at24cxx_write(struct at24c_dev_t *dev, int offset, uint8_t *data, int len);
int at24cxx_read(struct at24c_dev_t *dev, int offset, uint8_t *buff, int len);

#endif

#include "24cxx.h"

static int chip_size_get(E2_Models model);			//E2芯片容量
static int page_size_get(E2_Models model);			//E2页写大小
static int self_time_get(E2_Models model);			//E2页写时间
static int word_mask_get(E2_Models model);			//E2位宽掩码

static int chip_size_get(E2_Models model)
{
   
	switch(model)
	{
   
	  	case AT24C01:
		  return 128u;
		case AT24C02:
		  return 256u;
		case AT24C04:
		  return 512u;
		case AT24C08:
		  return 1024u;
		case AT24C16:
		  return 2048u;
		case AT24C32:
		  return 4096u;
		case AT24C64:
		  return 8192u;
		case AT24C128:
		  return 16384u;
		case AT24C256:
		  return 32768u;
		case AT24C512:
		  return 65536u;
		case AT24CM01:
		  return 131072u;
		case AT24CM02:
		  return 262144u;
		default:
	      return 0;
	}
}

static int page_size_get(E2_Models model)
{
   
	switch(model)
	{
   
		case AT24C01:
			return 4;

		case AT24C02:
			return 8;

		case AT24C04:
		case AT24C08:
		case AT24C16:
			return 16;

		case AT24C32:
		case AT24C64:
			return 32;

		case AT24C128:
		case AT24C256:
			return 64;

		case AT24C512:
			return 128;

		case AT24CM01:
		case AT24CM02:
			return 256;

		default:
			return 0;
	}
}
//这个参数需要查看数据手册,否则会发生意想不到的错误
static int self_time_get(E2_Models model)
{
   
	switch(model)
	{
   
		case AT24C01:
			return 10;

		case AT24C02:
		case AT24C04:
			return 10;

		case AT24C08:
		case AT24C16:
		case AT24C32:
		case AT24C64:
			return 10;

		case AT24C128:
			return 10;

		case AT24C256:
			return 5;

		case AT24C512:
			return 5;

		case AT24CM01:
			return 5;

		case AT24CM02:
			return 10;

		default:
			return 0;
	}
}

static int word_mask_get(E2_Models model)
{
   
	switch(model)
	{
   
		case AT24C01:
		case AT24C02:
		case AT24C04:
		case AT24C08:
		case AT24C16:
			return 0xff;

		case AT24C32:
		case AT24C64:
		case AT24C128:
		case AT24C256:
		case AT24C512:
		case AT24CM01:
		case AT24CM02:
			return 0xffff;

		default:
			return 0;
	}
}


static esp_err_t i2c_read(i2c_port_t port, u
### ESP32 IDF WiFi 配置与使用 ESP32 使用 IDF (Espressif IoT Development Framework) 进行开发时,其 Wi-Fi 功能可以通过 `esp_wifi` API 实现配置和管理。以下是关于 ESP32IDF 框架下 Wi-Fi 的主要功能及其配置方式。 #### 1. Wi-Fi 工作模式 ESP32 支持三种工作模式: - **Station Mode**: 设备作为客户端连接到路由器。 - **Access Point Mode**: 设备作为一个热点供其他设备连接。 - **Station + Access Point Mode**: 同时支持 Station 和 AP 模式[^1]。 #### 2. 初始化 Wi-Fi Wi-Fi 的初始化通常通过调用 `esp_netif_init()` 函数完成网络接口的创建,并通过 `esp_event_loop_create_default()` 创建事件循环实例。随后可以设置具体的 Wi-Fi 参数并启动服务: ```c #include "esp_wifi.h" #include "esp_event.h" void wifi_init_sta(void) { esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); } ``` 此代码片段展示了如何初始化 Wi-Fi 并将其设为 Station 模式[^2]。 #### 3. 设置认证模式 对于软接入点(Soft-AP),可以选择不同的认证模式来增强安全性。这些模式由枚举类型 `wifi_auth_mode_t` 定义,不支持 WEP 认证模式。常见的认证模式包括: - `WIFI_AUTH_OPEN`: 开放式网络。 - `WIFI_AUTH_WPA_PSK`: 使用 WPA PSK 加密。 - `WIFI_AUTH_WPA2_PSK`: 使用 WPA2 PSK 加密。 - `WIFI_AUTH_WPA_WPA2_PSK`: 支持 WPA/WPA2 双重加密。 以下是一个简单的 Soft-AP 配置示例: ```c wifi_config_t ap_config = { .ap.ssid = "MyESP_AP", .ap.password = "mypassword", .ap.channel = 1, .ap.authmode = WIFI_AUTH_WPA_WPA2_PSA, // 或者其他安全模式 }; ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &ap_config)); ESP_ERROR_CHECK(esp_wifi_start()); ``` 这段代码设置了 SSID、密码以及信道等参数,并启用了指定的安全认证模式[^1]。 #### 4. OTA 更新中的 Wi-Fi 配置 在进行 Over-the-Air (OTA) 更新时,可能需要动态调整 Wi-Fi 参数以适应不同场景下的需求。例如,在 OTA 示例项目中,开发者可以根据实际应用情况重新定义分区表结构或更新 HTTPS 证书验证逻辑[^3]。 #### 5. EEPROM 数据存储辅助配置 尽管现代驱动程序推荐使用 I2C 主控器替代传统 EEPROM 接口,但在某些特定场合仍需依赖于旧版驱动保存少量数据。如果涉及复杂的数据操作,则建议采用 NVS 存储机制代替原始硬件级访问[^4]。 --- ### 总结 以上介绍了基于 Espressif IDF 框架针对 ESP32 微控制器执行 Wi-Fi 初始设定的方法论及相关技巧。无论是构建独立运行的应用还是集成至更大规模系统之中,合理运用上述资源都将极大提升工作效率与产品质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值