VC707开发板的IIC控制
VC707开发板的IIC控制
- VC707开发板上的IIC连接方式
- 硬件连接
- SDK开发过程
- 配置路由芯片
- 代码实现
- 规律小结
最近学习VC707的使用,需要用到VC707的FMC接口,因此涉及到IIC控制,作为笔记简单记录一下。
VC707开发板上的IIC连接方式
通过VC707开发板的开发文档,了解到开发板上的IIC连接方式如下:
首先,左侧的是FPGA开发板上的默认IIC引脚,通过一组引脚(AT35、AU32)引出,连接到板上一块TI的芯片(PCA9548),这块芯片作为IIC路由,再进一步连接到开发板上的各类IIC设备(FMC、EEPROM、HDMI芯片等)。
硬件连接
提供一种相对简单的连接方式——使用AXI IIC IP核:
这个IP核是AXI4-Lite接口控制的IIC控制IP,通过AXI Interconnect连接到MicroBlaze的M_AXI_DP接口,此处省略。
在IP核的设置选项中,选择IIC_main,系统会自动根据VC707开发板的默认配置分配到iic_main的引脚(AT35、AU32)。
SDK开发过程
从VC707的官方文档了解到,由于使用了路由芯片(PCA9548),在使用时需要做一些特别处理:
配置路由芯片
0x74(0b1110100)位置的寄存器为路由芯片的选择寄存器,需要通过配置才能选中对应的iic设备,具体对应规则如下:
SDK实现代码如下,其中变量select就是写入0x74地址的内容,可以根据需要进行调整。
此处有一个很重要的点,PCA9548的选择寄存器使用的是One Hot编码,具体如下:
因此这里选择0x74寄存器的值填入范围是:0x0000_0001, 0x0000_0010, 0x0000_0100, 0x0000_10000… 以此类推。
代码实现
#define TESTAPP_GEN
#include "xparameters.h"
#include "xiic.h"
#include "xil_printf.h"
#include "xintc.h"#ifdef XPAR_INTC_0_DEVICE_ID#define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID#define IIC_INTR_ID XPAR_INTC_0_IIC_0_VEC_ID#define INTC XIntc#define INTC_HANDLER XIntc_InterruptHandler
#else#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID#define IIC_INTR_ID XPAR_FABRIC_IIC_0_VEC_ID#define INTC XScuGic#define INTC_HANDLER XScuGic_InterruptHandler
#endifXIic IicInstance; /* The instance of the IIC device. */
XIntc InterruptController; /* The instance of the Interrupt Controller. */volatile u8 TransmitComplete; /* Flag to check completion of Transmission */
volatile u8 ReceiveComplete; /* Flag to check completion of Reception */static void SendHandler(XIic *InstancePtr)
{TransmitComplete = 0;xil_printf("iic sending data... \n\r");
}static void ReceiveHandler(XIic *InstancePtr)
{ReceiveComplete = 0;xil_printf("iic receiving data... \n\r");
}static void StatusHandler(XIic *InstancePtr, int Event)
{}
int IicSelfTestExample(u16 DeviceId);static int SetupInterruptSystem(XIic * IicInstPtr)
{int Status;if (InterruptController.IsStarted == XIL_COMPONENT_IS_STARTED) {return XST_SUCCESS;}XIntc_Initialize(&InterruptController, INTC_DEVICE_ID);XIntc_Connect(&InterruptController, IIC_INTR_ID,(XInterruptHandler) XIic_InterruptHandler,IicInstPtr);XIntc_Start(&InterruptController, XIN_REAL_MODE);XIntc_Enable(&InterruptController, IIC_INTR_ID);#ifdef __PPC__/** Initialize the PPC exception table.*/XExc_Init();/** Register the interrupt controller handler with the exception table.*/XExc_RegisterHandler(XEXC_ID_NON_CRITICAL_INT,(XExceptionHandler) XIntc_InterruptHandler,&InterruptController);/** Enable non-critical exceptions.*/XExc_mEnableExceptions(XEXC_NON_CRITICAL);
#endif#ifdef __MICROBLAZE__/** Enable the Microblaze Interrupts.*/microblaze_enable_interrupts();
#endifreturn XST_SUCCESS;
}int IicSelfTestExample(u16 DeviceId)
{int Status;XIic_Config *ConfigPtr; /* Pointer to configuration data */ConfigPtr = XIic_LookupConfig(DeviceId);XIic_CfgInitialize(&IicInstance, ConfigPtr, ConfigPtr->BaseAddress);SetupInterruptSystem(&IicInstance);// Set the Handlers for transmit and reception.XIic_SetSendHandler(&IicInstance, &IicInstance,(XIic_Handler) SendHandler);XIic_SetRecvHandler(&IicInstance, &IicInstance,(XIic_Handler) ReceiveHandler);XIic_SetStatusHandler(&IicInstance, &IicInstance,(XIic_StatusHandler) StatusHandler);// Set the address of the slave.XIic_SetAddress(&IicInstance, XII_ADDR_TO_SEND_TYPE, 0x74);//Write to the PCA9548.TransmitComplete = 1;IicInstance.Stats.TxErrors = 0;u8 select = 0x02;Status = XIic_Start(&IicInstance);Status |= XIic_MasterSend(&IicInstance, &select, 1);if (Status != XST_SUCCESS) {return XST_FAILURE;}while ((TransmitComplete) || (XIic_IsIicBusy(&IicInstance) == TRUE)) {} // wait// read back for testReceiveComplete = 1;u8 back;Status |= XIic_MasterRecv(&IicInstance, &back, 1);if (Status != XST_SUCCESS) {return XST_FAILURE;}while ((ReceiveComplete) || (XIic_IsIicBusy(&IicInstance) == TRUE)) {} // waitStatus = XIic_Stop(&IicInstance);if (back == select)xil_printf("IIC device select initial success!\n\r");elsexil_printf("IIC device select initial failed!\n\r");return XST_SUCCESS;
}
经过初步测试,可以成功往0x74地址里面写值,接下来就是具体到FMC接口的配置了。
规律小结
在使用AXI IIC IP核的时候,可以使用Xilinx SDK提供的相关控制驱动简化IIC的控制(不用自己实现IIC时序),可以提高开发的效率。可以在sdk提供的例程上进行修改使用。
在学习的过程中也发现了一些坑,这里稍微小结一下:
- Xilinx 提供的AXI IIC IP核的使用与系统中断控制关系密切,建议开发人员要对中断的相关概念有一定了解,否则可能会出现数据读写失败的问题。
- IIC控制应用程序可以分为下面几个小部分:IIC IP核初始化、中断控制初始化、设置IIC从设备地址、读数据、写数据。
- 读数据和写数据的时候需要配合Xil_start 和 Xil_stop使用,我的理解是:Xil_start 可以把IIC总线变成受FPGA控制的状态;而在结束数据一次读写之后,需要及时调用Xil_stop,这样IIC总线就恢复到正常状态。(事实上,start和stop还涉及到了中断寄存器的控制)
- 配置PCA9548的时候,注意选择寄存器是采用one-hot编码
- Xilinx的官网上提供了一些参考设计(Si570等),大家可以自己找找看。
VC707开发板的IIC控制相关推荐
- FPGA基础入门【12】开发板USB鼠标控制
上一篇教程介绍了NEXYS4 开发板中UART串口通信的使用方式,这一篇介绍USB接口接收鼠标和键盘信号 FPGA基础入门[12]开发板USB鼠标控制 开发板USB芯片 信号时序图 鼠标初始化 逻辑设 ...
- stm32代码生成,基于模型的设计(MBD) 无刷直流电机MATLAB开发板建模代码生成控制 MBD电机控制资料
stm32代码生成,基于模型的设计(MBD) 无刷直流电机MATLAB开发板建模代码生成控制 MBD电机控制资料 控制算法采用MATLAB建模并生成代码的方式 配套电机 开发板 模型 源代码和视频 P ...
- 用MATLAB程序控制伺服电机,使用MATLAB和Arduino开发板进行步进电机控制
步进电机是一种无刷直流电机,可以分步旋转,是许多精密运动控制应用的最佳选择.此外,步进电机适用于定位.速度控制和低速需要大扭矩的应用. 在之前的MATLAB教程中,我们已经介绍了如何使用MATLAB来 ...
- 直流电机 matlab,使用MATLAB和Arduino开发板进行直流电机控制
在本篇文章中,我们将主要介绍如何使用MATLB和Arduino开发板控制直流电机.如果您是初次使用MATLAB软件,建议您先学习如何使用MATLAB实现简单的LED闪烁. 创建用于控制直流电机的MAT ...
- [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...
- python控制电机_[MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...
- 国产车规工业芯片,开发板,工业控制PLC,DCS,电力控制
基于D9的电力智能设备解决方案高性能D9芯片广泛应用于电力智能设备领域,内置双核锁步Cortex R5配合安全启动.内置HSM支持SM2/3/4/9国密算法.支持高实时多并行中断响应.支持时间敏感以太 ...
- 【STM32 .Net MF开发板学习-11】步进电机控制(非PWM模式)
选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用 uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC - ...
- 树莓派Pico开发板与大功率MOSFET/IGBT器件驱动控制24V直流电机技术实践
摘要:本文在介绍MOSFET器件和IGBT器件作为电子开关基本原理的基础上,讲述了树莓派Pico与MOSFET&IGBT器件驱动控制24V直流电机硬件接口技术,最后给出了树莓派Pico开发板G ...
- 【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)
选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC -& ...
最新文章
- tomcat 连接oracle重连,JSP+Tomcat连接Oracle数据库
- apache设置网页gzip压缩(亲测可用)
- reactor使用方法_Project Reactor展开方法
- linux ls命令shell脚本位置,linux - shell脚本到ls并在ls上执行命令结果 - SO中文参考 - www.soinside.com...
- python数据分析多久能学会_周末深夜,学妹说她想做Python数据分析师....
- 开始启用51CTO的博客
- spo机试题JAVA_基于龙芯处理器的Java运行环境的移植与优化
- 什么是Http无状态协议?
- 深入理解 Hive 分区分桶 (Inceptor)
- winserve2016 万能驱动网卡_windows server 2016 安装有线网卡驱动
- 74HC/LS/HCT/F系列芯片的区别及使用[转]
- RobotStudio知识你知多少?
- IOS-简单的自建ipa在线安装服务
- Eclipse的配置使用
- python 基于itchat详解微信防撤回程序
- 计算机基本原理——CPU的工作原理
- 2019-5-30 个人创业跟在公司上班的区别体验小书
- 2014年12月31日这一天,我想说明天会更好!
- Spring应用启动后执行任务的几种方法
- 3D建模在线展示/三维模型可视化线上VR智慧城市