學習內容
進一步熟悉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
#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();
return0;
}
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或者不同協議的開發時候,我們一定要進行電平的匹配,本次工程就是遇到了這樣的問題,根據具體的開發板,傳感器,還有配置的輸出電平,進行合適的配置,是成功運行的關鍵。