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

网友投稿 422 2022-09-21

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

学习内容

进一步熟悉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_sclset_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 #include "platform.h"#include "xil_printf.h"#include "xiicps.h"#include "xparameters.h"#include "sleep.h"#define#define#define// XIicPs* iicps;static XIicPs iicps;static XIicPs_Config * iicpscfgtr;//初始化 iicint 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或者不同协议的开发时候,我们一定要进行电平的匹配,本次工程就是遇到了这样的问题,根据具体的开发板,传感器,还有配置的输出电平,进行合适的配置,是成功运行的关键。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:2020年最后一战,武磊防守比进攻多!
下一篇:ZYNQ-BOOT介绍与程序固化
相关文章

 发表评论

暂时没有评论,来抢沙发吧~