axi_quad_spi

news2024/11/16 17:57:57

文章目录

    • 系统框图
      • 正常模式
      • XIP模式
    • 性能
    • IP 核配置
      • AXI Interface Option
        • XIP Mode
        • Performance Mode
      • SPI Options
        • Mode
        • Transaction Width
        • Frequency Ratio
        • Slave Device
        • Enable Master Mode
        • Enable STARTUP Primitive
    • 寄存器映射
      • 0x40 (SRR) 软件复位
      • 0x60 (SPICR) SPI控制
      • 0x64 (SPISR) SPI状态
      • 0x68 (SPI DTR) 发送数据
      • 0x6c (SPI DRR) 接收数据
      • 0x70 (SPISSR) 从机选择
      • 0x74 发送FIFO待发送数据量
      • 0x78 接收FIFO可读取数据量
      • 0x1C (DGIER) 全局中断使能
      • 0x20 (IPISR) 中断状态
      • 0x28 (IPIER) 中断使能
      • XIP 模式
    • 支持指令
      • 通用指令
      • 其他指令
    • 操作流程
      • 写操作
      • 读操作
    • Flash控制
      • 读ID
      • 写使能
      • 扇区擦除
      • 整片擦除
      • 页写
      • 字节读
    • 示例工程

系统框图

正常模式

在这里插入图片描述

XIP模式

在这里插入图片描述

性能

在这里插入图片描述

IP 核配置

在这里插入图片描述

AXI Interface Option

XIP Mode

XIP全称:eXecute In Place(片内执行),只用于读操作。针对外设如果想进行读操作的时候,一般都是通过访问数据寄存器,而XIP则是直接以内存的形式访问。


为什么有XIP模式

从软件的角度来看,SPI一般是连着flash来使用,flash作为一种存储模块,软件更加期望用memory的形式访问,在SoC上经常会有从flash里面搬运数据的需求。


XIP性能

一般来说,non-xip模式下,由于可以通过寄存器配置来实现给出一个地址得到一大段的数据的操作,只要配置得当,数据读取的速率是会比xip模式下快的。

但是不同公司的SPI controller的寄存器配置肯定是不同的,完全使用寄存器配置的形式进行读取操作对于软件迁移的成本会比较大。

在这里插入图片描述

Performance Mode

高性能模式将使用 AXI4 代替 AXI4-Lite 接⼝,并且在内核的发送和接收 FIFO 地址处可以使用突发功能。

SPI Options

Mode

模式有standard,dual,quad可选,standard和dual/quad模式间有部分功能不能兼容,具体可以看下面寄存器映射中。

Transaction Width

设置传输事务的数据宽度:

  • 如果设置为8,即每次数据传输宽度为8-bit,一次数据传输需要8个SCK时钟

  • 如果设置为16,即每次数据传输宽度为16-bit,一次数据传输需要16个SCK时钟

Frequency Ratio

频率比是由两个数的乘积。输出的SPI时钟(sck)满足:

在这里插入图片描述

Slave Device

设备类型是混合的,支持winbond,micron,spansion,macronix共有的命令。如果勾选Micron,只能支持micron的命令,发送不支持的命令,IPISR状态寄存器就会报command error.

Enable Master Mode

这个选项决定SPI设备的主从模式,也可以在配置寄存器60h中修改

Enable STARTUP Primitive

STARTUP原语勾选上后指SPI的clk就会从FPGA专用的CCLK引脚输出时钟

寄存器映射

在这里插入图片描述

0x40 (SRR) 软件复位

将0x0000_000a的值写⼊软件复位寄存器,会将内核寄存器复位四个 AXI 时钟周期。任何其他写访问都会⽣成未定义的结果并导致错误。

在这里插入图片描述

0x60 (SPICR) SPI控制

