Zynq PS端外设之IIC

IIC协议

高电平采样:时序电路的信号采样一般靠的是时钟上升沿采样,而IIC协议则是靠高电平采样。

  • 读写数据帧
    Zynq PS端外设之IIC_第1张图片

Zynq PS的IIC外设

1. PS 的 I2C 0

I2C 0的引脚既可以使用MIO,也可以使用EMIO。为了方便起见,可以直接Open Elaborated Design对EMIO进行管脚约束。

Zynq PS端外设之IIC_第2张图片

2. SDK开发

// iic用到的头文件
#include "xiicps.h"
#include "xparameters.h"
// iic的配置实例和指针
static XIicPs IicPs;
static XIicPs_Config * IicPsCfgPtr;
// iic用到的参数宏定义
#define IIC_DEVICE_ID XPAR_PS7_I2C_0_DEVICE_ID
#define IIC_RATE 200000 // iic速率
#define IIC_SLV_ADDR 0xD4 // 从机地址
// iic初始化函数
int initIicPs(XIicPs *iicps , XIicPs_Config * iiccfg);

int initIicPs(XIicPs *iicps , XIicPs_Config * iiccfg){
	int status;

	iiccfg = XIicPs_LookupConfig(IIC_DEVICE_ID);
	status = XIicPs_CfgInitialize(iicps,iiccfg,iiccfg->BaseAddress);
	if(status != XST_SUCCESS){
		return	XST_FAILURE;
	}

	status = XIicPs_SetSClk(iicps,IIC_RATE);
	if(status != XST_SUCCESS){
			return	XST_FAILURE;
	}

	return XST_SUCCESS;
}

int main()
{
	int status;

	// 1.初始化iic
    status = initIicPs(&IicPs,IicPsCfgPtr);
    if(status != XST_SUCCESS){
    		return	XST_FAILURE;
    }
	// 2.iic发送数据函数
	u8 cmd;
	status = XIicPs_MasterSendPolled(&IicPs,&cmd,0x01,IIC_SLV_ADDR);
	if(status != XST_SUCCESS){
			return	XST_FAILURE;
	// 3. iic读数据
	u8 data_buf[2];
	status = XIicPs_MasterRecvPolled(&IicPs,data_buf,0x02,IIC_SLV_ADDR);
	if(status != XST_SUCCESS){
			return	XST_FAILURE;
			
    while(1){}

    return 0;
}

你可能感兴趣的:(fpga开发)