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提供的例程上进行修改使用。
在学习的过程中也发现了一些坑,这里稍微小结一下:

  1. Xilinx 提供的AXI IIC IP核的使用与系统中断控制关系密切,建议开发人员要对中断的相关概念有一定了解,否则可能会出现数据读写失败的问题。
  2. IIC控制应用程序可以分为下面几个小部分:IIC IP核初始化、中断控制初始化、设置IIC从设备地址、读数据、写数据。
  3. 读数据和写数据的时候需要配合Xil_start 和 Xil_stop使用,我的理解是:Xil_start 可以把IIC总线变成受FPGA控制的状态;而在结束数据一次读写之后,需要及时调用Xil_stop,这样IIC总线就恢复到正常状态。(事实上,start和stop还涉及到了中断寄存器的控制)
  4. 配置PCA9548的时候,注意选择寄存器是采用one-hot编码
  5. Xilinx的官网上提供了一些参考设计(Si570等),大家可以自己找找看。

VC707开发板的IIC控制相关推荐

  1. FPGA基础入门【12】开发板USB鼠标控制

    上一篇教程介绍了NEXYS4 开发板中UART串口通信的使用方式,这一篇介绍USB接口接收鼠标和键盘信号 FPGA基础入门[12]开发板USB鼠标控制 开发板USB芯片 信号时序图 鼠标初始化 逻辑设 ...

  2. stm32代码生成,基于模型的设计(MBD) 无刷直流电机MATLAB开发板建模代码生成控制 MBD电机控制资料

    stm32代码生成,基于模型的设计(MBD) 无刷直流电机MATLAB开发板建模代码生成控制 MBD电机控制资料 控制算法采用MATLAB建模并生成代码的方式 配套电机 开发板 模型 源代码和视频 P ...

  3. 用MATLAB程序控制伺服电机,使用MATLAB和Arduino开发板进行步进电机控制

    步进电机是一种无刷直流电机,可以分步旋转,是许多精密运动控制应用的最佳选择.此外,步进电机适用于定位.速度控制和低速需要大扭矩的应用. 在之前的MATLAB教程中,我们已经介绍了如何使用MATLAB来 ...

  4. 直流电机 matlab,使用MATLAB和Arduino开发板进行直流电机控制

    在本篇文章中,我们将主要介绍如何使用MATLB和Arduino开发板控制直流电机.如果您是初次使用MATLAB软件,建议您先学习如何使用MATLAB实现简单的LED闪烁. 创建用于控制直流电机的MAT ...

  5. [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速

    1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...

  6. python控制电机_[MicroPython]TurnipBit开发板旋转按钮控制直流电机转速

    1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...

  7. 国产车规工业芯片,开发板,工业控制PLC,DCS,电力控制

    基于D9的电力智能设备解决方案高性能D9芯片广泛应用于电力智能设备领域,内置双核锁步Cortex R5配合安全启动.内置HSM支持SM2/3/4/9国密算法.支持高实时多并行中断响应.支持时间敏感以太 ...

  8. 【STM32 .Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用 uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC - ...

  9. 树莓派Pico开发板与大功率MOSFET/IGBT器件驱动控制24V直流电机技术实践

    摘要:本文在介绍MOSFET器件和IGBT器件作为电子开关基本原理的基础上,讲述了树莓派Pico与MOSFET&IGBT器件驱动控制24V直流电机硬件接口技术,最后给出了树莓派Pico开发板G ...

  10. 【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC -& ...

最新文章

  1. tomcat 连接oracle重连,JSP+Tomcat连接Oracle数据库
  2. apache设置网页gzip压缩(亲测可用)
  3. reactor使用方法_Project Reactor展开方法
  4. linux ls命令shell脚本位置,linux - shell脚本到ls并在ls上执行命令结果 - SO中文参考 - www.soinside.com...
  5. python数据分析多久能学会_周末深夜,学妹说她想做Python数据分析师....
  6. 开始启用51CTO的博客
  7. spo机试题JAVA_基于龙芯处理器的Java运行环境的移植与优化
  8. 什么是Http无状态协议?
  9. 深入理解 Hive 分区分桶 (Inceptor)
  10. winserve2016 万能驱动网卡_windows server 2016 安装有线网卡驱动
  11. 74HC/LS/HCT/F系列芯片的区别及使用[转]
  12. RobotStudio知识你知多少?
  13. IOS-简单的自建ipa在线安装服务
  14. Eclipse的配置使用
  15. python 基于itchat详解微信防撤回程序
  16. 计算机基本原理——CPU的工作原理
  17. 2019-5-30 个人创业跟在公司上班的区别体验小书
  18. 2014年12月31日这一天,我想说明天会更好!
  19. Spring应用启动后执行任务的几种方法
  20. 3D建模在线展示/三维模型可视化线上VR智慧城市

热门文章

  1. C#操作Word书签
  2. 异数OS 开放式闭源继承人协议
  3. 2021高校毕业礼物,竞争太激烈了!
  4. 计算机网络技术该考什么证,计算机网络工程师证书
  5. 【PM】互联网项目管理的特点总结
  6. 转行IT行业,月薪过万需要多久?
  7. csm和uefi_传统bios引导与uefi引导之比较
  8. jk背带是什么意思_JK 制服和 LO 装 (科普向)
  9. 测试移动硬盘的真实容量的软件,移动硬盘容量标识有猫腻:实际缩水99%
  10. GPIO输入输出模式原理(八种工作方式附电路图详解)