AD9371 官方例程 NO-OS 主函数 headless 梳理(一)

news2025/1/16 4:47:00

AD9371 系列快速入口

AD9371+ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发

ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射

AD9371 官方例程 时钟间的关系与生成 : AD9371 官方例程HDL详解之JESD204B TX侧时钟生成(一)

JESD204B相关IP端口信号 : AD9371 官方例程HDL JESD204B相关IP端口信号

裸机程序配置 AD9528、AD9371、FPGA IP: AD9371 官方例程裸机SW 和 HDL配置概述(一)

裸机程序配置 AD9528、AD9371、FPGA IP: AD9371 官方例程裸机SW 和 HDL配置概述(二)

裸机程序配置 AD9528、AD9371、FPGA IP: AD9371 官方例程裸机SW 和 HDL配置概述(三)

文章目录

  • 前言
  • 一、xilinx platform
  • 二、AD9528
  • 三、CLKGEN IP
  • 四、JESD 链路层初始化
  • 五、ADXCVR 物理层初始化
  • 六、AD9371 初始化步骤
    • 6.1 复位
    • 6.2 MYKONOS 初始化
    • 6.3 检查CLKPLL的锁定状态
    • 6.4 执行MCS
    • 6.5 初始化ARM处理器、加载ARM二进制文件、读取AD9371 ARM版本
    • 6.6 设置RF PLL频率、检查RF PLL锁定状态
    • 6.7 设置AD9371 GPIO
    • 6.8 设置 RX、Obs 和 SNIFFER 手动增益 和 TX 衰减
    • 6.9 运行初始化校准,等待初始化校准完成
    • 6.10 (可选,例程未使用)使用PA进行初始化外部LOL校准
  • 未完,见下一节


前言

官方例程主函数需要配置和初始化 AD9528、AD9371、FPGA IP,打开DDS 或者通过DMA 搬运发送和接收数据

一、xilinx platform

打开 指令和数据 Cache ,初始化 platform(包含 SPI 和 GPIO)

	Xil_ICacheEnable();
	/* Enable the instruction cache. */
	Xil_DCacheEnable();
	
	ret = platform_init();
	if (ret != 0) {
		printf("error: platform_init() failed\n");
		goto error_0;
	}

二、AD9528

通过AD9528复位引脚,复位 AD9528
通过 VCXO REFA outFrequency_Hz[1] ,得到 PLL1 PLL2 output 0-13 和 sysref 各个配置参数,存入 clockAD9528_device
通过 SPI 初始化 AD9528 的 PLL1 PLL2 output 和 sysref

	error = AD9528_resetDevice(clockAD9528_device);
	if (error != ADIERR_OK) {
		printf("AD9528_resetDevice() failed\n");
		error = ADIERR_FAILED;
		goto error_1;
	}

	error = AD9528_initDeviceDataStruct(clockAD9528_device,
					    clockAD9528_device->pll1Settings->vcxo_Frequency_Hz,
					    clockAD9528_device->pll1Settings->refA_Frequency_Hz,
					    clockAD9528_device->outputSettings->outFrequency_Hz[1]);
	if (error != ADIERR_OK) {
		printf("AD9528_initDeviceDataStruct() failed\n");
		error = ADIERR_FAILED;
		goto error_1;
	}

	/* Initialize the AD9528 by writing all SPI registers */
	error = AD9528_initialize(clockAD9528_device);
	if (error != ADIERR_OK)
		printf("WARNING: AD9528_initialize() issues. Possible cause: REF_CLK not connected.\n");

三、CLKGEN IP

通过axi_clkgen_init 赋值给 rx_clkgen 等
通过参考时钟和需要生成目标时钟,得到配置参数,配置到 IP的MMCM中,利用 MMCM 得到所需时钟,详见第二部分

	status = axi_clkgen_init(&rx_clkgen, &rx_clkgen_init);
	status = axi_clkgen_init(&tx_clkgen, &tx_clkgen_init);
	status = axi_clkgen_init(&rx_os_clkgen, &rx_os_clkgen_init);

	status = axi_clkgen_set_rate(rx_clkgen, rx_div40_rate_hz);

	status = axi_clkgen_set_rate(tx_clkgen, tx_div40_rate_hz);

	status = axi_clkgen_set_rate(rx_os_clkgen, rx_os_div40_rate_hz);

利用axi_clkgen_calc_params(clkgen, clkgen->parent_rate, rate, &d, &m, &dout); 计算MMCM中的 M、 D、 O

