Create hardware engineering, very simple, PS picks up two EMIOs and one 74.25M clock
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;
}
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,Smart Boards,Smart Board Projector,Smart Electric Board
APIO ELECTRONIC CO.,LTD , https://www.displayapio.com