ZYNQ基础----驱动IIC外设

在ZYNQ中打开IIC

  在ZYNQ中,已经集成了IIC的外设的控制器,在配置ZYNQ核的时候,只需要打开IIC外设,就能够在SDK通过调用函数库中已经提供好的API就能够对IIC外设进行访问。

在这里插入图片描述
  生成bit文件后导出硬件描述文件,然后打开SDK。

SDK中进行裸机开发

在这里插入图片描述
  在system.mss中可以看到使用到的外设,在外设对应的文档中可以找到其对应的API。我只使用IIC的读写功能,主要的函数是发送和接收XIicPs_MasterRecvPolled(),XIicPs_MasterSendPolled();
在这里插入图片描述

程序设计

  IIC的初始化过程首选需要去通过设备ID查找配置结构体,然后需要根据配置结构体来对设备进行初始化,在初始化的时候,我顺便设置了IIC的时钟的频率。封装了IIC的读写函数,可以在配置的时候,根据配置列表的值直接进行使用就行了。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xiicps.h"
// IIC device ID
#define IIC_DEV_ID 			XPAR_PS7_I2C_0_DEVICE_ID
#define IIC_RATE 			200000
//7位设备地址
#define SLAVE_ADDR			0x39

static 	XIicPs IicPs;
static 	XIicPs_Config * IicPs_Cfg;

//测试配置列表
u8 configList[12][2]={
		{0x00,0x00},
		{0x01,0x01},
		{0x02,0x02},
		{0x03,0x03},
		{0x04,0x04},
		{0x05,0x05},
		{0x06,0x06},
		{0x07,0x07},
		{0x08,0x08},
		{0x09,0x09},
		{0x0A,0x0A},
		{0x0B,0x0B}
};

// 初始化IIC,并设置IIC速率
int initIic()
{
	int status;
	// 1.查找IIC设备
	IicPs_Cfg = XIicPs_LookupConfig(IIC_DEV_ID);
	// 2.初始化
	status = XIicPs_CfgInitialize(&IicPs, IicPs_Cfg, IicPs_Cfg->BaseAddress);
	if(status != XST_SUCCESS)
	{
		print("initial IIC failed \n");
		return XST_FAILURE;
	}
	//设置IIC速率
	status = XIicPs_SetSClk(&IicPs, IIC_RATE);
	if(status != XST_SUCCESS)
	{
		print("set IIC clock rate failed \n");
		return XST_FAILURE;
	}
	return XST_SUCCESS;
}

/******************************************************************
 * function IIC完成单个寄存器的配置
 *
 * @parameter : XIicPs * iicPs =====> IIC设备结构体
 * @parameter : u16 slaveAddr  =====> IIC从机设备地址
 * @parameter : u8 * Cfg_Ptr ====> 配置寄存器的指针
 *
 * @return s32 XST_SUCCESS or XST_FAILURE
 ******************************************************************/
s32 writeReg(XIicPs * iicPs, u16 slaveAddr, u8 * Cfg_Ptr)
{
	s32 status ;
	//IIC写入数据,从机地址,寄存器地址和写入的数据
	status = XIicPs_MasterSendPolled(iicPs, Cfg_Ptr, 2, SLAVE_ADDR );
	if (status != XST_SUCCESS)
	{
		printf("configure register failed! \n");
		return XST_FAILURE;
	}
	//两次IIC写入之间保持一定间隔
	usleep(8000);
	return status;
}
/******************************************************************
 * function IIC从寄存器中读出数据
 *
 * @parameter : XIicPs * iicPs =====> IIC设备结构体
 * @parameter : u16 slaveAddr  =====> IIC从机设备地址
 * @parameter : u8 * Cfg_Ptr ====> 配置寄存器的指针
 *
 * @return u8 registerData =====> 从寄存器中读出的数据
 ******************************************************************/
u8 readReg(XIicPs * iicPs, u16 slaveAddr, u8 * regAddr)
{
	s32 status ;
	u8 registerData;
	//发送设备地址,寄存器地址
	status = XIicPs_MasterSendPolled(iicPs, regAddr, 1, SLAVE_ADDR );
	if (status != XST_SUCCESS)
	{
		printf("configure register failed! \n");
		return XST_FAILURE;
	}
	//从寄存器中读出数据
	status = XIicPs_MasterRecvPolled(iicPs, &registerData, 1, SLAVE_ADDR);
	if (status != XST_SUCCESS)
	{
		printf("configure register failed! \n");
		return XST_FAILURE;
	}
	return registerData;
}

int main()
{
    init_platform();
    u8 dataBuf[31];
    //初始化IIC
    int status = initIic();
    if(status != XST_SUCCESS)
    {
    	printf("initialize IIC failed \n");
    	return XST_FAILURE;
    }
    //依次写入配置列表
    for(int i=1; i < 12; i++ )
    {
    	writeReg(&IicPs, SLAVE_ADDR, configList[i]);
    }
    //将值从寄存器中读出
    for(int i = 0; i < 12; i++)
    {
    	dataBuf[i] = readReg(&IicPs, SLAVE_ADDR, &configList[i][0]);
    	printf("dataBuf[%d] = %x \n",i , dataBuf[i]);
    }

    print("Hello World\n\r");

    cleanup_platform();
    return 0;
}

测试结果:
在这里插入图片描述

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zynq-7000是Xilinx推出的一款全新的可编程系统芯片(SoC),其核心特点是将ARM Cortex-A9处理器与可编程逻辑器件(FPGA)集成在一起。ZED是由Digilent和Avnet合作生产的一款基于Zynq-7000 SoC的开发板。 关于Zynq-7000-ZED的资料,您可以从以下几个方面进行了解和获取: 1. 官方文档:Xilinx官方网站提供了针对Zynq-7000 SoC的详细技术资料和应用指南,包括技术手册、用户指南、应用笔记等。这些资料涵盖了硬件设计、软件开发、调试和测试等方面的内容,非常全面详细。 2. 社区论坛:在Xilinx官方网站上,您可以加入或搜索Xilinx社区论坛。这个论坛是一个交流平台,可以与其他用户分享经验和解决问题。在论坛上,您可以找到很多关于使用Zynq-7000-ZED进行开发的实际案例和技术讨论。 3. 参考设计和开发板说明:Digilent和Avnet官方网站上提供了基于Zynq-7000-ZED开发板的一些参考设计和示例代码。这些参考设计涵盖了不同的应用领域,包括图像处理、通信、机器学习等。通过研究这些设计,您可以更好地了解如何使用Zynq-7000-ZED进行应用开发。 4. 在线教程和视频:在互联网上,有许多第三方的在线教程和视频可以帮助您快速入门Zynq-7000-ZED的开发。这些教程和视频通常以实际的项目为例,展示了如何进行硬件设计、软件开发和调试等过程。 总之,Zynq-7000-ZED的资料非常丰富,包括官方文档、社区论坛、参考设计、在线教程等多种渠道。只要您愿意花时间去研究和学习,就能够轻松掌握Zynq-7000-ZED的开发技术和应用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值