ps端代码
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xiicps.h"
#include "xparameters.h"
#define iic_device_id XPAR_PS7_I2C_0_DEVICE_ID
#define iic_rate 100000
#define iic_addra 0x40
static XIicPs IicPs;
static XIicPs_Config * IicPsCfgPtr;
int initIicPs(XIicPs*iicps,XIicPs_Config*iiccfg);
double avgfilter(double* sdrdataptr,double indata,int count);
int main()
{
int status;
status=initIicPs(&IicPs,IicPsCfgPtr);
if(status!=XST_SUCCESS){
return XST_FAILURE;
}
char hdata[2];
char tdata[2];
char cmdhum=0xE5;
char cmdtem=0xE3;
double tout,hout;
double avgdata[4];
avgdata[0]=0;
avgdata[1]=0;
avgdata[2]=0;
avgdata[3]=0;
unsigned short tmp=0;
while(1){
//read tem
status=XIicPs_MasterSendPolled(&IicPs,&cmdtem,0x01,iic_addra);
if(status!=XST_SUCCESS){
return XST_FAILURE;
}
status=XIicPs_MasterRecvPolled(&IicPs,tdata,0x02,iic_addra);
//read hum
status=XIicPs_MasterSendPolled(&IicPs,&cmdhum,0x01,iic_addra);
if(status!=XST_SUCCESS){
return XST_FAILURE;
}
status=XIicPs_MasterRecvPolled(&IicPs,hdata,0x02,iic_addra);
tmp=((tdata[0]<<8)|tdata[1] & 0xfc);
tout=(175.72 * tmp /65536)-46.85;
tmp=((hdata[0]<<8)|hdata[1] & 0xfe);
hout=(125*tmp/65536)-6;
tout =avgfilter(avgdata,tout,0x04);
printf("hum=%.1f ; tem=%.1f\n",hout,tout);
usleep(1000000);
}
return 0;
}
int initIicPs(XIicPs*iicps,XIicPs_Config*iiccfg){
int status;
iiccfg=XIicPs_LookupConfig(iic_device_id);
status= XIicPs_CfgInitialize(iicps,iiccfg,iiccfg->BaseAddress);
if(status!=XST_SUCCESS){
return XST_FAILURE;
}
//set rate
XIicPs_SetSClk(iicps,iic_rate);
if(status!=XST_SUCCESS){
return XST_FAILURE;
}
return XST_SUCCESS;
}
double avgfilter(double* sdrdataptr,double indata,int count){
int i;
double outdata;
for(i=0;i<count;i++){
if(i<count-1){
sdrdataptr[i+1]=sdrdataptr[i];
}
}
sdrdataptr[0]=indata;
outdata=(sdrdataptr[0]+sdrdataptr[1]+sdrdataptr[2]+sdrdataptr[3])/4;
return outdata;
}