Xilinx FPGA Microblaze AXI_IIC使用方法及心得

Xilinx FPGA Microblaze AXI_IIC使用方法及心得

前言

最近公司要將主控程序從Cortex M系列的ARM上移植到Xilinx MPSoC內部R5核上,不使用操作系統,直接裸跑,實現原有功能的基礎上增加其他實時性要求更高的功能,在具體功能實施之前,由我先進行技術穿刺,將能用到的模塊提前先熟悉下,以便後續工程的開展,本着好好學習,認真負責的態度,我計劃在空閒時間把這些模塊的使用方法與心得總結下與大家分享下,技術交流的同時共同進步,如有問題,歡迎批評指正!
本次先着重講下AXI_IIC核的使用,後續還會包括以下模塊

  1. UART_AXI核使用及AXI總線詳解
  2. QSPI_AXI核的使用
  3. AXI_DMA與AXI_FIFO使用,實現PS與PL端數據交互
  4. PS端中斷的使用及其詳細調用過程
  5. PS端定時器、看門狗等模塊的使用
  6. 使用R5覈實現TCP/IP協議及R5核之間通過Cache數據交互
  7. 通過AXI_HWICAP模塊實現遠程更新

上述模塊會在近期一一更新,感興趣的朋友可以關注下我☺

平臺

Vivado 2017.4
ZCU102開發板
PSoC開發板(賽普拉斯的一款開發板,處理器爲Cortex M3,本實驗中用於模擬IIC從設)
示波器

結果展示

本文默認你對相關基礎已有了解,不做基礎講解,大家酌情繼續閱讀。
廢話不多說,先上結果。
程序運行結果
上圖是使用示波器抓取通信時的波形,黃色爲SCL,綠色爲SDA

實驗設計思路

由於IIC總線需要從設才能正常進行通信,在實驗器件,我就隨便找了塊開發板,模擬了一個IIC的從設備,程序運行時,使用AXI_IIC模塊讀取從設兩個字節數據,從設地址爲0x54,在PSoC內部編程使之每次被讀取後兩個字節數據各自加1,簡單框圖如下
程序設計思路

AXI_IIC 模塊簡介

AXI_IIC
上面是從官方文檔裏面截圖下來的,具體可以看官方文檔PG090,簡而言之,AXI_IIC模塊可以實現標準IIC總線,文檔中詳細介紹了AXI_IIC核內部寄存器,感興趣或者實際使用遇到問題可以仔細查看下,可以配合文檔末尾的讀寫操作步驟指導看,只是簡單使用的話可以直接調用官方封裝好的API文檔,方便快捷。

實施過程

新建工程編譯好後導入SDK,並在SDK中新建工程,可以先import example,查看官方的實例,然後再根據自己的需求改寫代碼,Documentation會鏈接到官方網站,裏面有所有的API函數和數據定義等,建議直接看.h和.c,個人覺得官方的網站內容做的不太方便查看。
import example 的方法如下圖
在這裏插入圖片描述
下圖爲XIic.h的部分內容截圖,裏面聲明瞭會用到的函數,底層全部是官方封裝好的,可以直接拿來調用,如果要自己寫底層驅動,可能要花費較長時間精力,唯一不好的地方是,在遇到問題調試的時候,官方提供的函數會直接跳到彙編語言處。
xiic.h內容
下面在自己新建的工程裏面參照example的方法初始化,然後就可以調用相關函數了,IIC收發主要用到XIic_MasterRecv()和XIic_MasterSend()兩個函數,在主函數中直接調用即可。
下面附上我整理好的初始化代碼,可以直接調用該函數進行初始化,需要輸入設備指針,設備ID,另外我還增加了一個設備名,方便打印輸出。

int IIC_axi_initialize(XIic *InstancePtr, u16 DeviceId, const char IICName[])
{
	int Status;
	XIic_Config *ConfigPtr;	/* Pointer to configuration data */

	/*
	 * Initialize the IIC driver so that it is ready to use.
	 */
	ConfigPtr = XIic_LookupConfig(DeviceId);
	if (ConfigPtr == NULL) {
		return XST_FAILURE;
	}

	Status = XIic_CfgInitialize(InstancePtr, ConfigPtr,
			ConfigPtr->BaseAddress);
	if (Status != XST_SUCCESS) {
		xil_printf("%s Initialization Failed\r\n",IICName);
		return XST_FAILURE;
		}
	else{
		xil_printf("%s Initialization Succeed\r\n",IICName);
	}

    return Status;
}

結語

時間精力有限,就先寫這麼多,要是有具體問題,歡迎留言討論!

各位看客老爺要是覺得有用可以掃碼打賞下以示支持,萬分感謝!

掃描打賞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章