新闻详情

新闻详情

首页 / 资讯中心 / 详情

【正点原子ZYNQ领航者7020】IIC总线协议→eeprom读写实验

发布时间:2026/10/1 10:39:49来源:尧图网络
【正点原子ZYNQ领航者7020】IIC总线协议→eeprom读写实验
文章目录前言1.创建Vivado工程2.Vitis软件设计1.在 Vitis 中创建应用工程2.编写代码3.下载验证总结前言无仅作记录不具有参考价值。在hello world实验工程上进行修改。1.创建Vivado工程在hello world的工程上完成block design的搭建打开I2C0并将管脚设定为EMIO并创建pin.xdc文件并填入#------------IICEEPROM/RTC实时时钟/音频配置---------------set_property-dict{PACKAGE_PIN E18 IOSTANDARD LVCMOS33}[get_ports IIC_EMIO_scl_io]set_property-dict{PACKAGE_PIN F17 IOSTANDARD LVCMOS33}[get_ports IIC_EMIO_sda_io]之后更新bd文件并生成新的system_wrapper.v然后重新生成比特流并生成新的xsa文件2.Vitis软件设计1.在 Vitis 中创建应用工程略。2.编写代码在创建main.c之后编写以下代码#includexparameters.h#includesleep.h#includexiicps.h#includexscugic.h#includexil_exception.h#includexil_printf.h#includexplatform_info.h#defineIIC0_DEVICE_IDXPAR_XIICPS_0_DEVICE_ID#defineIIC0_INTERRUPT_IDXPAR_XIICPS_0_INTR#defineIIC0_SCLK_RATE100000//IIC SCL的时钟频率#defineSLV_MON_LOOP_COUNT0x000FFFFF//IIC控制器从机监控模式下等待IIC设备应答循环计数次数#definePAGE_SIZE32//页大小32个字节#defineEEPROM_START_ADDRESS0#defineINTC_DEVICE_IDXPAR_SCUGIC_SINGLE_DEVICE_IDtypedefu16 AddressType;voidIicX_init(XIicPs*IicX,u16 IicXDeviceID);voidSetupInterruptSystem_IicX(XScuGic*GicInstancePtr,XIicPs*IicX,u16 IicXIntrId,Xil_ExceptionHandler Handler);intiic_slave_monitor(XIicPs*IicX);voidiic_status_handler(void*CallBackRef,u32 Event);voideeprom_rw_test(XIicPs*IicX);staticintEepromWriteData(XIicPs*IicInstance,u16 ByteCount);staticintEepromReadData(XIicPs*IicInstance,u8*BufferPtr,u16 ByteCount);XIicPs Iic0;//定义IIC控制器驱动的结构体变量XScuGic Intc;//定义中断控制器驱动的结构体变量u8 WriteBuffer[sizeof(AddressType)PAGE_SIZE];u8 ReadBuffer[PAGE_SIZE];volatileu8 TransmitComplete;/** Flag to check completion of Transmission */volatileu8 ReceiveComplete;/** Flag to check completion of Reception */volatileu32 TotalErrorCount;/** Total Error Count Flag */volatileu32 SlaveResponse;/** Slave Response Flag */u16 EepromSlvAddr0x50;intmain(void){intStatus;inti;xil_printf(IIC EEPROM Interrupt Example Test \r\n);//IIC的初始化和配置IicX_init(Iic0,IIC0_DEVICE_ID);//IIC的中断配置SetupInterruptSystem_IicX(Intc,Iic0,IIC0_INTERRUPT_ID,(Xil_ExceptionHandler)XIicPs_MasterInterruptHandler);//IIC从机监控模式下检测是否有EEPROMStatusiic_slave_monitor(Iic0);if(Status!XST_SUCCESS){xil_printf(IIC EEPROM Not Detected Failed\r\n);returnXST_FAILURE;}xil_printf(Successfully ran IIC EEPROM Interrupt Example Test\r\n);//对EEPROM进行读写测试并打印读写测试的结果eeprom_rw_test(Iic0);if(Status!XST_SUCCESS){xil_printf(IIC EEPROM Interrupt Example Test Failed\r\n);returnXST_FAILURE;}for(i0;iPAGE_SIZE;i){xil_printf(EEPROM WOrd Address is %d, Data is %d\r\n,i,ReadBuffer[i]);}xil_printf(Successfully ran IIC EEPROM Interrupt Example Test\r\n);while(1){}return0;}voidIicX_init(XIicPs*IicX,u16 IicXDeviceID){//对IICX驱动进行初始化XIicPs_Config*ConfigPtr_IicX;//根据器件ID来去查找器件的配置信息ConfigPtr_IicXXIicPs_LookupConfig(IicXDeviceID);//对IICX的驱动进行初始化XIicPs_CfgInitialize(IicX,ConfigPtr_IicX,ConfigPtr_IicX-BaseAddress);//设置Iic的时钟频率XIicPs_SetSClk(IicX,IIC0_SCLK_RATE);}voidSetupInterruptSystem_IicX(XScuGic*GicInstancePtr,XIicPs*IicX,u16 IicXIntrId,Xil_ExceptionHandler Handler){XScuGic_Config*IntcConfig;//GIC配置信息的驱动实例//根据中断控制器的器件ID来查找配置信息IntcConfigXScuGic_LookupConfig(INTC_DEVICE_ID);//根据查找到的配置信息初始化中断控制器XScuGic_CfgInitialize(GicInstancePtr,IntcConfig,IntcConfig-CpuBaseAddress);//关联IICX中断处理程序XScuGic_Connect(GicInstancePtr,IicXIntrId,(Xil_ExceptionHandler)Handler,(void*)IicX);//设置中断优先级和触发类型 (160为优先级0x1表示高电平触发0x3表示上升沿触发)XScuGic_SetPriorityTriggerType(GicInstancePtr,IicXIntrId,160,0x1);//使能IICX控制器的中断XScuGic_Enable(GicInstancePtr,IicXIntrId);//设置IICX状态中断处理函数XIicPs_SetStatusHandler(IicX,(void*)IicX,iic_status_handler);//异常初始化Xil_ExceptionInit();//注册中断请求异常的处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);//使能异常处理Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);}//IIC从机监控模式下检测是否有eepromintiic_slave_monitor(XIicPs*IicX){TotalErrorCount0;u32 Index0;SlaveResponseFALSE;//对IIC控制器中断进行储能XIicPs_DisableAllInterrupts(IicX-Config.BaseAddress);//使能IIC的从机监控模式XIicPs_EnableSlaveMonitor(IicX,EepromSlvAddr);//等待IIC应答while((!SlaveResponse)(IndexSLV_MON_LOOP_COUNT)){Index;/* * Ignore any errors. The hardware generates NACK interrupts * if the slave is not present. */if(0!TotalErrorCount){xil_printf(Test error unexpected NACK\n);returnXST_FAILURE;}}if(IndexSLV_MON_LOOP_COUNT){returnXST_FAILURE;}XIicPs_DisableSlaveMonitor(IicX);returnXST_SUCCESS;}//IIC状态中断处理程序voidiic_status_handler(void*CallBackRef,u32 Event){/* * All of the data transfer has been finished. */if(0!(EventXIICPS_EVENT_COMPLETE_SEND)){TransmitCompleteTRUE;}elseif(0!(EventXIICPS_EVENT_COMPLETE_RECV)){ReceiveCompleteTRUE;}elseif(0!(EventXIICPS_EVENT_SLAVE_RDY)){SlaveResponseTRUE;}elseif(0!(EventXIICPS_EVENT_ERROR)){TotalErrorCount;}}voideeprom_rw_test(XIicPs*IicX){u32 Index;AddressType AddressEEPROM_START_ADDRESS;intWrBfrOffset;WriteBuffer[0](u8)(Address8);WriteBuffer[1](u8)(Address);WrBfrOffset2;//对WriteBuffer和ReadBuffer初始化每个元素的值for(Index0;IndexPAGE_SIZE;Index){WriteBuffer[WrBfrOffsetIndex]Index;ReadBuffer[Index]0;}//写数据到EEPROMEepromWriteData(IicX,WrBfrOffsetPAGE_SIZE);//从EEPROM里读出数据EepromReadData(IicX,ReadBuffer,PAGE_SIZE);/* * Verify the data read against the data written. */for(Index0;IndexPAGE_SIZE;Index){if(ReadBuffer[Index]!WriteBuffer[IndexWrBfrOffset]){returnXST_FAILURE;}}returnXST_SUCCESS;}staticintEepromWriteData(XIicPs*IicInstance,u16 ByteCount){TransmitCompleteFALSE;/* * Send the Data. */XIicPs_MasterSend(IicInstance,WriteBuffer,ByteCount,EepromSlvAddr);/* * Wait for the entire buffer to be sent, letting the interrupt * processing work in the background, this function may get * locked up in this loop if the interrupts are not working * correctly. */while(TransmitCompleteFALSE){if(0!TotalErrorCount){returnXST_FAILURE;}}/* * Wait until bus is idle to start another transfer. */while(XIicPs_BusIsBusy(IicInstance));/* * Wait for a bit of time to allow the programming to complete */usleep(100000);returnXST_SUCCESS;}staticintEepromReadData(XIicPs*IicInstance,u8*BufferPtr,u16 ByteCount){intStatus;AddressType AddressEEPROM_START_ADDRESS;intWrBfrOffset;/* * Position the Pointer in EEPROM. */WriteBuffer[0](u8)(Address8);WriteBuffer[1](u8)(Address);WrBfrOffset2;StatusEepromWriteData(IicInstance,WrBfrOffset);if(Status!XST_SUCCESS){returnXST_FAILURE;}ReceiveCompleteFALSE;/* * Receive the Data. */XIicPs_MasterRecv(IicInstance,BufferPtr,ByteCount,EepromSlvAddr);while(ReceiveCompleteFALSE){if(0!TotalErrorCount){returnXST_FAILURE;}}/* * Wait until bus is idle to start another transfer. */while(XIicPs_BusIsBusy(IicInstance));returnXST_SUCCESS;}3.下载验证略。总结只是记录代码具体编写请参考正点原子相关视频。工程分享iic_eeprom_rw.zip
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python闭包详解:自由变量、nonlocal、循环晚绑定与装饰器实战 2026/10/1 10:39:47

