ZYNQ-实现外设驱动开发-iic接口的温湿度传感器si7021
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公众号同步更新~
欢迎大家关注我的公众号。如果需要工程微信后台留言即可~
相关文章
- Linux Platform devices 平台设备驱动
- 驱动开发:内核中实现Dump进程转储
- Linux驱动之PCI子系统剖析
- 测试之路 pytest接口自动化框架-yaml数据驱动
- 驱动开发:对象回调监控文件访问
- 驱动开发:通过ReadFile与内核层通信
- DDD 领域驱动设计落地实践:六步拆解 DDD
- 百人谈 | B端和C端双轮驱动,打造数字人才培养闭环
- Linux下载安装扫描仪驱动程序指南(linux扫描仪驱动)
- Linux内存管理:洞悉驱动力(linux内存驱动)
- 查看Linux系统网卡驱动程序信息(查看网卡驱动linux)
- 给Linux更好的网络驱动体验(网络linux驱动)
- PHP与MSSQL:高效开发数据驱动应用程序(php与mssql)
- RD9700 USB转网卡在Linux系统下的驱动安装教程(rd9700linux)
- ASP操作Oracle 轻松实现查询驱动结果(asp查询oracle)
- Redis驱动的接口防刷技术(接口防刷 redis)