Hace unos días subimos un nuevo tutorial a nuestro canal de Youtube. El tutorial trata sobre como crear un periférico I2C y conectarlo al procesador ARM dentro la FPGA Zynq de Xilinx.

En él veréis como:

  • Crear un sistema base con el procesador ARM dentro de la FPGA
  • Conectar el controlador I2C de Xilinx a través del bus AXI, mediante el interface gráfico de Vivado. Para encontrarlo dentro de Vivado tenéis que buscar IIC, no I2C.
  • Crear un programa en C para el procesador ARM que controle un potenciometro digital (EEPOT) conectado a los pines de la FPGA.
  • Capturar el bus I2C para comprobar que todo se esta realizando de forma correcta mediante el software de analizador lógico de código abierto PulseView.

El video es el siguiente:

A continuación os dejamos la captura del diagrama de bloques y el código C utilizado para controlar el potenciometro es el siguiente:

diagrama de bloques i2c zynq
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xiic.h"

#define IIC_DEVICE_ID		XPAR_IIC_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_INTC_0_DEVICE_ID
#define INTC_IIC_INTERRUPT_ID	XPAR_INTC_0_IIC_0_VEC_ID

int main()
{
	u8 buffer[2];

	XIic_Config *ConfigPtr;	/* Pointer to configuration data */
	int Status;
	XIic IicInstance;

    init_platform();

    print("I2C EEpot test\n\r");

    ConfigPtr = XIic_LookupConfig(IIC_DEVICE_ID);

	Status = XIic_CfgInitialize(&IicInstance, ConfigPtr, ConfigPtr->BaseAddress);

	Status = XIic_SetAddress(&IicInstance, XII_ADDR_TO_SEND_TYPE, 0x18);

	Status = XIic_Start(&IicInstance);

	/*
	 * Send the Data.
	 */
	buffer[0]=0;
	buffer[1]=52;

	Status = XIic_MasterSend(&IicInstance, buffer, (u16)3);

	while (XIic_IsIicBusy(&IicInstance) == TRUE) {

	}

	//Status = XIic_Stop(&IicInstance);
    cleanup_platform();
    return 0;
}