SPI控制寄存器有着配置SPI时序工作方式(CPHA,CPOL),设置SPI设备主从状态,对数据寄存器进行复位等重要功能。需要注意:

  • LSB 优先仅在标准 SPI 模式下支持。 Dual/quad SPI 模式仅⽀持 MSB 优先模式
  • Dual/quad SPI 模式仅⽀持 CPHA-CPOL 值为 00 或 11。
  • 环回模式仅在标准 SPI 模式下支持。

通常作为配置端,我们需要把SPI设置为主设备(SPICR【2】=1),在测试工作状态时,可以设置环回模式(SPICR【0】=1)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

0x64 (SPISR) SPI状态

SPI状态寄存器是只读寄存器,通常用来:

  • 读取各种错误信息,即SPI控制寄存器中的配置错误(注意事项)。
  • 从模式配置成功检查
  • 数据FIFO的空满状态检查

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

0x68 (SPI DTR) 发送数据

SPI 数据发送寄存器 (SPI DTR) 写⼊要在 SPI 总线上发送的数据。数据从 SPI DTR 传输到移位寄存器发送条件:

  • 在主模式下将 SPE (SPI控制寄存器)设置为 1
  • 在从模式下, spisel 处于活动状态

需要注意:

  • SPI DTR 在填充前应处于复位状态,以便 DTR FIFO 写指针指向第 0 个位置。
  • 如果尝试在已满的寄存器或 FIFO 上进写⼊,则 AXI 写⼊事务以错误条件完成。

即在发送数据前,需要先在控制寄存器中对TX FIFO进行复位。

在Dual/quad SPI 模式

  • 第⼀次写⼊必须始终是来⾃ AXI 事务的 SPI 命令,然后是地址(24 位或 32 位),然后填充要传输的数据。
  • 在读取内存的状态寄存器时,根据命令要求,该寄存器应填充虚拟字节以及命令和地址(可选)。

在这里插入图片描述

0x6c (SPI DRR) 接收数据

SPI 数据接收寄存器 (SPI DRR) ⽤于读取从 SPI 总线接收的数据。这是⼀个双缓冲寄存器。每次完成传输后,接收到的数据都存放在该寄存器中。

SPI 架构没有为从设备提供任何⼿段来限制总线上的流量。因此,对于从设备来说,只有在上次 SPI 传输之前读取 SPI DRR ,SPI DRR 才会在每个完成的事务之后更新。

需要注意:

  • 如果 SPI DRR 未读取且已满,则最近传输的数据将丢失并发⽣接收溢出中断。
  • 如果试图读取⼀个空的接收寄存器或 FIFO,它会在状态寄存器中给出⼀个错误。
  • SPI DRR 的上电复位值未知。

在这里插入图片描述

0x70 (SPISSR) 从机选择

选择slave个数,有几个slave就拉低几位,最多32个slave

在这里插入图片描述

0x74 发送FIFO待发送数据量

仅当 AXI Quad SPI 内核配置有 FIFO (FIFO 深度= 16 或 256)时,SPI 发送 FIFO 占⽤寄存器 (TX_FIFO_OCY) 才存在,并且是只读寄存器。

主要用来查看发送FIFO中有多少个数据,比如读出是5,那么FIFO中还有6个数据待发送

在这里插入图片描述

0x78 接收FIFO可读取数据量

仅当 AXI Quad SPI 内核配置有 FIFO (FIFO 深度= 16 或 256)时,SPI 接收 FIFO 占⽤寄存器 (RX_FIFO_OCY) 才存在。

主要用来查看接收FIFO中有多少个数据,比如读出是5,那么FIFO中还有6个数据还没接收走。

在这里插入图片描述

0x1C (DGIER) 全局中断使能

使能了全局中断之后才能使用各种中断功能。

在这里插入图片描述

0x20 (IPISR) 中断状态

由于中断端口只有一个,当中断发送时需要查询中断状态寄存器来判断是什么中断情况,具体使用什么中断功能由中断使能寄存器控制。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

0x28 (IPIER) 中断使能

主要是配置中断功能,由于中断功能是复用中断端口,因此需要选择合理的功能来减少控制复杂度

在这里插入图片描述

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

XIP 模式

