XIicPs_MasterSendPolled和XIicPs_MasterRecvPolled
Xilinx FPGA的IIC程序中的XIicPs_MasterSendPolled和XIicPs_MasterRecvPolled函数的使用,8位寄存器地址写入24位数据
硬件平台:黑金AX7010开发板
vivado版本:Vivado 2017.4
SDK平台:SDK 2017.4
目的:利用FPGA通过PS端EMIO的IIC配置图像传感器,该寄存器是8位寄存器地址写入24位数据
如何知道XIicPs_MasterSendPolled和XIicPs_MasterRecvPolled函数的使用方法(参数说明)
1、在BSP文件下有很多BSP文件,找到iicps_v3_5文件,点击(要使BSP文件中包含iicps_v3_5文件,必须先在vivado中配置了IIC,使能IIC后BSP会自动加载iicps_v3_5文件)
2、点击后,会自动跳转到文档介绍页面
3、在SDK中,通过函数间的跳转,可以发现XIicPs_MasterSendPolled函数就是在xiicps_master.c中被定义的
4、如下所示,在网页中就可以找到XIicPs_MasterSendPolled函数相关的介绍了
5、如下图所示,就能看到XIicPs_MasterSendPolled函数的作用,参数配置,各个参数的作用,以及各个参数的含义,
例如这里XIicPs_MasterSendPolled函数的参数中:
InstancePtr是指的是XIicPs例化的时候指向的IIC的指针,就是PS端的IIC端口的地址,一般是&ps_i2c0之类的
MsgPtr是发送数据时存储的缓存变量
ByteCount是你想发送的字节数
SlaveAddr是设备的地址
这样调用即可
同理:XIicPs_MasterRecvPolled函数的使用也可以按这样进行
如何往传感器的8位寄存器地址写入24位数据
给出我所写的往传感器的8位寄存器地址写入24位数据的代码
int i2c_reg8_write24(XIicPs *InstancePtr, char IIC_ADDR, char Addr, u32 Data)
{
int Status;
u8 SendBuffer[4];
SendBuffer[0] = Addr;
SendBuffer[1] = Data;
SendBuffer[2] = Data>>8;
SendBuffer[3] = Data>>16;
xil_printf("SendBuffer[0]=0x%02x\r\n", SendBuffer[0]);
xil_printf("SendBuffer[1]=0x%02x\r\n", SendBuffer[1]);
xil_printf("SendBuffer[2]=0x%02x\r\n", SendBuffer[2]);
xil_printf("SendBuffer[3]=0x%02x\r\n", SendBuffer[3]);
Status = XIicPs_MasterSendPolled(InstancePtr, SendBuffer,4, IIC_ADDR);
while (XIicPs_BusIsBusy(InstancePtr)); //等待接口写入完成
return Status;
}
给出我所写的向传感器的8位寄存器地址读出24位数据的代码
char i2c_reg8_read24(XIicPs *InstancePtr, char IIC_ADDR, char Addr)
{
u8 wr_data;
u8 rd_data[3];
wr_data = Addr;
XIicPs_MasterSendPolled(InstancePtr, &wr_data, 1, IIC_ADDR);
while (XIicPs_BusIsBusy(InstancePtr));
XIicPs_MasterRecvPolled(InstancePtr, rd_data, 3, IIC_ADDR);
while (XIicPs_BusIsBusy(InstancePtr));
for (int i = 0; i < 3; i++)
{
xil_printf("rd_data=0x%02x\r\n", rd_data[i]);
}
return rd_data[3];
}
上面有很多xil_printf,目的就是可以输出到串口上,直观的验证我写入是否正确,亲测可以实现8位寄存器地址写入24位数据。