当前位置: 首页 > news >正文

雅特力AT32 I2C实战:从零构建EEPROM存储系统

1. 硬件连接与基础配置

第一次玩AT32的I2C外设时,我对着开发板上的SCL和SDA引脚发呆了半天。后来发现,硬件连接其实就三个要点:上拉电阻、开漏输出、引脚复用。以AT32F403A开发板为例,I2C1的SCL(PB6)和SDA(PB7)需要配置为复用开漏模式,记得接上4.7K上拉电阻——这个值我实测过,在标准模式(100kHz)下最稳定。

硬件初始化代码要特别注意时钟使能顺序:

// 使能GPIOB和I2C1时钟 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_I2C1_PERIPH_CLOCK, TRUE); // 配置PB6(SCL)和PB7(SDA) gpio_init_type gpio_init_struct; gpio_default_para_init(&gpio_init_struct); gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN; gpio_init_struct.gpio_pull = GPIO_PULL_UP; gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7; gpio_init(GPIOB, &gpio_init_struct);

2. I2C外设初始化详解

AT32的I2C初始化比STM32复杂些,关键是要配置时钟控制寄存器(I2C_CLKCTRL)。这里有个坑:官方库里的i2c_init()函数需要传入数字滤波值和时钟配置值。我推荐使用Artery提供的配置工具生成时钟参数,比如100kHz标准模式对应0x60E02E2E。

实测过的初始化代码:

i2c_init_type i2c_init_struct; i2c_default_para_init(&i2c_init_struct); i2c_init_struct.clock_speed = I2C_CLOCK_SPEED_STANDARD; i2c_init_struct.digital_filter = 0x0F; // 数字滤波值 i2c_init_struct.clock_ctrl = 0x60E02E2E; // 100kHz配置 i2c_init(I2C1, &i2c_init_struct);

3. EEPROM读写实战

我用AT24C02做测试时,发现必须遵循EEPROM的页写入时序。每次写入后要加5ms延时(AT24C02的典型写入时间)。读操作则需要注意:先发送设备地址+写标志,再发送存储地址,最后重启通信改为读模式。

完整的页写入函数示例:

