zynq系列中的FPGA,都會自帶兩個iic設備,我們直接調用其接口函數即可運用。使用xilinx官方提供的庫函數,開發起來方便快捷。
一:配置vavido
創建block design,勾選iic設備,可以看到iic的引腳可以進行這種分配,對照原理圖,勾選對應的引腳即可。
二:sdk開發
創建好工程后,在sdk中對iic設備進行初始化,和對iic設備的讀寫操作。
首先是對iic設備進行初始化,初始化iic設備的基地址,設備id,iic時鐘頻率等信息。
u32 XpsIic_Initialize(XIicPs*InstancePtr,u16 DeviceID,u32 iic_clk) { int Status; XIicPs_Config *Config;// print("查找設備信息");Config = XIicPs_LookupConfig(DeviceID);if (NULL== Config) { print("查找id失敗");return XST_FAILURE;} Status = XIicPs_CfgInitialize(InstancePtr, Config, Config->BaseAddress);if (Status!= XST_SUCCESS) { return XST_FAILURE;} Status = XIicPs_SelfTest(InstancePtr);if (Status!= XST_SUCCESS) { return XST_FAILURE;} /* * 設置i2c的sclk時鐘 */ Status=XIicPs_SetSClk(InstancePtr, iic_clk);if (Status!= XST_SUCCESS) { print("設置clk失敗");return XST_FAILURE;} return XST_SUCCESS;}
然后就是iic的讀寫操作,我們使用官方提供的iic接口函數,有時候也需要對其再次進行封裝,這樣自己使用起來比較順手。
1:發送函數
s32 XIicPs_MasterSendPolled(XIicPs*InstancePtr, u8 *MsgPtr, s32 ByteCount, u16 SlaveAddr)
這是一個用于master的輪詢發送函數,我們常用的iic發送函數模式就是輪詢的,至于中斷模式的,則是另一個函數XIicPs_MasterSend()。兩者看起來容易混淆
4個參數:
@param InstancePtr is a pointer to the XIicPs instance. 設備指針
@param MsgPtr is the pointer to the send buffer. 待發送數據數組指針
@param ByteCount is the number of bytes to be sent. 發送數據的個數
@param SlaveAddr is the address of the slave we are sending to. 從機地址
2:接收函數
s32 XIicPs_MasterRecvPolled(XIicPs*InstancePtr, u8 *MsgPtr, s32 ByteCount, u16 SlaveAddr)
此函數也是只用于輪詢模式的,不適合中斷模式的讀取,中斷模式的接收函數叫XIicPs_MasterRecv()
四個參數:
@param InstancePtr is a pointer to the XIicPs instance. 設備指針
@param MsgPtr is the pointer to the receive buffer. 接收數據存儲的地方
@param ByteCount is the number of bytes to be received. 接收到的數據個數
@param SlaveAddr is the address of the slave we are receiving from. 從機地址
對于讀函數,需要在注意的地方在于需要根據實際設備的讀時序進行封裝,直接調用這個函數可能不會成功。
舉個例子:
在這個時序中可以看出,我們是先發送一個寫動作,但沒有實際數據寫入,然后在發送一個讀指令。在sdk中寫函數和讀函數是分開的,所以我們在讀取數據時,可能跟我們在使用模擬iic操作的時候不太一樣。
u32XpsIic_ADS1015_Read(XIicPs *InstancePtr,u8Write_addr,u8ConReg_addr,u8Read_addr) { int status;u8buf[1]; buf[0] = ConReg_addr; status =XIicPs_MasterSendPolled(InstancePtr, buf,1,Write_addr); //先發送 寫地址+轉換寄存器地址if(status != XST_SUCCESS) {returnXST_FAILURE; } while(XIicPs_BusIsBusy(InstancePtr)); status =XIicPs_MasterRecvPolled(InstancePtr, ADS1015Buf,2, Read_addr); //在發送讀地址進行讀取數據if(status != XST_SUCCESS) {returnXST_FAILURE; }returnXST_SUCCESS; }
注意事項:
使用iic的接口函數進行開發時,從機的器件地址是7位的,不帶讀寫位。比如你在調用讀/寫函數時,程序內部會在這個地址的后面自動的補上這個讀寫位,所以這也和上面提到的為什么sdk有單獨的讀寫函數,也是基于這個原因。你調用寫函數時,就會在后自動補上0;調用讀函數時,就會在后面自動補1。
-
FPGA
+關注
關注
1643文章
21954瀏覽量
613992 -
接口
+關注
關注
33文章
8932瀏覽量
153189 -
Zynq
+關注
關注
10文章
614瀏覽量
48013 -
IIC設備
+關注
關注
0文章
3瀏覽量
5197
原文標題:ZYNQ——PS端IIC設備接口使用
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章PL讀寫PS端DDR數據

ZYNQ7000系列 PS、PL、AXI 、啟動流程基本概念

zynq XC7Z100板卡學習資料:基于zynq XC7Z100 FMC接口通用計算平臺
FPGAs,Zynq和Zynq MPSoC器件的特點
有關AXI IIC和PS IIC的自調試技巧
Zynq系列FPGA的亮點

評論