《EMIO方式模拟I2C时序对ADV7511进行读写.doc》由会员分享,可在线阅读,更多相关《EMIO方式模拟I2C时序对ADV7511进行读写.doc(3页珍藏版)》请在三一文库上搜索。
1、EMIO方式模拟I2C时序对ADV7511进行读写创建硬件工程,很简单,PS接出两个EMIO和一个74.25M时钟管脚约束# ADV7511 I2C_SCLset_property PACKAGE_PIN AA18 get_ports gpio_0_tri_io0set_property IOSTANDARD LVCMOS33 get_ports gpio_0_tri_io0# ADV7511 I2C_SDAset_property PACKAGE_PIN Y16 get_ports gpio_0_tri_io1set_property IOSTANDARD LVCMOS33 get_port
2、s gpio_0_tri_io1# ADV7511 HDMI_CLKset_property PACKAGE_PIN W18 get_ports FCLK_CLK1set_property IOSTANDARD LVCMOS33 get_ports FCLK_CLK1导出 Hardware,启动SDK,新建一个应用,添加以下代码EMIO_init.c#include EMIO_init.hstaTIc XGpioPs psGpioInstancePtr;int EMIO_I2C_init(void)XGpioPs_Config* GpioConfigPtr;int xStatus;GpioCo
3、nfigPtr = 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 nr);XGpioPs_SetDirecTIonPin(psGpioInstancePtr, SIOC_PIN,DIRECT
4、ION_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(voi
5、d)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
6、);/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.hint EMIO_I2C_init(void);#define SIOC_PIN 54#define SIOD_PIN 55#define RESET_PIN 56#define DIRE
7、CTION_INPUT 0#define DIRECTION_OUTPUT 1void 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
8、(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; i8; i+)if(tmp 0x80 )DATA_HIGH();else
9、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_
10、INPUT();for(i=0; i8; 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)/ 两相写I2C_start();if(I2C_sendbyte(id1) != 0)goto error;if(I2C_sendbyte(addr) != 0)goto error;/ 两相读I2C_start();if(I2C_sendbyte(id1)|0x1) != 0)goto error;*value = I2C_readbyte(addr);I2C_end();return 0;error:I2C_end();return -1;