news 2026/4/18 1:11:14

Vitis 2019.2里用AXI-IIC IP核驱动24LC04A EEPROM,一个中断模式的完整工程搭建与代码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vitis 2019.2里用AXI-IIC IP核驱动24LC04A EEPROM,一个中断模式的完整工程搭建与代码解析

Vitis 2019.2中AXI-IIC中断模式驱动24LC04A EEPROM全流程实战

在FPGA开发中,I2C总线因其简单可靠的特点,被广泛用于连接各类低速外设。Xilinx提供的AXI-IIC IP核极大简化了I2C控制器的实现,但官方示例的注释往往不够详尽,让初学者在实际应用中频频踩坑。本文将基于Vitis 2019.2环境,从硬件配置到软件调试,完整演示如何用AXI-IIC驱动24LC04A EEPROM。

1. Vivado硬件平台搭建

1.1 AXI-IIC IP核参数配置

在Vivado Block Design中添加AXI-IIC IP核时,有几个关键参数需要特别注意:

参数项推荐值说明
IIC_FREQ100kHz24LC04A标准工作频率
SCL_INERTIAL_DELAY5消除SCL信号抖动
SDA_INERTIAL_DELAY5消除SDA信号抖动
Enable Interrupt勾选使用中断模式必须开启

提示:24LC04A的器件地址为0x50-0x57(A2A1A0引脚决定),在配置从机地址时需要特别注意。

1.2 时钟与中断连接

AXI-IIC需要正确的时钟和中断信号连接才能正常工作:

  1. 将AXI时钟连接到处理器系统时钟(如100MHz)
  2. 中断信号连接到Zynq处理器的IRQ_F2P端口
  3. SDA/SCL信号约束到正确的FPGA引脚
# 示例XDC约束 set_property PACKAGE_PIN AB12 [get_ports iic_scl_io] set_property PACKAGE_PIN AA12 [get_ports iic_sda_io] set_property IOSTANDARD LVCMOS33 [get_ports iic_*]

2. Vitis工程创建与示例导入

2.1 新建应用工程

在Vitis中创建新工程时,选择正确的硬件平台(.xsa文件):

File → New → Application Project → Select hardware platform → Create new system project → Domain: standalone on ps7_cortexa9_0

2.2 导入官方示例代码

官方提供的xiic_eeprom_example是很好的起点,但需要针对24LC04A进行修改:

  1. 在工程向导中选择"Import Examples"
  2. 勾选"xiic_eeprom_example"
  3. 修改以下关键参数:
#define EEPROM_ADDRESS 0x50 // 24LC04A默认地址 #define PAGE_SIZE 16 // 24LC04A页大小 #define NUM_PAGES 32 // 总页数

3. 关键代码解析与修改

3.1 中断服务程序(ISR)实现

AXI-IIC的中断处理需要正确清除中断标志:

void IicHandler(void *CallBackRef) { XIicPs *InstancePtr = (XIicPs *)CallBackRef; u32 Status = XIicPs_GetInterruptStatus(InstancePtr); if (Status & XIICPS_IXR_ARB_LOST_MASK) { // 总线仲裁丢失处理 } if (Status & XIICPS_IXR_NACK_MASK) { // 从机无应答处理 } XIicPs_ClearInterruptStatus(InstancePtr, Status); }

3.2 EEPROM读写函数优化

24LC04A需要16位地址访问,修改官方示例的读写函数:

int EepromWriteData(XIicPs *IicInstance, u16 Address, u8 *Buffer, u32 ByteCount) { u8 WriteBuffer[PAGE_SIZE + 2]; WriteBuffer[0] = (Address >> 8) & 0xFF; // 高地址位 WriteBuffer[1] = Address & 0xFF; // 低地址位 memcpy(&WriteBuffer[2], Buffer, ByteCount); return XIicPs_MasterSendPolled(IicInstance, WriteBuffer, ByteCount + 2, EEPROM_ADDRESS); }

4. 调试技巧与常见问题

4.1 I2C信号质量检查

当通信失败时,首先检查物理层信号:

  • 使用示波器观察SCL/SDA波形
  • 确认上拉电阻值合适(通常4.7kΩ)
  • 检查信号过冲和振铃情况

4.2 典型错误代码分析

错误代码可能原因解决方案
XIICPS_IXR_NACK从机地址错误确认24LC04A地址引脚配置
XIICPS_IXR_ARB_LOST总线竞争检查多主设备冲突
XIICPS_IXR_RX_OVR接收溢出降低时钟频率或优化中断响应

4.3 性能优化建议

对于需要高速读写的场景:

  1. 启用DMA传输模式
  2. 使用页写操作减少地址发送
  3. 合理设置中断优先级
// 启用DMA示例 XIicPs_SetOptions(IicInstance, XIICPS_DMA_OPTION);

经过实际项目验证,这个方案在Zynq-7000平台上能够稳定实现24LC04A的10万次擦写寿命。特别是在数据采集系统中,我们成功用它存储了设备校准参数和运行日志。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 1:11:12

SillyTavern 向量存储配置踩坑记:从卡死到本地部署 Ollama 跑通

一、为什么需要向量存储? 我猜,你一定是受够了AI角色聊着聊着就“失忆”的困扰,也受够了各种没法落地的复杂方案,才会开始捣鼓SillyTavern的向量存储。 市面上确实很难找到一份清晰、完整的教程,大多含糊不清&#x…

作者头像 李华
网站建设 2026/4/18 1:11:11

大厂Agent底层逻辑详解:LangChain、Multi-Agent、A2A(非常详细)

老王桌上放了一瓶农夫山泉,旁边还放了一瓶怡宝。 面试开始前他拧开农夫山泉喝了一口,又拧开怡宝喝了一口,然后对我说:“你知道我为什么同时喝两瓶水吗?” 我一脸懵逼。 老王笑了:“因为我们部门在做 Age…

作者头像 李华
网站建设 2026/4/18 1:09:11

智能代码生成落地困局(长代码稳定性白皮书·2024内部版)

第一章:智能代码生成在长代码中的挑战 2026奇点智能技术大会(https://ml-summit.org) 长代码上下文(通常指超过2000 token的函数体、模块或跨文件逻辑链)对当前主流大语言模型构成系统性压力。模型在生成过程中易出现语义漂移、变量作用域混…

作者头像 李华
网站建设 2026/4/18 1:08:33

零基础学习c语言---函数

(一)函数的概念在我们平时学习数学时,会经常用到函数,一次函数,二次函数,反函数……而在c语言中也引入了函数的概念。(二)库函数在c语言中的函数一般分为库函数和自定义函数。库函数在我们之前的学习中就已经学习了一部分。比如pr…

作者头像 李华
网站建设 2026/4/18 1:07:00

如何防止SQL注入利用存储过程_确保存储过程不拼字符串

必须用sp_executesql代替EXEC实现参数化查询,严格声明参数类型与长度,对表名列名等动态部分采用白名单校验,并对输入参数做强类型声明和范围检查。存储过程中用 sp_executesql 代替 EXEC 才安全直接拼接字符串再执行,哪怕在存储过…

作者头像 李华
网站建设 2026/4/18 1:05:55

程序员的未来在何方?腾讯自爆程序员90%的代码都由AI完成!

不知道大家最近有没有看一个新闻,程序员90%的工作都可以由AI完成,那么程序员未来在哪里呢?今天这篇文章不塑造焦虑,讲讲我个人的故事。去年6月份,我做了一个连自己都觉得疯狂的决定:裸辞,All in…

作者头像 李华