在XIP模式,配置寄存器60h和64h变更,并且中断无法使用。

XIP模式适⽤于开机操作。在这种模式下,内核仅⽀持 INCR 和 WRAP 读取事务。

内核将 SPI 视为只读存储器。三个读取命令随读取 SPI 闪存时使⽤的配置模式提供。通过为 AXI4-Lite 和 AXI4 接⼝分配相同的频率来验证核⼼功能。内核内置的三个主要读取命令是快速读取 (0x0Bh)、DIOFR (0xBBh) 和 QIOFR (0xEBh)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

支持指令

通用指令

在这里插入图片描述

其他指令

详见 PG153 AXI Quad SPI Table 3-3

操作流程

写操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

读操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Flash控制

读ID

读ID指令为9F,读几个数据就写几个dummy数据,读fifo的第一个数据是FF,因为写指令占用了,第二个数据开始才是想要的数据。

proc RDID {byte_num} {
    # 软件复位
    WriteReg 0x40 0xa
    # 中断使能
    WriteReg 0x28 0x3fff
    # 全局中断使能
    WriteReg 0x1c 0x80000000
    # 复位 tx rx fifo
    WriteReg 0x60 0x1e6
    # 释放 fifo 复位
    WriteReg 0x60 0x186
    # CMD = 9F, 读 FLASH ID
    WriteReg 0x68 0x9f
    # 要读多少个数据就写几个 dummy 数据
    set num 0
    while {$num < $byte_num} {
        WriteReg 0x68 0x00
        incr num 1
    }
    # 选择 0 通道CS
    WriteReg 0x70 0x00
    # 使能 master, 开始发数据
    WriteReg 0x60 0x86
    # 选择 0 通道CS 拉高
    WriteReg 0x70 0x1
    # 禁用 master
    WriteReg 0x60 0x186

    set num 0
    set id_data "RDID is "
    while {$num < $byte_num + 1} {
        if {$num >= 1} {
            append id_data [string range [ReadReg 0x6c] end-1 end]
        } else {
            ReadReg 0x6c
        }
        incr num 1
    }
    return $id_data
}

写使能

每次进行擦除或者写操作之前都要先开启写使能,否则不生效。

proc WREN {} {
    # 复位 tx rx fifo
    WriteReg 0x60 0x1e6
    # 释放 fifo 复位
    WriteReg 0x60 0x186
    # CMD = 06, 写使能
    WriteReg 0x68 0x06
    # 选择 0 通道CS
    WriteReg 0x70 0x00
    # 使能 master, 开始发数据
    WriteReg 0x60 0x86
    # 选择 0 通道CS 拉高
    WriteReg 0x70 0x1
    # 禁用 master
    WriteReg 0x60 0x186
    return "Write Enable!"
}

扇区擦除

先发送写使能指令,再发送扇区擦除指令


对于 N25Q128 FLASH

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

proc SE {Sector_Num} {
    WREN
    # 复位 tx rx fifo
    WriteReg 0x60 0x1e6
    # 释放 fifo 复位
    WriteReg 0x60 0x186
    # CMD = d8, 扇区擦除
    WriteReg 0x68 0xd8
    # Write Address
    WriteReg 0x68 $Sector_Num
    WriteReg 0x68 0x00
    WriteReg 0x68 0x00
    # 选择 0 通道CS
    WriteReg 0x70 0x00
    # 使能 master, 开始发数据
    WriteReg 0x60 0x86
    # 选择 0 通道CS 拉高
    WriteReg 0x70 0x1
    # 禁用 master
    WriteReg 0x60 0x186
    return "Sector Erase Done!"
}

整片擦除

先发送写使能指令,再发送整片擦除指令

proc BE {} {
    WREN
    # 复位 tx rx fifo
    WriteReg 0x60 0x1e6
    # 释放 fifo 复位
    WriteReg 0x60 0x186
    # CMD = c7, 整片擦除
    WriteReg 0x68 0xc7
    # 选择 0 通道CS
    WriteReg 0x70 0x00
    # 使能 master, 开始发数据
    WriteReg 0x60 0x86
    # 选择 0 通道CS 拉高
    WriteReg 0x70 0x1
    # 禁用 master
    WriteReg 0x60 0x186
    return "Bulk Erase Done!"
}

