本文主要講述zynq的iic使用。此IIC只能作為主站,作為從站的不適合本文。
Iic的接口在ps端。(iic的接口在pl端的情況下,不適合本文)
使用軟件版本:vivado2018.3
pl端設置:
轉載:https://blog.csdn.net/weixin_36590806/article/details/111485711
歡迎轉載!
ps端:
1、初始化操作:
2、寫操作
使用函數“XIicPs_MasterSendPolled(&Iic, senddata, len, addr)”
定義一個u8 senddata[6];
senddata[0] = reg; 寄存器地址
senddata[1] = val; 數據內容
&lic:設備地址,
senddata:寄存器地址和寫內容
len:寫入數據的長度
addr:是iic器件地址。
3、讀操作
XIicPs_MasterRecvPolled(&Iic, val, len, addr);
&lic:設備地址,
Val: 讀取的數據內容
len:讀取數據的長度
addr:是iic器件地址。
對於讀函數,需要在注意的地方在於需要根據實際設備的讀時序進行封裝,直接調用這個函數可能不會成功。
在這個時序中可以看出,我們是先發送一個寫動作,但沒有實際數據寫入,然后在發送一個讀指令。在sdk中寫函數和讀函數是分開的,所以我們在讀取數據時,可能跟我們在使用模擬iic操作的時候不太一樣。
unsigned char IIC_read_reg(unsigned char address, unsigned char reg)
{
unsigned char val;
int Status;
unsigned char senddata[6];
senddata[0] = reg;
Status = XIicPs_MasterSendPolled(&Iic, senddata, 1, address);
if (Status != XST_SUCCESS)
{
printf("IIC Master integerReg Wirte Failed\r\n");
return XST_FAILURE;
}
while(XIicPs_BusIsBusy(&Iic));
Status = (si0_iic_read(&val,2,address));
if (Status != XST_SUCCESS)
{
printf("IIC Master integerReg Read Failed\r\n");
return XST_FAILURE;
}
return (val);
}
嘻嘻嘻。