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

张开发
2026/4/18 1:11:14 15 分钟阅读

分享文章

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-0x57A2A1A0引脚决定在配置从机地址时需要特别注意。1.2 时钟与中断连接AXI-IIC需要正确的时钟和中断信号连接才能正常工作将AXI时钟连接到处理器系统时钟如100MHz中断信号连接到Zynq处理器的IRQ_F2P端口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_02.2 导入官方示例代码官方提供的xiic_eeprom_example是很好的起点但需要针对24LC04A进行修改在工程向导中选择Import Examples勾选xiic_eeprom_example修改以下关键参数#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 性能优化建议对于需要高速读写的场景启用DMA传输模式使用页写操作减少地址发送合理设置中断优先级// 启用DMA示例 XIicPs_SetOptions(IicInstance, XIICPS_DMA_OPTION);经过实际项目验证这个方案在Zynq-7000平台上能够稳定实现24LC04A的10万次擦写寿命。特别是在数据采集系统中我们成功用它存储了设备校准参数和运行日志。

更多文章