页写

先写前 128 Byte, 因为FIFO深度256, 但是cmd+地址占用4Byte, 所以实际使用不足256Byte可用

proc PP {address} {
    WREN
# 先写前 128 Byte, 因为FIFO深度256, 但是cmd+地址占用4Byte, 所以实际使用不足256Byte可用
    # 复位 tx rx fifo
    WriteReg 0x60 0x1e6
    # 释放 fifo 复位
    WriteReg 0x60 0x186
    # CMD = 02, 页写
    WriteReg 0x68 0x02
    # Write Address
    WriteReg 0x68 [expr ($address >> 16)]
    WriteReg 0x68 [expr ($address % (2**16)) >> 8]
    WriteReg 0x68 [expr ($address % (2**8))]
    # Write Data
    set num 0
    while {$num < 128} {
        WriteReg 0x68 $num
        incr num 1
    }
    # 选择 0 通道CS
    WriteReg 0x70 0x00
    # 使能 master, 开始发数据
    WriteReg 0x60 0x86
    # 选择 0 通道CS 拉高
    WriteReg 0x70 0x1
    # 禁用 master
    WriteReg 0x60 0x186
# 再写后 128 Byte
    # 每次写操作之前需要重新开启写使能
    WREN
    set address [expr {$address + 128}]
    puts [ format 0x%08x $address]
    # 复位 tx rx fifo
    WriteReg 0x60 0x1e6
    # 释放 fifo 复位
    WriteReg 0x60 0x186
    # CMD = 02, 页写
    WriteReg 0x68 0x02
    # Write Address
    WriteReg 0x68 [expr ($address >> 16)]
    WriteReg 0x68 [expr ($address % (2**16)) >> 8]
    WriteReg 0x68 [expr ($address % (2**8))]
    # Write Data
    while {$num < 256} {
        WriteReg 0x68 $num
        incr num 1
    }
    # 选择 0 通道CS
    WriteReg 0x70 0x00
    # 使能 master, 开始发数据
    WriteReg 0x60 0x86
    # 选择 0 通道CS 拉高
    WriteReg 0x70 0x1
    # 禁用 master
    WriteReg 0x60 0x186
    return "Page Program Done!"
}

字节读

proc READ {address number} {
    # 复位 tx rx fifo
    WriteReg 0x60 0x1e6
    # 释放 fifo 复位
    WriteReg 0x60 0x186
    # CMD = 03, 按字节读数据
    WriteReg 0x68 0x03
    # Read Address
    WriteReg 0x68 [expr ($address >> 16)]
    WriteReg 0x68 [expr ($address % (2**16)) >> 8]
    WriteReg 0x68 [expr ($address % (2**8))]
    # 要读多少个数据就写几个 dummy 数据
    set num 0
    while {$num < $number} {
        WriteReg 0x68 0x00
        incr num 1
    }
    # 选择 0 通道CS
    WriteReg 0x70 0x00
    # 使能 master, 开始发数据
    WriteReg 0x60 0x86
    # 选择 0 通道CS 拉高
    WriteReg 0x70 0x1
    # 禁用 master
    WriteReg 0x60 0x186

    ######################## 写文件 ########################
    set fn "./rd_data.txt"
    set fid [open $fn w+]
    set num 0
    puts $fid "Number   Address   Data"
    while {$num < $number + 4} {
        if {$num >= 4} {
            puts $fid [format "%-8d %#0-8x   0x%s" [expr {$num-3}] [expr {$address + $num - 3}] [string range [ReadReg 0x6c] end-1 end]]
        } else {
            ReadReg 0x6c
        }
        incr num 1
    }
    close $fid
    ######################## 读文件到变量 line ########################
    # 命令eof, 一旦读取到文件末尾, 该命令就返回 1
    set fid [open $fn r+]
    while {[eof $fid] != 1} {
        gets $fid line
        puts $line
    }
    close $fid
    puts "Read Done!"
    # set num 0
    # set read_data "ReadData is "
    # while {$num < $number + 4} {
    #     if {$num >= 4} {
    #         append read_data [string range [ReadReg 0x6c] end-1 end]
    #     } else {
    #         ReadReg 0x6c
    #     }
    #     incr num 1
    # }
    # return $read_data
}

