AD9361 和 Zynq 及其參考設(shè)計說明
掃描二維碼
隨時隨地手機看文章
目錄
一、AD9361概述
1.1 AD9361芯片結(jié)構(gòu)
1.2 AD9361性能特點
1.3 AD-FMCOMMS2-EBZ性能特點
二、Zynq-7000概述
2.1 Zynq的芯片結(jié)構(gòu)
2.2 ZC702簡介和結(jié)構(gòu)
三、AD9361和ZC702之間的數(shù)據(jù)通路
四、AD9361參考設(shè)計說明(PL側(cè)硬件部分)
4.1 IP核的概念
4.2 硬件設(shè)計
五、AD9361 參考設(shè)計說明(PS側(cè)軟件部分)
5.1 AD9361 no-OS Software 概述
5.2 AD9361 no-OS Software 頂層目錄說明
5.3 main.c文件
5.4 dac_init函數(shù)
5.5 adc_capture函數(shù)
一、AD9361概述
1.1 AD9361芯片結(jié)構(gòu)
AD9361是一款面向3G和4G基站應(yīng)用的高性能、高集成度的射頻(RF)Agile Transceiver?捷變收發(fā)器。芯片采用了零中頻架構(gòu),將整個射頻以及中頻信號電路集成在一個芯片中,包括射頻放大器、 模擬濾波器、混頻器、解調(diào)器、 12 位的 ADC 和 DAC 的 RF 2x2(接收和發(fā)送通道各兩路) 收發(fā)器, 另外還集成了收發(fā)通道的頻率合成器, 同時為每個接收子系統(tǒng)集成了獨立的自動增益控制( AGC) 、直流失調(diào)校正、正交校正和數(shù)字濾波電路,消除了數(shù)字基帶中提供這些功能的必要性,每個通道搭載兩個高動態(tài)范圍 ADC, 先將收到的I 信號和 Q 信號進(jìn)行數(shù)字化處理,然后將其傳給可配置抽取濾波器和抽頭有限脈沖響應(yīng)( FIR) 濾波器,以相應(yīng)的采樣率生成 12 路輸出信號。
圖 1 AD9361芯片結(jié)構(gòu)
1.2 AD9361性能特點
AD9361 的工作頻率為 70 MHz ~ 6 GHz,涵蓋了大部分特許執(zhí)照和免執(zhí)照頻段,支持可調(diào)諧 200 kHz ~ 56 MHz 的通道帶寬,且具有高度的可編程能力, 發(fā)射器采用了直接變頻架構(gòu),可實現(xiàn)較高的調(diào)制精度和較低的噪聲,在接收通道,接收噪聲系數(shù)可以做到小于 2. 5 dB,此外,該芯片的 EVM 可以做到小于-40 dB,可為外部功率放大器的選擇留出客觀的系統(tǒng)裕量,并且,芯片還支持 AGC 自動增益和更加靈活的手動增益模式,支持外部控制。公眾號:OpenFPGA
1.3 AD-FMCOMMS2-EBZ性能特點
AD-FMCOMMS2-EBZ是一款高速模擬模塊,設(shè)計用于展示AD9361的硬件評估板。AD-FMCOMMS2-EBZ使射頻工程師能夠?qū)D9361連接到射頻測試平臺(矢量信號分析儀、信號發(fā)生器等)并測量性能。
圖 2為AD-FMCOMMS2-EBZ的外觀:
圖 2 AD-FMCOMMS2-EBZ外觀
通俗來講,AD9361就是一個集成度很高的信號收發(fā)器,用戶不需要向普通收發(fā)器那樣準(zhǔn)備放大器,混頻器等等部件;它可以通過搭載它的評估板上的FMC接口與各種母板連接,連接后,在母板上用戶可以使用ADI公司提供的API編程來配置AD9361的一些參數(shù)例如濾波器系數(shù)等等,達(dá)到靈活控制收發(fā)器的目的,而且工作頻率寬,設(shè)計也很簡單。
AD-FMCOMMS2-EBZ就是是搭載AD9361的評估板,用于外圍設(shè)備(例如天線和FMC接口)與AD9361的連接。
二、Zynq-7000概述
2.1 Zynq的芯片結(jié)構(gòu)
Zynq-7000 AP SOC是Zynq-7000全可編程片上系統(tǒng)的縮寫(Zynq-7000 All Programmable System on Chip),它通過將一個雙核ARM Cortex-A9處理系統(tǒng)(Processing System,簡稱PS)和Xilinx 7-Series 28nm 可編程邏輯(Programmable Logic,簡稱PL)及各種接口等周邊設(shè)備集成到一個芯片上組成一個片上系統(tǒng)(SOC),來減少系統(tǒng)的復(fù)雜性。圖 3為一個最簡單的Zynq結(jié)構(gòu)模型:
圖 3 Zynq簡單結(jié)構(gòu)模型
Zynq最為簡單的結(jié)構(gòu)模型就只有兩部分:PS和PL,PS和PL之間通過AXI接口進(jìn)行數(shù)據(jù)通信,這樣,使用Zynq SOC既可以單獨使用ARM來實現(xiàn)嵌入式系統(tǒng)的設(shè)計,又可以使用FPGA來實現(xiàn)各種時序和邏輯的設(shè)計,最為關(guān)鍵的是可以同時使用二者來進(jìn)行更為靈活的系統(tǒng)設(shè)計。公眾號:OpenFPGA
值得注意的是,Zynq的處理系統(tǒng)(PS)并不是只包含ARM處理器,還包含應(yīng)用處理單元(Application Processing Unit,APU)和外圍接口,緩存區(qū),內(nèi)存接口和時鐘電路;Zynq可以單獨使用PS部分,但無法單獨使用PL部分,要想使用PL部分必須得啟動PS側(cè),通過PS來配置PL。
圖 4為較為詳細(xì)的Zynq結(jié)構(gòu)圖,上半部分PS側(cè)結(jié)構(gòu),其中為綠色部分為APU;下半部分為PL側(cè)結(jié)構(gòu)。
圖 4 Zynq結(jié)構(gòu)模型
2.2 ZC702簡介和結(jié)構(gòu)
Xilinx ZC702是一個評估板,為Zynq SoC提供一個開發(fā)和評估的硬件環(huán)境。ZC702和一些嵌入式處理系統(tǒng)有共同的特性,包括DDR3內(nèi)存,三模式以太網(wǎng),通用I/O和兩個URAT接口。另外ZC702還支持FMC。使用ZC702作為平臺連接AD-FMCOMMS2-EBZ板子可以生成需要發(fā)送的信號、對采集到的信號進(jìn)行處理等功能。圖 5為ZC702的外觀結(jié)構(gòu),圖 6為ZC702的簡略的框架結(jié)構(gòu)
圖 5 ZC702外觀結(jié)構(gòu)
圖 6 ZC702結(jié)構(gòu)框圖
三、AD9361和ZC702之間的數(shù)據(jù)通路
ADI公司提供了基于ZC702的硬件(PL側(cè))和軟件(PS側(cè))設(shè)計,作為AD9361和Zynq之間的連接和使用的基礎(chǔ)。在其提供的硬件設(shè)計的基礎(chǔ)上,AD9361和ZC702之間的數(shù)據(jù)通路如所示:
圖 7 AD9361和ZC702之間數(shù)據(jù)通路
右邊為AD9361部分,左邊為ZC702部分;二者通過FMC接口傳輸數(shù)據(jù)。在ZC702部分的藍(lán)色區(qū)域為zynq的PL部分,命名為AD9361Core;上方為ARM部分,其余為接口部分,為PS和PL及AD9361之間建立數(shù)據(jù)通道。
ADI公司也提供了代碼用于配置AD9361的參數(shù)和一些API用于數(shù)據(jù)的傳輸和接收;
與DDR進(jìn)行傳輸數(shù)據(jù)的傳輸方式為DMA傳輸方式:在DMAC(DMA控制器)的操作下,數(shù)據(jù)直接由源地址傳輸?shù)侥康牡刂?,(DDRAD9361)不需CPU的干預(yù),因此可以極大的提高了CPU的效率。
注意:如果使用PL側(cè)來產(chǎn)生用戶數(shù)據(jù)而是直接通過PS側(cè)來產(chǎn)生數(shù)據(jù)并發(fā)送的話,用戶數(shù)據(jù)應(yīng)該使用DMA傳輸方式和DDR。
在PFGA部分中DDS(直接數(shù)字式頻率合成器)產(chǎn)生的信號數(shù)據(jù)和從AD9361接收到的信號數(shù)據(jù)都需要進(jìn)行IQ調(diào)制和解調(diào)后,通過DMA方式傳輸?shù)紻DR中存儲,這樣方便ARM讀取數(shù)據(jù),并進(jìn)行處理。
以上的數(shù)據(jù)通路是通過硬件設(shè)計來實現(xiàn)的,若想真正配置和使用AD9361,還需通過運行在ARM上的軟件部分。
四、AD9361參考設(shè)計說明(PL側(cè)硬件部分)
4.1 IP核的概念
IP(Intellectual Property)內(nèi)核模塊是一種預(yù)先設(shè)計好的甚至已經(jīng)過驗證的具有某種確定功能的集成電路、器件或部件。它有幾種不同形式。IP內(nèi)核模塊有行為 (behavior)、結(jié)構(gòu)(structure)和物理(physical)3級不同程度的設(shè)計,對應(yīng)有主要描述功能行為的“軟IP內(nèi)核(soft IP core)”、完成結(jié)構(gòu)描述的“固IP內(nèi)核(firm IP core)”和基于物理描述并經(jīng)過工藝驗證的“硬IP內(nèi)核(hard IP core)”3個層次。這相當(dāng)于集成電路(器件或部件)的毛坯、半成品和成品的設(shè)計技術(shù)。
軟核是用VHDL等硬件描述語言描述的功能塊,但是并不涉及用什么具體電路元件實現(xiàn)這些功能。軟IP通常是以硬件描述 語言HDL源文件的形勢出現(xiàn),應(yīng)用開發(fā)過程與普通的HDL設(shè)計也十分相似,只是所需的開發(fā)硬軟件環(huán)境比較昂貴。軟IP的設(shè)計周期短,設(shè)計投入少。由于不涉 及物理實現(xiàn),為后續(xù)設(shè)計留有很大的發(fā)揮空間,增大了IP的靈活性和適應(yīng)性。其主要缺點是在一定程度上使后續(xù)工序無法適應(yīng)整體設(shè)計,從而需要一定程度的軟 IP修正,在性能上也不可能獲得全面的優(yōu)化。
因此,在AD9361參考設(shè)計中給出的IP核全為軟IP內(nèi)核
4.2 硬件設(shè)計
打開Vivado,打開…\hdl-hdl_2014_r2\projects\fmcomms2\zc702路徑下的AD9361的Vivado工程文件fmcomms2_zc702.xpr
點擊右側(cè)導(dǎo)航欄里的IP Integrator—Open Block Design
打開ADI公司給的AD9361的參考設(shè)計IP核框圖,每個藍(lán)色方塊即為硬件部分的各個IP核,如圖 8所示的部分(可放大觀看),該部分為AD9361 Core和DMA控制器部分(其余可在Vivado中查看)。
各IP核的源Verilog HDL代碼在hdl-hdl_2014_r2\library中,這些設(shè)計就是圖 7中左半部分的設(shè)計
圖 8 AD9361參考設(shè)計IP核框圖(DMA和AD9361部分)
五、AD9361 參考設(shè)計說明(PS側(cè)軟件部分)
5.1 AD9361 no-OS Software 概述
AD9361 no-OS Software是ADI公司提供的AD9361的軟件部分,運行在CPU(也就是Zynq的ARM)中,該程序為裸機程序(即無操作系統(tǒng)的程序),可以AD9361各個參數(shù)進(jìn)行配置,對PL中的一些寄存器進(jìn)行讀寫,控制發(fā)送數(shù)據(jù)源,控制DMAC(DMA控制器)對發(fā)送和接收的數(shù)據(jù)進(jìn)行傳輸,從而實現(xiàn)AD9361的基本功能:對數(shù)據(jù)的接收、處理和發(fā)送。整個程序是使用C語言來完成的。
5.2 AD9361 no-OS Software 頂層目錄說明
在ADI官網(wǎng)可以下載到no-OS-Software的源碼,下載到的源碼包含了很多ADI的收發(fā)器, 表 1列出的是AD9361的no-OS-Software中的文件和文件夾目錄結(jié)構(gòu)
|
目錄 |
子文件 |
解釋說明 |
|
console_commands |
command.h 、command.c |
包含用于控制AD9361的命令行的文件 |
|
console.h、console.c |
包含用于命令行操作、顯示等的與平臺串口相關(guān)的文件 |
|
|
platform_altera |
|
Altera平臺的相關(guān)文件(使用Xilinx平臺無需該文件) |
|
platform_generic |
|
通用平臺的相關(guān)文件(使用Xilinx平臺無需該文件) |
|
platform_linux |
|
Linux平臺相關(guān)的文件(使用Xilinx平臺無需該文件) |
|
platform_xilinx |
adc_core.h、adc_core.c |
模數(shù)轉(zhuǎn)換模塊控制文件,包括模塊的初始化和數(shù)據(jù)傳輸?shù)?/span> |
|
dac_core.h、dac_core.c |
模數(shù)轉(zhuǎn)換模塊控制文件,包括模塊的初始化和數(shù)據(jù)傳輸?shù)?/span> |
|
|
Platform.c、platform.h |
Xilinx平臺一些驅(qū)動文件 |
|
|
parameters.h |
以上文件所用到的參數(shù)的宏定義文件 |
|
|
ad9361.c |
|
AD9361的驅(qū)動文件,比如增益控制函數(shù)等 |
|
ad9361.h |
||
|
ad9361_api.c |
|
AD9361應(yīng)用編程接口驅(qū)動文件,比如AD9361的初始化函數(shù) |
|
ad9361_api.h |
||
|
common.h |
|
通用驅(qū)動文件,包含時鐘結(jié)構(gòu)體和通用宏定義 |
|
config.h |
|
AD9361和 AD9361 API的配置文件 |
|
main.c |
|
整個軟件部分的main函數(shù)文件 |
|
util.c |
|
util驅(qū)動文件 |
|
util.h |
|
表 1AD9361 no-OS-Software源碼目錄結(jié)構(gòu)
5.3 main.c文件
main.c文件是main函數(shù)所在文件,是整個程序的入口。
main.c文件的開頭是需要條件編譯的頭文件和宏定義。
/*****************************************************************************
Include Files *****************************************************************************/9
#include"config.h"
#include"ad9361_api.h"
#include"parameters.h"
#include"platform.h"
#ifdef CONSOLE_COMMANDS
#include"command.h"
#include"console.h"
#endif
#ifdef XILINX_PLATFORM
#include<< span="">xil_cache.h>
#endif
#ifdefined XILINX_PLATFORM ||defined LINUX_PLATFORM
#include"adc_core.h"
#include"dac_core.h"
#include"adc_interrupt.h"
#include"SD_card.h"
#endif
因此,在使用時需要根據(jù)情況在程序最開始對一些參數(shù)進(jìn)行宏定義,
使用ZC702需要添加語句:
#define XILINX_PLATFORM
如需使用命令行控制AD9361,需要添加語句:
#define CONSOLE_COMMANDS
如需使用ADC的數(shù)據(jù)捕獲功能,需要添加語句:
#defineCAPTURE_SCRIPT
然后是命令行函數(shù)所用到的一些變量的定義、對AD9361初始化所需要參數(shù)的變量定義和AD9361接收和發(fā)射端濾波器的定義。
AD9361_InitParam default_init_param ={
/* Identification number */
0, //id_no;
/* Reference Clock */
40000000UL,//reference_clk_rate
/* Base Configuration */
0, //two_rx_two_tx_mode_enable *** adi,2rx-2tx-mode-enable
1, //one_rx_one_tx_mode_use_rx_num *** adi,1rx-1tx-mode-use-rx-num
1, //one_rx_one_tx_mode_use_tx_num *** adi,1rx-1tx-mode-use-tx-num
1, //frequency_division_duplex_mode_enable *** adi,frequency-division-duplex-mode-enable
0, //frequency_division_duplex_independent_mode_enable *** adi,frequency-division-duplex-independent-mode-enable
0, //tdd_use_dual_synth_mode_enable *** adi,tdd-use-dual-synth-mode-enable
0, //tdd_skip_vco_cal_enable *** adi,tdd-skip-vco-cal-enable
0, //tx_fastlock_delay_ns *** adi,tx-fastlock-delay-ns
0, //rx_fastlock_delay_ns *** adi,rx-fastlock-delay-ns
0, //rx_fastlock_pincontrol_enable *** adi,rx-fastlock-pincontrol-enable
0, //tx_fastlock_pincontrol_enable *** adi,tx-fastlock-pincontrol-enable
0, //external_rx_lo_enable *** adi,external-rx-lo-enable
0, //external_tx_lo_enable *** adi,external-tx-lo-enable
5, //dc_offset_tracking_update_event_mask *** adi,dc-offset-tracking-update-event-mask
6, //dc_offset_attenuation_high_range *** adi,dc-offset-attenuation-high-range
之后的部分是整個軟件部分的主函數(shù),主函數(shù)的程序流程圖如圖 6所示(默認(rèn)定義了XILINX_PLATFORM常量):
圖 9 main函數(shù)流程圖
DAC模塊初始化使用的函數(shù)為dac_init函數(shù)
ADC數(shù)據(jù)捕獲使用到的函數(shù)為adc_capture函數(shù)
這兩個函數(shù)是控制數(shù)據(jù)傳輸?shù)闹饕瘮?shù),下面的章節(jié)將會詳細(xì)介紹這兩個函數(shù)。
5.4 dac_init函數(shù)
dac_init為DAC模塊初始化函數(shù),也負(fù)責(zé)DMA傳輸部分,將DDR中的數(shù)據(jù)送給AD9361。
dac_init函數(shù)的函數(shù)聲明為:
第一個參數(shù)struct ad9361_rf_phy *phy 為指向AD9361的射頻設(shè)備結(jié)構(gòu)體的指針。
第二個參數(shù)uint8_t data_sel為 需要發(fā)送的數(shù)據(jù)源的選擇:
enum dds_data_select
{
DATA_SEL_DDS,
DATA_SEL_SED,
DATA_SEL_DMA,
DATA_SEL_ZERO, /* OUTPUT 0 */
DATA_SEL_PN7,
DATA_SEL_PN15,
DATA_SEL_PN23,
DATA_SEL_PN31,
DATA_SEL_LB, /* loopback data (ADC) */
DATA_SEL_PNXX, /* (Device specific) */
USER_DATA,
};
0表示發(fā)送DDS生成的信號;
2表示通過DMA發(fā)送DDR中的信號數(shù)據(jù),該數(shù)據(jù)在dac_core.c開頭定義;
3表示發(fā)送全0信號;
4-7表示發(fā)送隨機數(shù)信號;
8表示發(fā)送從ADC中接收到的數(shù)據(jù)信號;
9表示發(fā)送選定設(shè)備的信號;
10為用戶數(shù)據(jù)(需要在函數(shù)中添加代碼)
第三個參數(shù)為DMA設(shè)置的標(biāo)準(zhǔn)位,0表示設(shè)置;1表示不設(shè)置。
DMA傳輸支持2維傳輸(即按行列傳輸),但是目前只需要一維傳輸,因此,在源代碼里向AXI_DMAC_REG_SRC_ADDRESS和AXI_DMAC_REG_Y_LENGTH寫入0表示只使用一維傳輸。
在傳輸用戶數(shù)據(jù)時,也應(yīng)該在將用戶數(shù)據(jù)進(jìn)行調(diào)制后,參照以上代碼,使用DMA方式發(fā)送數(shù)據(jù)
5.5 adc_capture函數(shù)
adc_capture函數(shù)為數(shù)據(jù)捕獲函數(shù),也負(fù)責(zé)DMA傳輸數(shù)據(jù)到 DDR
adc_init函數(shù)的函數(shù)聲明為:
第一個參數(shù)size為要捕獲的數(shù)據(jù)量(個);
第二個參數(shù)為start_adress存儲捕獲數(shù)據(jù)的目的地址。
圖 9為dac_init函數(shù)的流程圖:
圖 12 adc_captur函數(shù)流程圖
源代碼如下:
int32_t adc_capture(uint32_t size, uint32_t start_address)
{
uint32_t reg_val;
if(adc_st.rx2tx2)
{
length =(size *8);
}
else
{
length =(size *4);
}
上圖的源碼為adc_capture函數(shù)的第一部分——數(shù)據(jù)單位轉(zhuǎn)換部分,adc_capture函數(shù)的第一個參數(shù)size為用戶想要捕獲到的數(shù)據(jù)量,單位是“個”,但是在DMAC的很多寄存器中,比如AXI_DMAC_REG_X_LENGTH寄存器,其中的數(shù)值為傳輸?shù)臄?shù)據(jù)的總字節(jié)數(shù),單位為“字節(jié)”,因此需要將size單位轉(zhuǎn)換為“字節(jié)”。如果打開了雙通道,那么捕獲的數(shù)據(jù)數(shù)據(jù)會占用雙倍的存儲空間。
adc_dma_write(AXI_DMAC_REG_CTRL, 0x0); //初始化DMA通道
adc_dma_write(AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE);//DMA通道使能
adc_dma_write(AXI_DMAC_REG_IRQ_MASK,0x0);//取消屏蔽.
//adc_dma_read(AXI_DMAC_REG_TRANSFER_ID, &transfer_id);//讀取下一個傳輸?shù)腎D號(5位)
adc_dma_read(AXI_DMAC_REG_IRQ_PENDING,®_val); /*讀取中斷狀態(tài):一個傳輸完成后 END_OF_TRANSFER 即 [1]位 置 1,
一個傳輸加入隊列后 START_OF_TRANSFER 即 [0]位 置 1 */
adc_dma_write(AXI_DMAC_REG_IRQ_PENDING, reg_val);//寫入中斷狀態(tài)寄存器,使中斷寄存器初始化
adc_dma_write(AXI_DMAC_REG_DEST_STRIDE,0x0);//設(shè)置目的地址中從一行的開始和下一行之間的字節(jié)數(shù)
adc_dma_write(AXI_DMAC_REG_X_LENGTH, length -1);//傳輸?shù)淖止?jié)數(shù)
adc_dma_write(AXI_DMAC_REG_Y_LENGTH,0x0);//傳輸?shù)男袛?shù)
adc_dma_write(AXI_DMAC_REG_DEST_ADDRESS, start_address);//設(shè)置傳輸?shù)哪康牡刂?destination address)
adc_dma_write(AXI_DMAC_REG_START_TRANSFER,0x1);//加入傳輸隊列
上圖為adc_capture函數(shù)的第二部分——DMA配置部分,其中與ADC模塊相比不同的寄存器為:
AXI_DMAC_REG_IRQ_MASK:中斷屏蔽寄存器,[1]位為EOT(End Of Transfer)IRQ,[0]位為SOT(Start Of Transfer) IRQ,哪一位置1,就表示那一位的中斷請求被屏蔽;
AXI_DMAC_REG_IRQ_PENDING:讀取中斷狀態(tài):一個傳輸完成后 END_OF_TRANSFER 即 [1] 位 置 1,一個傳輸加入隊列后 START_OF_TRANSFER 即 [0] 位 置 1 */
AXI_DMAC_REG_TRANSFER_ID:該寄存器的數(shù)值為下一次傳輸?shù)?/span>ID號。
//Wait until the new transfer is queued.
do
{
adc_dma_read(AXI_DMAC_REG_START_TRANSFER,®_val);
}
while(reg_val ==1);*/
// Wait until the current transfer is completed.
do
{
adc_dma_read(AXI_DMAC_REG_IRQ_PENDING,®_val);
}
while(1);//reg_val !=0011b*/
//Wait until the transfer with the ID transfer_id is completed.
do
{
adc_dma_read(AXI_DMAC_REG_TRANSFER_DONE,®_val);//讀取傳輸完成的ID號
}
while((reg_val &(1<<< span=""> transfer_id))!=(1<<< span=""> transfer_id));
上圖為上圖為adc_capture函數(shù)的第三部分——判斷與等待
1.等待,直到一個新的傳輸加入傳輸隊列
讀取AXI_DMAC_REG_START_TRANSFER寄存器的值,值為1時循環(huán),值為0時跳出循環(huán)。
之前已經(jīng)向AXI_DMAC_REG_START_TRANSFER寫入了1,在這時判斷AXI_DMAC_REG_START_TRANSFER的值,若是1,表示新的傳輸仍然在排隊,若是0,表示新的傳輸已經(jīng)開始。
2.等待,直到目前的傳輸完成。
讀取AXI_DMAC_REG_IRQ_PENDING的值,當(dāng)傳輸進(jìn)行時,AXI_DMAC_REG_IRQ_PENDING的[0]位SOT位始終為1,當(dāng)傳輸完成時,[1]為EOT位由0置為1,之后兩位都會被清0。因此,當(dāng)AXI_DMAC_REG_IRQ_PENDING的值為3時,表示傳輸完成。
3.等待,直到ID為transfer_id的傳輸完成
這一步是為了驗證之前設(shè)置的傳輸已經(jīng)完成。