Python闭包详解:自由变量、nonlocal、循环晚绑定与装饰器实战

闭包这个词,第一次听像是某种数学概念,第一次用像是某种魔法,用熟了之后才发现它其实很朴素——Python 里的闭包,本质就是把一个函数和它出生时的环境打包带走,让这个函数在外面跑的时候还能记得"老家"里的那…

阅读更多 →
ELK 日志查询实战:从 traceid 到 Kibana 跨服务排障 2026/10/1 10:39:47

ELK 日志查询实战:从 traceid 到 Kibana 跨服务排障

凌晨两点,工作群里甩过来一条消息,附了一个 traceid: 6aa2526590ad07346b76e2b8d8d80384 ,后面跟一句"这个单子状态没更新,帮忙看下"。没有任何上下文,没有用户ID,没有时间点。这时…

阅读更多 →
OpenSwarm深度研究Agent:如何做带引用的网络研究与学术论文检索 2026/10/1 10:39:46

OpenSwarm深度研究Agent:如何做带引用的网络研究与学术论文检索

OpenSwarm深度研究Agent:如何做带引用的网络研究与学术论文检索 【免费下载链接】OpenSwarm Claude code for everything except coding 项目地址: https://gitcode.com/gh_mirrors/open/OpenSwarm OpenSwarm 是一个开源的多智能体系统,其中的 De…