示例工程

Block design连接图如下所示:
在这里插入图片描述
详细工程见如下链接:

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

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

相关文章

WAF攻防相关知识点总结2-代码免杀绕过

WAF的检测除了有对于非正常的流量检测外还对于非正常的数据包特征进行检测 以宝塔为例 在宝塔的后台可以放置一句话木马的文件 宝塔不会对于这个文件进行拦截&#xff0c;但是一旦我们使用菜刀蚁剑等webshell工具去进行连接的时候&#xff0c;数据报中有流量特征就会被拦截 …

【仿网易云H5部署】Nodejs后台 + uniapp前台 部署

前言 之前在b站跟着学习写了前锋的<仿网易云音乐>uniapp项目 , 在这里记录一下H5版本的部署上线的过程. 这是该项目的b站链接:【千锋教育】前端项目_uni-app入门到实战项目之《仿网易云音乐》_哔哩哔哩_bilibili 一.后端 使用宝塔面板来部署 (1) 百度搜索宝塔面板, 复…

Java中的this和super

①this 在Java中&#xff0c;this关键字代表当前对象的引用。它可以用于以下几个方面&#xff1a; 引用当前对象的成员变量&#xff1a;使用this关键字可以引用当前对象的成员变量&#xff0c;以区分成员变量和方法参数或局部变量之间的命名冲突。例如&#xff0c;如果一个方法…

微信小程序wx.getRealtimeLogManager无法查看log内容

解决方案&#xff1a; 首先&#xff0c;检查在we分析是否启用实时日志&#xff0c;入口如下&#xff1a; 其次&#xff0c;检查基本语法是否正确&#xff0c;参考如下&#xff1a; var logger wx.getRealtimeLogManager() logger.error("error message") 最后&a…

基于若依的ruoyi-nbcio流程管理系统一种简单的动态表单模拟测试实现(四)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

《Linux高性能服务器编程》笔记04

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第09章I/O复用9.1 select系统调用9.2 po…

C++ | 六、栈 Stack、队列 Queue

栈的基础知识 栈&#xff08;stack&#xff09;是一种数据结构&#xff0c;在C中属于STL&#xff08;标准库&#xff09;特点&#xff1a;先进后出 栈的使用&#xff1a; 一、引入头文件<stack>二、创建栈变量&#xff08;类似容器、集合的创建方式&#xff09;&#xf…

【心得】java从CC1链入门CC链个人笔记

来劲了&#xff0c;感觉离真正的CTF又近了一步。 本文仅从一个萌新的角度去谈&#xff0c;如有纰漏&#xff0c;纯属蒟蒻。 目录 CC链概念 CC链学习前置知识 CC1链 Version1 Version2 Version3 CC链概念 CC链 Commons Collections apache组织发布的开源库 里面主要对…

JS之打地鼠案例

需要素材的同学可以私信我 效果图&#xff1a; 上代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 320px;heigh…

论文阅读:Vary-toy论文阅读笔记

目录 引言整体结构图方法介绍训练vision vocabulary阶段PDF数据目标检测数据 训练Vary-toy阶段Vary-toy结构数据集情况 引言 论文&#xff1a;Small Language Model Meets with Reinforced Vision Vocabulary Paper | Github | Demo 说来也巧&#xff0c;之前在写论文阅读&…

更新至2023年各省环境规制数据合集(七种测算方法)