将 dout ,也就是 O0 写入 MMCM_REG_CLKOUT0_1 和 MMCM_REG_CLKOUT0_2 (0x08 和 0x09,OUT0的DRP地址)
axi_clkgen_calc_clk_params(dout, &low, &high, &edge, &nocount);
axi_clkgen_mmcm_write(clkgen, MMCM_REG_CLKOUT0_1, (high << 6) | low, 0xefff);
axi_clkgen_mmcm_write(clkgen, MMCM_REG_CLKOUT0_2, (edge << 7) | (nocount << 6),0x03ff)

得到的 D 和 M 类似 O0,写入相应的寄存器中

在这里插入图片描述

在这里插入图片描述
参考 XAPP888

四、JESD 链路层初始化

初始化 tx_jesd 、rx_jesd 等,并把 octets_per_multiframe 和 octets_per_frame 配置给IP核,octets_per_multiframe 除以 4,得到 up_cfg_beats_per_multiframe ,在链路层的LMFC中使用

	status = axi_jesd204_rx_init(&rx_jesd, &rx_jesd_init);

	status = axi_jesd204_tx_init(&tx_jesd, &tx_jesd_init);

	status = axi_jesd204_rx_init(&rx_os_jesd, &rx_os_jesd_init);

五、ADXCVR 物理层初始化

初始化 tx_adxcvr、rx_adxcvr 等,配置物理层 sys_clk_sel、 out_clk_sel 、LPM_DFE_N 等参数,通过 adxcvr_clk_set_rate(xcvr, xcvr->lane_rate_khz, xcvr->ref_rate_khz) 计算并配置(通过DRP) QPLL 、CPLL、 t/rx_out_div 和 clk25M ,得到正确的 lane rate

	status = adxcvr_init(&rx_adxcvr, &rx_adxcvr_init);

	status = adxcvr_init(&tx_adxcvr, &tx_adxcvr_init);

	status = adxcvr_init(&rx_os_adxcvr, &rx_os_adxcvr_init);

六、AD9371 初始化步骤

6.1 复位

通过 GPIO 复位 AD9371,为初始化做准备

	 MYKONOS_resetDevice(&mykDevice)) 

6.2 MYKONOS 初始化

根据有效的 Rx/Tx/ORx/sniffer profiles,配置AD9371的 deserializer 、 Tx1/Tx2 deframer, serializer, Rx1/Rx2 framer, 和 ORx framer,设置 clock PLL 和 digital clocks(MYKONOS_initDigitalClocks),

	 MYKONOS_initialize(&mykDevice)) 

6.3 检查CLKPLL的锁定状态

调用MYKONOS_checkPllLockStatus并使用用户定义的代码执行CLKPLL的锁定检查

     MYKONOS_checkPllsLockStatus(&mykDevice,&pllLockStatus)

6.4 执行MCS

当使用多个收发器或甚至只有一个收发器时,需要 Tx 和 Rx(obs)JESD204B数据路径之间确定性延迟,所有JESD204B通道同步在一起以满足确定性延迟要求,此功能应在所有收发器初始化后运行。

通过SPI 控制AD9528 发送 SYSREF 脉冲,发送SYSREF脉冲后,再次调用MYKONOS_enableMultichipSync 函数,将enableMcs参数设置为0,读取MCS状态

1 使用Mykonos_Initialize 初始化系统中的所有Mykonos
2 使用enableMcs=1 ,运行 MYKONOS_enableMultichipSync
3 发送至少3个SYSREF脉冲
4 使用enableMcs=0,运行 MYKONOS_enableMultichipSync
5 加载ARM

     MYKONOS_enableMultichipSync(&mykDevice, 1,&mcsStatus)
     AD9528_requestSysref(clockAD9528_device, 1);
     AD9528_requestSysref(clockAD9528_device, 1);
     AD9528_requestSysref(clockAD9528_device, 1);
     MYKONOS_enableMultichipSync(&mykDevice, 0,&mcsStatus)

6.5 初始化ARM处理器、加载ARM二进制文件、读取AD9371 ARM版本

     MYKONOS_initArm(&mykDevice)
     MYKONOS_loadArmFromBinary(&mykDevice,&firmware_Mykonos_M3_bin[0], firmware_Mykonos_M3_bin_len)
     MYKONOS_getArmVersion(&mykDevice, &arm_major, &arm_minor, &arm_release, NULL)

6.6 设置RF PLL频率、检查RF PLL锁定状态

