zynq学习笔记——EMIO方式模拟I2C时序对ADV7511进行读写
来源:互联网 发布:恺英网络王悦老婆 编辑:程序博客网 时间:2024/06/05 10:52
创建硬件工程,很简单,PS接出两个EMIO和一个74.25M时钟
管脚约束
# ADV7511 I2C_SCLset_property PACKAGE_PIN AA18 [get_ports {gpio_0_tri_io[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}]# ADV7511 I2C_SDAset_property PACKAGE_PIN Y16 [get_ports {gpio_0_tri_io[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[1]}]# ADV7511 HDMI_CLKset_property PACKAGE_PIN W18 [get_ports {FCLK_CLK1}]set_property IOSTANDARD LVCMOS33 [get_ports {FCLK_CLK1}]
导出 Hardware,启动SDK,新建一个应用,添加以下代码
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 \n\r");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 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_DELAYusleep(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();elseDATA_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){// 两相写I2C_start();if(I2C_sendbyte(id<<1) != 0){goto error;}if(I2C_sendbyte(addr) != 0){goto error;}// 两相读I2C_start();if(I2C_sendbyte((id<<1)|0x1) != 0){goto error;}*value = I2C_readbyte(addr);I2C_end();return 0;error:I2C_end();return -1;}int I2C_senddata(unsigned char id, unsigned char addr,unsigned char value){I2C_start();if(I2C_sendbyte(id<<1) != 0){goto error;}if(I2C_sendbyte(addr) != 0){goto error;}if(I2C_sendbyte(value)!= 0){goto error;}I2C_end();return 0;error:I2C_end();return -1;}
I2C_ctrl.h
#ifndef I2C_CTRL_H_#define I2C_CTRL_H_void I2C_start(void);void I2C_end(void);//void I2C_sendbyte( unsigned char value );int I2C_senddata(unsigned char id, unsigned char subaddr,unsigned char value);int I2C_readdata(unsigned char id, unsigned char addr, unsigned char *value);#endif /* I2C_CTRL_H_ */
helloworld.c
#define ADV7511_I2C_ADDR (0x72 >> 1)int main(){unsigned char data;int Status; init_platform(); EMIO_I2C_init(); usleep(500*1000); while(1) {//读取PIDdata = 0;I2C_senddata(ADV7511_I2C_ADDR,0x41,0x40);sleep(1);if(I2C_readdata(ADV7511_I2C_ADDR,0x41,&data) != 0){print("error\n\r");}else{if(data != 0x40)print("error\n\r");}data = 0;if(I2C_readdata(ADV7511_I2C_ADDR,0xf5,&data) != 0){print("error\n\r");}else{if(data != 0x75)print("error\n\r");}data = 0;if(I2C_readdata(ADV7511_I2C_ADDR,0xf6,&data) != 0){print("error\n\r");}else{if(data != 0x11)print("error\n\r");}sleep(2); } cleanup_platform(); return 0;}
阅读全文
0 0
- zynq学习笔记——EMIO方式模拟I2C时序对ADV7511进行读写
- zynq学习笔记——EMIO方式模拟SCCB时序进行读写操作
- I2C时序学习笔记
- Gpio模拟i2c总线对24c02进行读写
- 笔记——I2C总线的时序
- zynq学习05 Zynq 7000 emio的gpio操作
- I2C读写时序
- I2C读写时序
- I2C读写时序
- GPIO模拟i2c时序
- PIC单片机-普通IO口模拟I2C总线对24C02进行读写操作
- Zynq-Linux移植学习笔记之13-i2c驱动配置
- 树莓派学习笔记 ——I2C PCF8574 SysFs方式
- 串行通信i2c总线协议简明教程(连接方式,读写时序,24CXX系列EEPROM)
- I2C驱动情景分析——怎样控制I2C时序
- I2C驱动情景分析——怎样控制I2C时序
- LPC2478通过I2C对AT24C04(EEPROM)进行读写
- Linux I2C 对16位寄存器地址 进行读写操作
- angular---angular4学习笔记:angular中的模块化@NgModule装饰器
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全外连接
- 蘑*街面试感想和总结
- redis入门学习
- 自定义view__封装Dialog-分享功能UI的实现
- zynq学习笔记——EMIO方式模拟I2C时序对ADV7511进行读写
- 策略模式用于封装系列的算法,这些算法通常被封装在一个被称为 Context 类中,客户端程序可以自由选择其中一种算法
- 疯狂的bLue
- 动态规划求解矩阵连乘
- POJ 1973 Software Company 笔记
- Android 进阶16:IntentService 使用及源码解析
- 【Leetcode】58. Length of Last Word
- 流程python学习笔记:第三章(2)
- 以空格为分隔符的字符串提取