更新至2023年各省环境规制数据合集&#xff08;七种测算方法&#xff09; 一、2002-2023年全国各省ZF报告词频环境规制关键词词频统计数据 1、时间&#xff1a;2001-2022年 2、指标&#xff1a;文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频-精确模式、环…

计算机中找不到vcomp140.dll无法继续执行代码有哪些解决方法

vcomp140.dll是微软Visual C编译器的一个组件&#xff0c;主要用于支持并行计算和OpenMP库的实现。以下是这个DLL文件的属性介绍&#xff1a; 文件名&#xff1a;vcomp140.dll 这个文件名中的“140”指的是与Visual C的版本相对应的内部版本号&#xff0c;这里对应的是2015版…

聚焦AI4S,产学研专家齐聚,探讨AI工具在多领域应用的现状与趋势

2023 和鲸社区年度科研闭门会以“对话 AI for Science 先行者&#xff0c;如何抓住科研范式新机遇”为主题&#xff0c;邀请了多个领域的专家学者共同探讨人工智能在各自领域的发展现状与未来趋势。 闭门会圆桌论坛由和鲸科技联合创始人、执行总裁兼首席产品官殷自强主持&…

Linux之快速入门(CentOS 7)

文章目录 一、Linux目录结构二、常用命令2.1 切换用户2.2查看ip地址2.3 cd2.4 目录查看2.5 查看文件内容2.6 创建目录及文件2.7 复制和移动2.8 其他2.9 tar3.0 which3.1 whereis3.2 find&#xff08;这个命令尽量在少量用户使用此软件时运行&#xff0c;因为此命令是真的读磁盘…

ifconfig 主机ip url记录

ifconfig 容器Pods相关主机与url信息 一文搞懂网络知识&#xff0c;IP、子网掩码、网关、DNS、端口号_关于ip,网关。端口-CSDN博客 计算机网络知识之URL、IP、子网掩码、端口号_ip地址和url-CSDN博客 阅读看下以上文章 由此可知 1.主机ip 10.129.22.124 10.129.22 是网段…

线程池高手进阶:揭秘ThreadPoolExecutor的小妙招!

RejectedExecutionHandler总结 ThreadPoolExecutor 是 Java 中用于创建和管理线程池的接口&#xff0c;当线程池中的任务队列已满&#xff0c;并且线程池中的线程数量已经达到最大时&#xff0c;如果再有新的任务提交&#xff0c;就需要一个策略来处理这些无法执行的任务。它 …

c++ 截图GetWindowDC,并保存到文件夹下---手把手教

工作中遇到一个需求&#xff0c;需要在用户操作过后&#xff0c;需要截图来确认用户操作过后&#xff0c;真实的呈现结果&#xff0c;用来后期验证 直接上代码 直接使用&#xff0c;修改自己需要捕获的窗口名字就可以了 OnBnClickedBtUpimage(){CString strPathTmp;GetAppPath…

2024年 IT 行业就业情况能否回春?很多人说道…

我只能说可以&#xff0c;以前我是看不到的。但是鸿蒙全栈自研让我重新看到希望&#xff01; 2024年1月18日&#xff0c;华为鸿蒙千帆启航发布会。讲到HarmonyOS NEXT作为原生鸿蒙&#xff0c;其系统底座全栈自研&#xff0c;去掉了传统的AOSP 代码&#xff08;“Android 开放…

基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 车间调度问题&#xff08;JSSP&#xff09;描述 4.2 蛙跳算法&#xff08;SFLA&#xff09;基本原理 4.2.1 初始化 4.2.2 局部搜索 4.2.3 全局信息交换 4.2.4 变异策略 4.2.5 终止…

音乐证书通过率发布,市场对持有者需求旺盛

音乐证书的考试难度备受关注&#xff0c;通过率终于揭晓。据官方公布的数据&#xff0c;该证书的通过率相对较低&#xff0c;需要考生在音乐技能和表现方面有出色的表现。然而&#xff0c;持有音乐证书的人才在市场上需求旺盛&#xff0c;各种音乐机构和企业对其表现出强烈兴趣…