EMIO mode analog I2C timing for reading and writing ADV7511

Create hardware engineering, very simple, PS picks up two EMIOs and one 74.25M clock

EMIO mode analog I2C timing for reading and writing ADV7511

Pin constraint
# ADV7511 I2C_SCL
Set_property PACKAGE_PIN AA18 [get_ports {gpio_0_tri_io[0]}]
Set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}]

# ADV7511 I2C_SDA
Set_property PACKAGE_PIN Y16 [get_ports {gpio_0_tri_io[1]}]
Set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[1]}]

# ADV7511 HDMI_CLK
Set_property PACKAGE_PIN W18 [get_ports {FCLK_CLK1}]
Set_property IOSTANDARD LVCMOS33 [get_ports {FCLK_CLK1}]

Export Hardware, launch SDK, create a new application, add the following code

EMIO_init.c
#include "EMIO_init.h"

staTIc XGpioPs psGpioInstancePtr;
Int EMIO_I2C_init(void)
{
XGpioPs_Config* GpioConfigPtr;
Int xStatus;

GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
If(GpioConfigPtr == NULL)
Return XST_FAILURE;

xStatus = XGpioPs_CfgIniTIalize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
If(XST_SUCCESS != xStatus)
Print("EMIO INIT FAILED ");

XGpioPs_SetDirecTIonPin(&psGpioInstancePtr, SIOC_PIN, DIRECTION_OUTPUT);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, SIOD_PIN, DIRECTION_OUTPUT);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, SIOC_PIN, 1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, SIOD_PIN, 1);

Return xStatus;
}

Void CLOCK_HIGH(void)
{
XGpioPs_WritePin(&psGpioInstancePtr, SIOC_PIN, 1);
}

Void CLOCK_LOW(void)
{
XGpioPs_WritePin(&psGpioInstancePtr, SIOC_PIN, 0);
}

Int GET_DATA(void)
{
Return XGpioPs_ReadPin(&psGpioInstancePtr, SIOD_PIN);
}

Void DATA_INPUT(void)
{
XGpioPs_SetDirectionPin(&psGpioInstancePtr, SIOD_PIN, DIRECTION_INPUT);//
}

Void DATA_OUTPUT(void)
{
XGpioPs_SetDirectionPin(&psGpioInstancePtr, SIOD_PIN, DIRECTION_OUTPUT);//
}

Void DATA_HIGH(void)
{
XGpioPs_WritePin(&psGpioInstancePtr, SIOD_PIN, 1);
}

Void DATA_LOW(void)
{
XGpioPs_WritePin(&psGpioInstancePtr, SIOD_PIN, 0);
}

EMIO_init.h
#ifndef EMIO_INIT_H_
#define EMIO_INIT_H_

#include "xgpiops.h"

Int EMIO_I2C_init(void);

#define SIOC_PIN 54
#define SIOD_PIN 55
#define RESET_PIN 56

#define DIRECTION_INPUT 0
#define DIRECTION_OUTPUT 1

Void CLOCK_HIGH(void);

Void CLOCK_LOW(void);

Void DATA_HIGH(void);

Void DATA_LOW(void);

Void DATA_INPUT(void);

Void DATA_OUTPUT(void);

Int GET_DATA(void);

#endif /* EMIO_INIT_H_ */

I2C_ctrl.c
#include "sleep.h"
#include "EMIO_init.h"

#define I2C_DELAY usleep(10)

Void I2C_start(void)
{
CLOCK_HIGH();
DATA_HIGH();
I2C_DELAY;
DATA_LOW();
I2C_DELAY;
CLOCK_LOW();
I2C_DELAY;
}

Void I2C_end(void)
{
DATA_LOW();
I2C_DELAY;
CLOCK_HIGH();
I2C_DELAY;
DATA_HIGH();
I2C_DELAY;
}

Int I2C_sendbyte( unsigned char value )
{
Unsigned char tmp = value;
Unsigned char i=0, ack;

For(i=0; i<8; i++)
{
If(tmp & 0x80 )
DATA_HIGH();
Else
DATA_LOW();

I2C_DELAY;
CLOCK_HIGH();
I2C_DELAY;
CLOCK_LOW();
I2C_DELAY;

Tmp<<=1;
}

DATA_HIGH();
DATA_INPUT();
I2C_DELAY;
CLOCK_HIGH();
Ack = GET_DATA();
I2C_DELAY;
CLOCK_LOW();
I2C_DELAY;
DATA_OUTPUT();

If(ack==1)
{
Return -1;
}

Return 0;
}

EMIO方式模拟I2C时序对ADV7511进行读写

Unsigned char I2C_readbyte( unsigned char addr)
{
Unsigned char i=0,data=0;

DATA_HIGH();
DATA_INPUT();

For(i=0; i<8; i++)
{
CLOCK_HIGH();
I2C_DELAY;

Data <<= 1;
If(GET_DATA())
Data |= 1;

I2C_DELAY;
CLOCK_LOW();
I2C_DELAY;
}

DATA_OUTPUT();
DATA_HIGH();
I2C_DELAY;
CLOCK_HIGH();
I2C_DELAY;
CLOCK_LOW();
I2C_DELAY;
DATA_HIGH();

Return data;
}

Int I2C_readdata(unsigned char id, unsigned char addr, unsigned char *value)
{
// two-phase writing
I2C_start();
If(I2C_sendbyte(id<<1) != 0)
{
Goto error;
}

If(I2C_sendbyte(addr) != 0)
{
Goto error;
}

// two-phase reading
I2C_start();
If(I2C_sendbyte((id<<1)|0x1) != 0)
{
Goto error;
}
*value = I2C_readbyte(addr);
I2C_end();

Return 0;

Error:
I2C_end();
Return -1;
}

Interactive Smart Board

Interactive Smart Board,Smart Boards,Smart Board Projector,Smart Electric Board

APIO ELECTRONIC CO.,LTD , https://www.displayapio.com