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