#include <stdio.h>
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xiicps.h"
XIicPs rtc_i2c ;
static u8 Readbuf[2] ;
int i2c_init(XIicPs *Iic,short DeviceID ,u32 IIC_SCLK_RATE) ;
void temp_read(XIicPs *InstancePtr, u8 *rd_data, char IIC_ADDR) ;
int main()
{
//温度的小数点部分
float point ;
//温度整数部分
float temp ;
//初始化IIC 配置速度为100KHz
i2c_init(&rtc_i2c, XPAR_XIICPS_0_DEVICE_ID ,100000) ;//100KHz
while(1){
//从温度传感器读数据
temp_read(&rtc_i2c, Readbuf, 0x48) ; //读取当前温度 0x48为测温模块的地址
//判断第七位是否为1, 为1时 point = 0.5C, 否则 0
if (Readbuf[1] & 0x80)
point = 0.5 ;
else
point = 0 ;
//if bit7 equals to 1, then it is negative value
if (Readbuf[0] & 0x80){
temp = (float)(Readbuf[0]-256) + point ;
}
else{
temp = (float)(Readbuf[0]) + point ;
}
printf("current temp is:%.1f\t\n",temp);
sleep(1) ;
}
return 0;
}
int i2c_init(XIicPs *Iic,short DeviceID ,u32 IIC_SCLK_RATE)
{
XIicPs_Config *Config;
int Status;
//初始化IIC驱动
Config = XIicPs_LookupConfig(DeviceID);
if (NULL == Config) {
xil_printf("XIicPs_LookupConfig failure\r\n");
return XST_FAILURE;
}
Status = XIicPs_CfgInitialize(Iic, Config, Config->BaseAddress);
if (Status != XST_SUCCESS) {
xil_printf("XIicPs_CfgInitialize failure\r\n");
return XST_FAILURE;
}
//配置IIC速度
XIicPs_SetSClk(Iic, IIC_SCLK_RATE);
//检查IIC总线是否繁忙
while (XIicPs_BusIsBusy(Iic));
return XST_SUCCESS;
}
void temp_read(XIicPs *InstancePtr, u8 *rd_data, char IIC_ADDR)
{
//轮询模式根据IIC地址读取数据
XIicPs_MasterRecvPolled(InstancePtr, rd_data, 2, IIC_ADDR);
//检查IIC总线是否繁忙
while (XIicPs_BusIsBusy(InstancePtr));
}
ZYNQ IIC
最新推荐文章于 2024-01-05 15:03:13 发布