void eeprom_page_write(uint16_t addr, uint8_t *data, uint8_t len) { while(i2c_flag_get(I2C1, I2C_BUSYF_FLAG)); // 等待总线空闲 i2c_start_generate(I2C1); // 发送起始条件 while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG)); i2c_data_send(I2C1, 0xA0); // 设备地址 + 写 while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG)); i2c_data_send(I2C1, addr); // 存储地址 for(uint8_t i=0; i<len; i++){ while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG)); i2c_data_send(I2C1, data[i]); } i2c_stop_generate(I2C1); // 发送停止条件 delay_ms(5); // 必须的写入等待 }

4. 三种传输模式对比

轮询模式最简单但效率低,适合低速场景。中断模式能释放CPU资源,但要注意中断优先级设置——我遇到过因为优先级配置不当导致通信失败的情况。DMA模式最省心,适合大数据量传输,配置时要注意DMA通道与I2C事件的配合。

DMA模式配置关键点:

// 使能DMA时钟 crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE); // 配置DMA通道 dma_init_type dma_init_struct; dma_default_para_init(&dma_init_struct); dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL; dma_init_struct.memory_inc_enable = TRUE; dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE; dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE; dma_init(DMA1_CHANNEL6, &dma_init_struct); // 以I2C1_TX为例 // 使能I2C的DMA请求 i2c_dma_enable(I2C1, I2C_DMA_REQUEST_TX, TRUE);

5. 常见问题排查

调试I2C时,我的必备工具是逻辑分析仪。这几个错误我踩过坑:

  1. 无ACK响应:检查设备地址是否正确(7位地址要左移1位)
  2. 总线锁死:有时需要重新初始化I2C外设
  3. 数据错位:检查时钟配置是否符合从设备要求

一个实用的总线恢复函数:

void i2c_bus_recover(void) { GPIOB->pins = GPIO_PINS_6 | GPIO_PINS_7; // 强制拉高 gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT; gpio_init(GPIOB, &gpio_init_struct); // 模拟I2C总线恢复时序 for(uint8_t i=0; i<9; i++){ GPIOB->pins = GPIO_PINS_6; delay_us(5); GPIOB->pins = GPIO_PINS_6 | GPIO_PINS_7; delay_us(5); } // 恢复GPIO配置 gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init(GPIOB, &gpio_init_struct); }

6. 性能优化技巧

通过实测发现,开启I2C的**快速模式(400kHz)**需要优化PCB布局。如果走线较长,建议:

  • 缩短SCL/SDA走线长度
  • 减小上拉电阻值(我用2.2K在400kHz下稳定)
  • 启用I2C的数字滤波功能(DFLT值设为0x0F)

时钟配置工具的参数解读:

参数说明标准模式值快速模式值
SCLHSCL高电平周期0x600x1E
SCLLSCL低电平周期0xE00x3C
SDAD数据保持时间0x020x01
SCLD数据建立时间0x0E0x07

7. 完整项目集成

在实际项目中,我习惯将EEPROM操作封装成独立模块。这个头文件接口很好用:

// eeprom.h #define EEPROM_ADDR 0xA0 typedef enum { EEPROM_OK, EEPROM_BUSY, EEPROM_ERROR } eeprom_status_t; eeprom_status_t eeprom_write(uint16_t addr, uint8_t *data, uint16_t len); eeprom_status_t eeprom_read(uint16_t addr, uint8_t *data, uint16_t len);

配合FreeRTOS使用时,记得添加互斥锁保护I2C总线:

SemaphoreHandle_t i2c_mutex = xSemaphoreCreateMutex(); void task_eeprom(void *param) { if(xSemaphoreTake(i2c_mutex, pdMS_TO_TICKS(100)) == pdTRUE){ eeprom_read(0x00, buffer, 32); xSemaphoreGive(i2c_mutex); } }
http://www.jsqmd.com/news/628592/

相关文章:

  • 3分钟搞定风扇噪音!FanControl让你的电脑从此安静如初
  • 技术解析:SpectralFormer如何用Transformer革新高光谱图像分类
  • FPGA加速:yz-bijini-cosplay推理过程硬件优化
  • 被TMM拒稿后,我是如何用7个月时间在ACM TOMM上成功发表的(附详细修改清单)
  • 2026年江苏直埋保温管与预制保温管系统解决方案深度横评:五大品牌工程应用对标 - 精选优质企业推荐榜
  • 我的身体情况
  • FRCRN常见错误代码排查手册:从403 Forbidden到CUDA错误
  • 2026年直埋保温管与预制管道系统选型指南:五大制造商深度横评 - 精选优质企业推荐榜
  • 终极指南:3个关键阶段让Mac鼠标滚动体验焕然一新
  • 用Go语言写一个简单的聊天服务器(WebSocket)
  • 3步解锁碧蓝航线全皮肤:Perseus原生库补丁终极指南
  • 别再手动读论文了!用GPT+ResearchRabbit,30分钟搞定文献分类与综述大纲
  • 2026年江苏直埋保温管与预制聚氨酯管道系统集成方案深度评测指南 - 精选优质企业推荐榜
  • 突破直播限制:OBS多平台同步推流插件完全指南
  • 像素语言·维度裂变器效果展示:看AI如何把普通句子变惊艳
  • Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南
  • Pixel Dream Workshop 命令行高手之路:OpenClaw常用命令与脚本编写
  • Logcat Reader:Android设备日志查看终极指南与高效调试工具
  • Windows窗口强制调整终极指南:用WindowResizer打破程序限制
  • 2026年江苏直埋保温管与预制管道系统一体化解决方案深度评测 - 精选优质企业推荐榜
  • Asian Beauty Z-Image Turbo 微信小程序前端开发:实时图像生成与分享
  • 汇编语言(王爽第三版)实验实战指南
  • 【线粒体基因组数据提交实战】从注释校验到GenBank批量入库的避坑指南
  • 手把手教你用Dify+通义千问打造个人AI助手:从免费API Key申请到完整工作流搭建
  • UDOP-large功能体验:如何用一句英文提问提取文档关键信息
  • 2026成都护栏网厂家怎么选:四川钢板网护栏网/四川锌钢护栏网/四川鹿网围栏网/成都PVC围栏/成都不锈钢护栏网/选择指南 - 优质品牌商家
  • 武汉图核科技网址:whtuhe.top
  • Hunyuan-MT-7B多语种落地:Pixel Language Portal在国际电竞赛事多语种弹幕实时翻译系统应用
  • 3分钟永久保存你的QQ空间记忆:GetQzonehistory一键备份全攻略
  • 如何用BOTW存档编辑器轻松修改《塞尔达传说:旷野之息》游戏数据