zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

ZYNQ-实现外设驱动开发-iic接口的温湿度传感器si7021

驱动接口开发 实现 传感器 ZYNQ 外设 IIC
2023-09-14 09:13:04 时间

学习内容

进一步熟悉IIC接口的开发调试,上次工程只是模拟开发,本次将进行实践操作。

开发环境

vivado 18.3
SDK
pynq-z2

硬件平台搭建

参考前文-ZYNQ-实现外设驱动开发-iic接口的光强度传感器GY-30的搭建过程
下面给出部分更改操作:
这里我们需要把之前选到的MIO改成EMIO
在这里插入图片描述
同时参考我们的pynq的电路图:
在这里插入图片描述
进行管脚分配,这里我开始把管脚分配到了AR_SCL和AR_SDA上,试了很多次都不行,然后我就改到了相邻的AR12和A13上,就能正常工作了,这里应该是之前电平一直没有匹配的问题,这里我也没找到好的办法,只能更换引脚。
添加约束文件,为EMIO提供管脚分配文件

set_property -dict { PACKAGE_PIN N17   IOSTANDARD LVCMOS18 } [get_ports { IIC_0_scl_io }]; #IO_L24N_T3_34 Sch=ar_scl
set_property -dict { PACKAGE_PIN P18   IOSTANDARD LVCMOS18 } [get_ports { IIC_0_sda_io }]; #IO_L24P_T3_34 Sch=ar_sdaIIC_0_scl_io

搭建完成,生成bit流然后输出。

SDK软件部分

这里我就直接给出代码吧,详细解释在前文了。

/*
 * helloworld.c: simple test application
 *
 * This application configures UART 16550 to baud rate 9600.
 * PS7 UART (Zynq) is not initialized by this application, since
 * bootrom/bsp configures it to baud rate 115200
 *
 * ------------------------------------------------
 * | UART TYPE   BAUD RATE                        |
 * ------------------------------------------------
 *   uartns550   9600
 *   uartlite    Configurable only in HW design
 *   ps7_uart    115200 (configured by bootrom/bsp)
 */

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xiicps.h"
#include "xparameters.h"
#include "sleep.h"
#define I2C_0_DEVICE_ID XPAR_PS7_I2C_0_DEVICE_ID
#define I2C_0_CLK 100000
#define IIC_0_SALV_ADDR 0x40
// XIicPs* iicps;
static XIicPs iicps;
static XIicPs_Config * iicpscfgtr;


//初始化 iic
int initIicPs(XIicPs *iicps , XIicPs_Config * iiccfg);
int main()
{
    int status;
    double h_out;
    double t_out;
    unsigned short tmp;
    char CmdHumidity = 0xE5;
    char CmdTemperature = 0xE3;
    char t_temp[2];
    char h_temp[2];
    init_platform();
    status=initIicPs(&iicps,iicpscfgtr);
    if(status !=XST_SUCCESS){
    		return XST_FAILURE;
    	}
    printf("load success!\n");
    while(1){
		status=XIicPs_MasterSendPolled(&iicps,&CmdTemperature,1,IIC_0_SALV_ADDR);
			if(status !=XST_SUCCESS){
						return XST_FAILURE;
					}
		XIicPs_MasterRecvPolled(&iicps,t_temp,2,IIC_0_SALV_ADDR);
		status=XIicPs_MasterSendPolled(&iicps,&CmdHumidity,1,IIC_0_SALV_ADDR);
				if(status !=XST_SUCCESS){
							return XST_FAILURE;
						}
				XIicPs_MasterRecvPolled(&iicps,h_temp,2,IIC_0_SALV_ADDR);
		tmp=(h_temp[0]<<8)|(h_temp[1]&0xfe);
		h_out=((125*tmp)/65536)- 6;
		tmp=(t_temp[0]<<8)|(t_temp[1]&0xfc);
		t_out=((175.72*tmp)/65536) - 46.85;
		printf("Humidity : %.1f   Temperature : %.1f\n",h_out,t_out);
		usleep(1000000);
    }
    cleanup_platform();
    return 0;
}
int initIicPs(XIicPs *iicps , XIicPs_Config * iiccfg){
	int status;
	iiccfg = XIicPs_LookupConfig(I2C_0_DEVICE_ID);
	status = XIicPs_CfgInitialize(iicps,iiccfg,iiccfg->BaseAddress);
	if(status != XST_SUCCESS){
		return	XST_FAILURE;
	}
	//set iic rate
	status = XIicPs_SetSClk(iicps,I2C_0_CLK);
	if(status != XST_SUCCESS){
			return	XST_FAILURE;
	}
	return XST_SUCCESS;
}

运行效果

在这里插入图片描述

summary

在我们进行IIC或者不同协议的开发时候,我们一定要进行电平的匹配,本次工程就是遇到了这样的问题,根据具体的开发板,传感器,还有配置的输出电平,进行合适的配置,是成功运行的关键。

Vuko公众号同步更新~

欢迎大家关注我的公众号。如果需要工程微信后台留言即可~
在这里插入图片描述