对使用的每个通道设置RF频率

     MYKONOS_setRfPllFrequency(&mykDevice, RX_PLL,
			mykDevice.rx->rxPllLoFrequency_Hz)) 

     MYKONOS_setRfPllFrequency(&mykDevice, TX_PLL,
			mykDevice.tx->txPllLoFrequency_Hz))

     MYKONOS_setRfPllFrequency(&mykDevice, SNIFFER_PLL,
			mykDevice.obsRx->snifferPllLoFrequency_Hz))

     MYKONOS_checkPllsLockStatus(&mykDevice,
			&pllLockStatus)

6.7 设置AD9371 GPIO

根据所需的配置设置GPIO

	 mykGpioErr = MYKONOS_setRx1GainCtrlPin(&mykDevice, 0, 0, 0, 0, 0)
	 mykGpioErr = MYKONOS_setRx2GainCtrlPin(&mykDevice, 0, 0, 0, 0, 0)
	 mykGpioErr = MYKONOS_setTx1AttenCtrlPin(&mykDevice, 0, 0, 0, 0, 0)
	 mykGpioErr = MYKONOS_setTx2AttenCtrlPin(&mykDevice, 0, 0, 0, 0)

	 mykGpioErr = MYKONOS_setupGpio(&mykDevice))

6.8 设置 RX、Obs 和 SNIFFER 手动增益 和 TX 衰减

     MYKONOS_setRx1ManualGain(&mykDevice, 255)
     MYKONOS_setObsRxManualGain(&mykDevice, OBS_RX1_TXLO, 255)
     MYKONOS_setObsRxManualGain(&mykDevice, OBS_SNIFFER_A, 255)
     
     MYKONOS_setTx1Attenuation(&mykDevice, 10000);
	 MYKONOS_setTx2Attenuation(&mykDevice, 10000);

6.9 运行初始化校准,等待初始化校准完成

	uint32_t initCalMask = TX_BB_FILTER | ADC_TUNER | TIA_3DB_CORNER | DC_OFFSET |
			       TX_ATTENUATION_DELAY | RX_GAIN_DELAY | FLASH_CAL |
			       PATH_DELAY | TX_LO_LEAKAGE_INTERNAL | TX_QEC_INIT |
			       LOOPBACK_RX_LO_DELAY | LOOPBACK_RX_RX_QEC_INIT |
			       RX_LO_DELAY | RX_QEC_INIT ;
			       
 *  calMask Bit | Calibration
 *  ------------|----------------------
 *       0      | Tx BB Filter
 *       1      | ADC Tuner
 *       2      | TIA 3dB Corner
 *       3      | DC Offset
 *       4      | Tx Attenuation Delay
 *       5      | Rx Gain Delay
 *       6      | Flash Cal
 *       7      | Path Delay
 *       8      | Tx LO Leakage Internal
 *       9      | Tx LO Leakage External
 *       10     | Tx QEC Init
 *       11     | LoopBack Rx LO Delay
 *       12     | LoopBack Rx Rx QEC Init
 *       13     | Rx LO Delay
 *       14     | Rx QEC Init
 *       15     | DPD Init
 *       16     | Tx CLGC (Closed Loop Gain Control)
 *       17     | Tx VSWR Init
 
	 MYKONOS_runInitCals(&mykDevice,
					    (initCalMask & ~TX_LO_LEAKAGE_EXTERNAL)

	 MYKONOS_waitInitCals(&mykDevice, 60000, &errorFlag,
					     &errorCode))

6.10 (可选,例程未使用)使用PA进行初始化外部LOL校准

确保此时PA已启用

	MYKONOS_runInitCals(&mykDevice,TX_LO_LEAKAGE_EXTERNAL)
	MYKONOS_waitInitCals(&mykDevice, 60000, &errorFlag, &errorCode)

未完,见下一节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

错误:ERROR Cannot read properties of null (reading ‘type‘)

ERROR Cannot read properties of null (reading ‘type’) TypeError: Cannot read properties of null (reading ‘type’) <template><el-card><el-row :gutter="20" class="header"><el-col :span="7"><el-input…

大数据毕业设计选题推荐-无线网络大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Unity之UI、模型跟随鼠标移动(自适应屏幕分辨率、锚点、pivot中心点)

一、效果 UI跟随鼠标移动, 动态修改屏幕分辨率、锚点、pivot等参数也不会受到影响。同时脚本中包含3d物体跟随ui位置、鼠标位置移动 二、屏幕坐标、Canvas自适应、锚点、中心点 在说原理之前我们需要先了解屏幕坐标、Canvas自适应、锚点、中心的特性和之间的关系。 1.屏幕坐标…

C# 基类中的虚函数调用基类的虚函数执行的是派生类实现的对应函数吗

