学习内容
进一步熟悉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公众号同步更新~
欢迎大家关注我的公众号。如果需要工程微信后台留言即可~