阅读更多 →
Java 设计模式之依赖注入(Dependency Injection):在 java-design-patterns 中实现解耦与可测试性 2026/10/1 10:39:40

Java 设计模式之依赖注入(Dependency Injection):在 java-design-patterns 中实现解耦与可测试性

示例工程教程 【免费下载链接】java-design-patterns Design patterns implemented in Java 项目地址: https://gitcode.com/GitHub_Trending/ja/java-design-patterns 点击查看 免费下载 依赖注入(Dependency Injection,DI)是 J…

阅读更多 →
Python闭包全解析:原理、nonlocal与装饰器实战 2026/10/1 10:39:40

Python闭包全解析:原理、nonlocal与装饰器实战

1. 闭包到底是个什么东西,为什么老被面试问 Python 闭包(closure)这玩意儿,第一次接触的人多半会有两种反应:要么觉得"就这?不就是函数套函数",要么觉得"这什么鬼,变…

阅读更多 →
税收学毕业论文怎么写?政策变化、企业数据和税负分析怎么避免写成“税法科普” 2026/10/1 10:39:33

税收学毕业论文怎么写?政策变化、企业数据和税负分析怎么避免写成“税法科普”

税收学毕业论文怎么写?政策变化、企业数据和税负分析怎么避免写成“税法科普” 税收学毕业论文最容易写成政策汇编:先解释税种,再介绍优惠政策,最后提出“完善税制、加强征管”。真正有内容的论文,需要围绕某项税收政策…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