答案 &#xff1a; 是的。 比如基类Base中有两个virtual 函数A和B&#xff0c;然后派生类为Derive&#xff0c;override了函数A记为A&#xff0c;override了函数B记为B&#xff0c;且B之中会执行base.B的逻辑&#xff1b; 在Base中&#xff0c;B调用了A的逻辑&#xff0c;那么外…

Qsort函数实现对各类型数组中元素的排序

目录 ​​​​​​​函数介绍 函数使用案例&#xff1a; &#xff08;一&#xff09;对int型数组的排序 &#xff08;二&#xff09;对char型数组的排序 &#xff08;三&#xff09;对浮点型数组的排序 &#xff08;四&#xff09;对结构体类型的排序 &#xff08;五&a…

[Linux打怪升级之路]-信号的产生

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、信号基础…

node教程(五)接口+会话

文章目录 一.接口1.1接口是什么?1.2接口的作用1.3接口的开发与调用1.4接口的组成 一.接口 1.1接口是什么? 接口是前后端通信的桥梁 1.2接口的作用 实现前后端通信 1.3接口的开发与调用 大多数接口都是由后端工程师开发的&#xff0c;开发语言不限 一般情况下接口都是由…

ts和js的区别?

文章目录 前言是什么&#xff1f;二、特性三、区别后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Typescript &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现…

树状数组(分析+代码)

在2023年4月29日的力扣103夜喵双周赛上&#xff0c;我被第四题所困扰&#xff0c;又于2023年5月4日早上的Linux系统基础课上&#xff0c;我初次接触到了树状数组。从那时候我就想写一篇博客记录一下&#xff0c;鸽到了现在… 参考视频 树状数组的作用 维护一个序列修改某一个…

yum

什么是yum? Linux中我们也要进行工具/指令/程序&#xff0c;安装&#xff0c;检查卸载等&#xff0c;需要yum的软件 安装软件的方式&#xff1a; 1.源代码安装--交叉编译工作 2.rpm包直接安装 3.yum / apt-get yum:yum是我们linux预装的一个指令&#xff0c;搜索&#x…

【C++深入浅出】STL之string用法详解

目录 一. 前言 二. STL概要 2.1 什么是STL 2.2 STL的六大组件 2.3 STL的缺陷 三. string类概述 3.1 什么是string类 3.2 为什么要使用string类 四. string类的使用 4.1 包含头文件 4.2 构造函数 4.3 赋值运算符重载 4.4 容量操作 4.5 访问/遍历操作 4.6 查找修改…

Redis之Java操作Redis的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Redis实战开发》。&#x1f3af;&#x1f3af; …

07 点积

点积 基本运算几何解释投影运算和基本运算的联系多维空间到一维空间的投影 点积的作用 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 基本运算 两个维数相同的向量 [ 2 , 7 , 1 ] T , [ 8 , 2 , 8 ] T [2, 7, 1]^{T},[8, 2, 8]^{T} [2,7,1]T,[8,2,8]T,求它们…

Spring Boot 整合RabbitMQ

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

【m98】abseil-cpp的cmake构建

m79的代码有些头文件没有,比如#include "absl/numeric/bits.h"使用m98版本里的代码,支持cmake构建cmake版本 WIN32 DEBUG configure Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22621. The CXX compiler identification is MSVC 19.37.32…

第七章 Python常用函内置函数

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…

解决Visual Studio 2010 运行时屏幕一闪而过,无结果显示的问题

安装配置&#xff1a;Visual Studio 2010 软件安装教程&#xff08;附下载链接&#xff09;——计算机二级专用编程软件https://blog.csdn.net/W_Fe5/article/details/134218817?spm1001.2014.3001.5502 1、 我们在运行时会出现窗口一闪而过&#xff0c;这时候我们右键Test_1…

C++初阶-类和对象(中)2

类和对象&#xff08;中&#xff09;2 一、赋值运算符重载运算符重载赋值运算符重载前置和后置重载 二、日期类的实现三、const成员四、取地址及const取地址操作符重载 一、赋值运算符重载 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊…

​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】 课本里章节里所有蓝色字体的思维导图

c语言练习100(贪吃蛇的实现)

贪吃蛇的实现 先实现主界面&#xff0c;后续将会不断完善。&#xff08;逐渐添加更多的功能&#xff09; test.c #define _CRT_SECURE_NO_WARNINGS #include"snake.h" void Test() {Snake snake { 0 };//创建贪吃蛇//1.游戏开始 - 初始化游戏GameStart(&sn…