ADI开发笔记

[TOC]

TERMINOLOGY

Processors / Microcontrollers / DSP

以下是ADI官方对Processors、Microcontrollers、DSP 等词的解释:

image-20210501094933998

image-20210501094947031

image-20210501094923111

image-20210501095225573

Harvard Architecture,即哈佛结构,是一种将程序指令存储和数据存储分开的存储器结构。哈佛结构是一种并行体系结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问。

Super Harvard Architecture(超级哈佛架构,SHARC),由ADI开发,具体解释见下方 BLACKFIN / SHARC。

Why Floating-Point DSP?

A digital signal processor’s data format determines its ability to handle signals of differing precision, dynamic range, and signal-to-noise ratios. Because floating-point DSP math reduces the need for scaling and probability of overflow, using a floating-point DSP can ease algorithm and software development. The extent to which this is true depends on the floating-point processor’s architecture.

Consistency with IEEE workstation simulations and the elimination of scaling are two clear ease-of-use advantages. High-level language programmability, large address spaces, and wide dynamic range allow system development time to be spent on algorithms and signal processing concerns, rather than assembly language coding, code paging, and error handling.

--<ADSP-21160 SHARC® DSP Hardware Reference>

总结一下就是:

  • (The data format is) Suitable to handle various kind of task (like differing precision, dynamic range, and signal-to-noise ratios).
  • (F-P DSP math) Reduces the need of scaling and probability of overflow.
  • High-level language programmability, large address spaces, wide dynamic range.

BLACKFIN / SHARC

以下是ADI官网对BLACKFIN 和 SHARC的描述

BLACKFIN

Blackfin® 16/32位嵌入式处理器提供软件灵活性和扩展能力,适合融合应用:多格式音频、视频、语音和图像处理、多模式基带和分组处理、控制处理以及实时安全。

SHARC

SHARC音频处理器产品系列采用ADI公司的SHARC®和SHARC+®数字信号处理(DSP)内核技术,提供确定性和极低处理延迟以及出色的MIPS/mW性能。SHARC处理器系列在浮点DSP市场占据主导地位,拥有出色的内核和存储器性能以及优异的I/O吞吐能力。SHARC具有多个产品版本和价位,能够为动态范围至关重要的许多应用提供实时浮点处理性能。

许多处理器集成了FIR/IIR硬件加速器,可分流内核的通用数字信号处理算法任务,从而使内核能够并行执行后处理算法,因而非常适合实时音频应用。广泛的SHARC+ SoC产品组合提供高达1GHz的性能可扩展性以及各种片内存储器配置和混合外设。对于以太网和USB等复杂的外设,一些SoC集成了ARM内核以便处理运行堆栈软件和其他微控制器任务。

以下文字是《ADSP-21479 EZ-Board Evaluation System Manual》全篇唯一出现blackfin关键字(Page28)的地方,但是21479不属于Blackfin系列,应该是错误来的。

image-20210520135616863

image-20210520135407091

BASIC KNOWLEDGE

原理图模块 是指用于构建SigmaStudio设计的模块。每个处理器可用的块显示在“工具箱”和“树形工具箱”窗口中,可以将其拖放到原理图中。

USBi

  • USBi features a standard Aardvark-compatible programming header.

  • USBi can be used for real-time tuning of Sigma-DSP with SigmaStudio

下图为USBi的功能框架:

image-20210518114358905

USBi在I2C总线上有一个EEPROM,地址为0x50。它用来向PC显示其供应商ID和产品ID,以及启动其内部程序。应该避免在你的系统设计中在这个地址上有任何其他的EEPROMs。

这个EEPROM没有写保护;因此,如果你试图写到地址0x50,你将覆盖USBi的板载EEPROM,USBi将停止工作。如果不把板子还给Analog Devices,就不能对USBi进行重新编程。大多数EEPROM被设置为地址0x50的方法是将其引脚A0 = 1 和A1 = A2 = 0。

Algorithms: Add/Remove, Grow/Reduce

每个原理图块代表一种或多种信号处理算法。算法的范围从非常简单的信号添加(如Signal Add)到高级系统组件(如Dynamic Bass Boost)。您可以从块中添加或删除算法以满足您的特定要求。如下所述,算法也可以增长。


添加算法:

您必须添加一种算法-通常与一组I / O引脚关联-才能使块起作用。要将算法添加到块,请右键单击该块,然后选择添加算法> IC#,然后选择算法的DSP IC。请注意,如果您的项目中有多个处理器(IC / DSP),则可以选择哪个DSP将运行算法,有关更多信息,请参见下文。

img

此时,如果需要,右键单击块的边界或标签以添加其他算法。(重要的是右键单击边框或标签;如果右键单击中心,则可能会显示用于输入参数值的弹出窗口。)

img

不包含算法的块将没有控件或引脚,并且您只会看到该块的名称(如下图所示)。必须在空块中添加算法,然后才能在原理图设计中使用它们。

img

注意:使用“树形工具箱”窗口时,总是为每个插入的块创建一个算法。但是,如果使用传统的“工具箱”窗口插入块,则可能还必须添加算法。

添加算法时,不仅要为模块选择计算方法,还要为算法选择特定的DSP关联。如果要连接多个DSP处理器,这一点很重要:通过将算法添加到模块中,可以共享模块和控件,并同时与多个DSP进行通信。

例如单个音量控制块具有用于所有算法的单个滑块控件。如果使用2个DSP处理器(IC 1(AD1940)和IC 2(ADAU1701))创建一个项目,然后选择“添加算法”,则系统将提示您要将该算法添加到哪个芯片。

img

可以将第一种算法分配给IC 1,将第二种算法分配给IC 2,但是它们共享音量块和单个滑块控件。请注意,您不能在不同的处理器之间建立连线,有关更多信息,请参见连线主题。


删除算法:

也可以从块中删除算法。要删除算法,请右键单击该块,然后选择“删除算法”。这将删除最后添加的算法(底部引脚)。如果该块仅包含一种算法,则删除该算法将导致一个空块


增长算法:

不断增长的算法意味着在该块的现有算法的基础上,保持相同的算法(在其上进行扩展)和相同的DSP关联(添加算法均不执行)。要增长算法,请右键单击该块,然后选择“增长算法”>“(算法名称)”>“(增长量)”。请注意,并非所有算法都可以使用增长。

理解添加和增长之间区别的最简单方法是使用混合器块。将交叉混合器(2个输入)拖到工作区中。右键单击并选择“增长算法”,请参见下面的示例。

  • 增加混音器会创建更多的混音器输出引脚,实际上,您正在创建共享公共输入的额外混音器输出通道。块中仍然只有一个算法。
  • 添加算法将创建单独的算法,这些算法共享控制窗口,但不共享输入/输出引脚或资源。在混频器示例中,一个附加的输入引脚,输出引脚和一个交叉混频器控件被添加到了该模块中。

减少算法:

减少与增加相反,减少了由“增加算法”操作创建的多余控件和引脚。像删除算法一样,reduce将删除从底部或最近增长的项目开始的控件/大头针。

img

Wires and Aliases

SigmaStudio原理图设计由与“导线”连接在一起的模块构建。导线定义了系统的信号流。

要创建原理图导线: 将鼠标光标移到块的引脚上,以便显示导线图标img。接下来,左键单击一个块引脚,然后在按住鼠标按钮的同时,将光标拖到另一个块的相应引脚上。输入引脚只能连接到输出引脚,而输出引脚只能连接到输入引脚。

img

选择:

要选择一条导线,请用鼠标左键单击它。选定的电线用绿色正方形(点)表示,如下所示。位置:

img

要更改导线的位置,请将鼠标光标放在一个点上。接下来,在导线点上单击鼠标左键,并在按住鼠标键的同时拖动光标以重新放置导线。

img

菜单:

右键单击导线以调出导线菜单。该菜单包括以下命令:

img

电线颜色:

电线根据其关联的DSP处理器进行着色。导线的输入和输出引脚必须与同一DSP关联,否则您将无法在引脚之间建立导线。具有多个处理器IC的项目的每个IC将具有不同的颜色。

img


引脚(导线)备注:

为了直观地组织项目,通常有助于创建备注,以在原理图中的信号流中提供清晰的连接参考(“跳转”)。一个备注由一对输入的备注和备注输出块组成。使用备注块可以减少长导线连接所造成的原理图窗口中的视觉混乱。

要创建备注,请右键单击块的输出引脚(蓝色引脚),然后从菜单中选择“备注”。

img

当您单击Alias时,将出现两个块,分别是输入和输出。备注输入自动连接到源模块的输出引脚。接下来,创建一条从备注输出块(在下面的示例中为备注2)到信号目标的导线。

img

注意:使用备注在功能上等同于用电线连接两个引脚。以下示例中的信号流与上面的备注示例相同。

img

Hardware Configuration Tab

硬件配置工作区允许您为设计选择一个或多个处理器。它还允许您设置SigmaStudio与硬件之间的通信。

要了解可以在“硬件配置”选项卡中访问的高级操作(包括“输出捕获”,“ Flash / E2Prom下载”,“寄存器控制”窗口和“寄存器读/写”窗口),请参阅“硬件Windows”部分中的主题。

要将处理器(IC / DSP)插入设计中:

  1. 用鼠标左键从工具箱中选择一个“处理器”:

    1. img
  2. 将处理器模块拖放到右侧的“硬件配置”窗口中:

    img

注意:一旦在“硬件配置”窗口中插入DSP,就会出现“原理图(Schematic)”选项卡。

在DSP处理器和硬件之间建立连接:

  1. 单击“通信渠道(Communication Channel)”类别(在“工具箱”列的底部)。
  2. 从列表中选择评估板或USB设备,并将其拖放到工作区中。
  3. 通过在通信通道和处理器模块之间画线来连接两个模块,从蓝色菱形到绿色菱形。对于使用AD1940的USB连接,工作空间中的单元格应如下所示:

注意:“通信通道”菜单列出了带有前缀EvalBoard的名称和板号。这些通信通道将在不使用评估板设置的平台上适用于相同的IC类型。还有通用的通信通道,USBSerialConv和USBi。(有关更多信息,请参见USB串行转换器通信通道或USBi。)

img

通信模块上USB标签 的颜色表示是否已建立USB通信通道。如果您已正确配置USB硬件,则背景色将为浅橙色或白色。如果未初始化通信,则背景将为红色。请注意,这仅表示USB连接处于活动状态,不能保证与SigmaDSP IC的通信或SigmaDSP硬件已正确配置。

img

连接所有板卡IC时,“已连接”背景色为白色,而仅连接部分IC(但不是全部)时为“橙色”。例如,ADAU1701评估板包括ADAU1701 IC和E2Prom IC。仅连接ADAU1701时,背景将为浅橙色,但同时连接ADAU1701和E2Prom IC时,背景将为白色。

img

https://wiki.analog.com/_detail/resources/tools-software/sigmastudio/gettingstarted/usbinterfaces/usbpic4.png?id=resources%3Atools-software%3Asigmastudio%3Agettingstarted%3Ausbinterfaces%3Ausbserialconverter)


EVAL-ADUSB1板开关和跳线:

  • S1-将闪存中保存的程序加载到SigmaDSP。
  • S2-选择当按下S1时将加载八个SigmaDSP程序中的哪一个。
  • S3-重置USB适配器板。
  • TP1-+ 5Vdc连接,用于适配器未通过PC的USB端口供电的情况。
  • TP2-接地,用于适配器未通过PC的USB端口供电的情况。
  • J3-当该接头连接器上有跳线时,将启用对闪存的写操作(用于存储SigmaDSP程序)。
  • D4-此LED指示USB板已通电。

可以使用SigmaStudio中的Flash Downloader工具将SigmaDSP程序和参数文件保存到USB板上的闪存中。通过将S2设置为适当的设置,然后按下程序加载按钮S1,可以将每个程序加载到SigmaDSP。请参阅Flash Downloader页面。 有关更多信息,请参见EVAL-ADUSB1数据手册,analog.com / sigmadsp。

Digital Attenuator

即数字衰减器, 与可变衰减器不同,数字衰减器在离散和有限衰减状态下切换。该切换通常以二进制步骤实现。数字衰减器采用半导体器件来实现每个衰减步骤。为此目的而使用的一些半导体器件包括:PIN二极管,MOSFET和GaAs MESFET。数字衰减器能够实现与固态开关速度相当的开关速率。数字衰减器使用的最常见逻辑类型 是CMOS逻辑电平和晶体管晶体管逻辑(TTL)。

数字衰减器利用驱动器电路来确定要使用的逻辑类型。驱动器电路的复杂性取决于所使用的位数。复杂度随着位数的增加而增加。通常根据数字衰减器设计提供的衰减状态对其进行分类。使用的位数决定了这些衰减状态。最高有效位提供最大的衰减,而最低有效位提供组件提供的最小衰减。其余位提供中间衰减值。通常,这些产品采用1位,5位,8位和6位数字衰减器。

如果选择了所有位,则数字衰减器旨在提供最大的额定衰减。另一方面,其最小衰减步长仅通过选择最低有效位来实现。数字衰减器在3G和4G蜂窝网络,点对点节点,中继器以及广泛的测试和测量应用中具有广泛的用途。

Shop Arrow.com选择了数字RF步进衰减器,数字音频衰减器等。 >>> read more

ASRC

异步采样速率转换器(ASRC,Asynchronous Sample Rate Converter)是一款可同时用于消费电子和专业应用的音频采样速率转换通用软件模块。 ASRC支持多种不同的采样速率配置。

ASRC软件模块 可用于以小步长改变采样频率,步长随着时间改变,且在变化过程中不生成任何输出音频干扰。 在许多多媒体系统中,时变采样速率的改变是非常重要的功能,例如能实现多个数据流的精密同步以及服务器和客户端的同步等。

ADI公司的ASRC实施方案经过高度优化,适合在ADI公司的Blackfin系列处理器上运行。它是一个基于ADI专利设计的独立自足软件模块。该模块已经过各种根据音频信号质量分析定义的策略质量测试。

ASRC模块是应用于PCM(脉冲编码调制)上的后处理模块,通过模拟输入、数字输入通道或解码应用的PCM输出接收数据。 ASRC模块能够处理多个通道的输入信息,并能够输出至同样多的通道。 开发的模块支持全面的重入和多实例。 ASRC模块是一个独立的模块,不依赖其他任何模块。 ADRC模块配备一个示例轻型包装器API,将模块插入至整体系统。 这使得该应用的系统集成简单易行。

ASRC INPUT/OUTPUT

ASRC输入和输出模块在原理图设计和硬件ASRC(异步采样率转换器)之间路由信号。

使用输入块的复选框来启用或禁用特定输入。使用输出块的下拉列表控件从可用的ASRC中进行选择。

  • 每个ASRC输出必须连接其输入,否则编译时将出错。
  • 可以看到,随着将更多的ASRC输出块拖到原理图中,下拉列表中的可用输出数量会减少,因为一次只能由一个块表示。
  • 要更改ASRC 输入采样率,请右键单击块名称,然后选择“设置采样率”,这将打开“采样率”窗口(默认值为44.1 kHz)。
img

Limiter 限幅器

限幅器(Limiter)是指能按限定的范围削平信号电压波幅的电路,又称削波器。限幅电路的作用是把输出信号幅度限定在一定的范围内,亦即当输入电压超过或低于某一参考值后,输出电压将被限制在某一电平(称作限幅电平),且再不随输入电压变化。

LSB-aligned

LSB(Least Significant Bit)是“最低有效位”。MSB(Most Significant Bit)是“最高有效位”。

最高有效位是指二进制中最高值的比特,如:

  1. 在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。

  2. 在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之相反的“最低有效位”(LSB)。

  3. 汇编中,比如8位2进制数10000001,其中第一个1是MSB,第二个1是LSB。1(MSB)100 0011(LSB)

  4. 在计算时,如果是整数,那么小数点(实际上是没有小数点的,但就把那一位和下一位之间看作有)在LSB后面;如果是小数,小数点在MSB后面;其中MSB在有符号数中又是符号位。

在网络通信方面,大家说的更多的是:“Big-Endian”和“Small-Endian”的问题。指的都是对于多字节的数据类型(比如4字节的32位整数),其多个字节的顺序问题,是最高字节在前(Big-Endian)还是最低字节在前(Small-Endian)。

比如对于123456789这个整数,其16进制为0x075BCD15,那么按照Big-Endian的方式,它在网络上传输(或者在内存里存储)的4个字节依次是:07 4B CD 15,而Small-Endian的顺序正相反,是:15 CD 4B 07

MSBLSB 虽然跟这个事情看起来有点相似,但不是一回事。

通常,一个芯片的管脚中,对于一个多比特的信号,比如32根的地址线,从低开始按0到31编个号。MSB就是31,LSB就是0。那么如果标记为:ADDR[31:0]就是MSB first的方式,如果标记为ADDR[0:31]就是LSB first的方式。

MSB LSB:起始地址为最高位, 最后地址为最低位。

LSB MSB:起始地址为最低位,最后地址为最高位。

比如AD中,8位,最低有效位指D0

Cofficient Write

参数写入,是指对参数中两组 寄存器参数集 的系数写入。当然也可以单独写入某个寄存器的数值。

可写入的参数如:filter coefficients、limiter settings、volume control settings等。

每组 寄存器参数集 可写入至多 160个参数(32个过滤器*5个系数)。

Filters

在ADAU1772的General(2nd Order) Filter Setting中有几项过滤器,分别是 Parametric 、 Shelving 、 General HP/LP/BP/BS 、 Butterworth/Bessel 、 Tone Control、IIR Coefficient 、First Order Filters 、All Pass 、Peaking 、Notch 、 Chebyshev 共11中过滤器。

image-20210428152357233

SigmaStudio

以下简称sigma

Capture

Capture 窗口会捕捉开发者对设置的相关改动记录。

image-20210422165857465

Register Control

image-20210422163633005

Output/Serial Port

下压式音量按键

使用前需要进行跳线,跳线方法如下:

image-20210422163804275

控制界面如下:

image-20210422163228410

?? Time

Initial PB Volume 初始化下压式按键的音量值

Gain Step 增益速度

Ramp Speed 增加速度

Converters Controlled by PushButton Volume 被控制的转换器

Download Program

image-20210422170248954

image-20210422170328013

Microphone

TRS 1/8-inch mini-plug stereo headphones

查看源图像

standard 0.100” headers

查看源图像

Bias Setting

image-20210423102647330

ADAU1772包括两个麦克风偏置输出:MICBIAS0和MICBIAS1。这些引脚为驻极体模拟麦克风提供电压参考。

  1. MICBIASx引脚也可用于为具有独立电源引脚的数字或模拟MEMS麦克风干净地提供电压。
  2. MICBIASx电压在麦克风偏置控制寄存器(地址0x002D)中设置。可以利用这个寄存器对MICBIAS0或MICBIAS1的输出进行启用或禁用。
  3. 增益选项提供了两种可能的电压:0.65 × AVDD或0.90 × AVDD。许多应用要求只启用两个偏置输出中的一个。当系统中使用许多传声器时,或者当传声器在PCB上的位置不允许一个引脚对所有传声器进行偏置时,两个偏置输出都应该被启用。

dataword byte : 在突发模式(burst mode)中使用。

data byte : 在单字模式(single-word mode)下写入。

由DSP启动1772

1772启动可以通过以下两种方式执行:

  1. 通过SPI或I2C协议,将执行代码写入到SRAM的方式来执行
  2. 通过将代码写入EEPROM,并设置自启动的方式来读取和执行代码。

由DSP启动1772,其实是通过上述第一种方式来进行,其中又可以再分为两种方法:

  1. 通过在SigmaStudio中导出项目系统文件,并加载至DSP项目工程的方式来执行,具体方法后述。
  2. 通过SPI协议,由DSP片选1772后逐各写入寄存器的方式来执行(注意:使用本方法时,单次写入量不可超过128个字节)。

通过导出系统文件的方式

在SigmaStudio中,执行过 Link Compile Downloa 后,可以点击 Export System Files 导出项目工程文件(C格式)

image-20210510084234044,并将 .h_PARAM.h_REG.h 三个类型文件插入到DSP的项目文件中。

注意:如图所示,所选的三个文件为主IC(1772)的工程文件,另外三个同后缀名的IC_2是另一个芯片(EEPROM)的文件,看情况决定是否使用。

image-20210510091831286

其中,_PARAM.h_REG.h 提供了对寄存器的定义,.h 文件中提供了唯一的执行方法 default_download_IC_1(),在DSP项目工程文件中执行即可。

image-20210510092602442

注意:本文件依赖于 SigmaStudioFW.h 头文件,image-20210510093228165,可以复制粘贴以下原代码,也可以在SigmaStudio的安装目录下查找。

需要注意的是,以下所有宏定义内容都为空,需要开发者自行编写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
* File: SigmaStudioFW.h
*
* Description: SigmaStudio System Framwork macro definitions. These
* macros should be implemented for your system's software.
*
* This software is distributed in the hope that it will be useful,
* but is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This software may only be used to program products purchased from
* Analog Devices for incorporation by you into audio products that
* are intended for resale to audio product end users. This software
* may not be distributed whole or in any part to third parties.
*
* Copyright � 2008 Analog Devices, Inc. All rights reserved.
*/

#ifndef __SIGMASTUDIOFW_H__
#define __SIGMASTUDIOFW_H__

/*
* TODO: Update for your system's data type
*/
typedef unsigned short ADI_DATA_U16;
typedef unsigned char ADI_REG_TYPE;

/*
* Parameter data format
*/
#define SIGMASTUDIOTYPE_FIXPOINT 0
#define SIGMASTUDIOTYPE_INTEGER 1

/*
* Write to a single Device register
*/
#define SIGMA_WRITE_REGISTER( devAddress, address, dataLength, data ) {/*TODO: implement macro or define as function*/}

/*
* TODO: CUSTOM MACRO IMPLEMENTATION
* Write to multiple Device registers
*/
#define SIGMA_WRITE_REGISTER_BLOCK( devAddress, address, length, pData ) {/*TODO: implement macro or define as function*/}

/*
* TODO: CUSTOM MACRO IMPLEMENTATION
* Writes delay (in ms)
*/
#define SIGMA_WRITE_DELAY( devAddress, length, pData ) {/*TODO: implement macro or define as function*/}

/*
* Read device registers
*/
#define SIGMA_READ_REGISTER( devAddress, address, length, pData ) {/*TODO: implement macro or define as function*/}

/*
* Set a register field's value
*/
#define SIGMA_SET_REGSITER_FIELD( regVal, fieldVal, fieldMask, fieldShift ) \
{ (regVal) = (((regVal) & (~(fieldMask))) | (((fieldVal) << (fieldShift)) && (fieldMask))) }

/*
* Get the value of a register field
*/
#define SIGMA_GET_REGSITER_FIELD( regVal, fieldMask, fieldShift ) \
{ ((regVal) & (fieldMask)) >> (fieldShift) }

/*
* Convert a floating-point value to SigmaDSP (5.23) fixed point format
* This optional macro is intended for systems having special implementation
* requirements (for example: limited memory size or endianness)
*/
#define SIGMASTUDIOTYPE_FIXPOINT_CONVERT( _value ) {/*TODO: IMPLEMENT MACRO*/}

/*
* Convert integer data to system compatible format
* This optional macro is intended for systems having special implementation
* requirements (for example: limited memory size or endianness)
*/
#define SIGMASTUDIOTYPE_INTEGER_CONVERT( _value ) {/*TODO: IMPLEMENT MACRO*/}

#endif

通过写入寄存器的方式

在 Capture 面板中,对寄存器的所有操作都会以 参数名地址数据 的方式展现,几乎所有参数名都可以在《ADAU1772》中查询。

image-20210510091150821

  1. 全选面板中所有的值,可以点选第一个值,按 SHIFT + END 来全选,然后右键选择 Save as Raw Data 下的 Address+Data(Text)... ,会以文本格式 (.txt) 保存。

image-20210510085052186

保存结果:

image-20210510085331956

  1. 将地址和值整理到DSP项目文件中进行写入,这种方式不太好操作,需要开发人员自行编写对应的代码,较为不友好。

CHIP-ADAU1772

  • ADAU1772以下简称1772
  • 《Evaluation Board User Guide UG-477》以下简称UG

I2S及I2C接口

image-20210513171416187

image-20210513171524562

USBi 仿真器

  • USBi驱动安装:进入设备管理器,安装驱动在SigmaStudio安装目录 \Analog Devices\SigmaStudio 4.6\USB drivers\ 下。
  • 连接到USBi未成功时是红色,设备驱动安装且连接成功时,USBi 在sigma中会由红变绿。
  • USBi作为中间板对1772进行控制,在USBi右键可以控制1772设备开断,开断时板上D1区的VDD指示灯也会通断(见page10)。
  • 如果需要对设备进行实时控制,请务必记得打开设备,否则无法操作。

image-20210428150645112

  • USBi将例程down到了板子上ADAU1772的SRAM上,断电就没有了。USBi的这种调试是为了快速验证功能,最终需要把这个例程的代码导出,并通过单片机的 启动工程集成,烧写到单片机中,实现单片机启动。

image-20210427110916316

编译烧录

  • 烧录按键如下:
image-20210427162529600
  • 编译完毕后,SS会在右边的output窗体里显示编译结果,如有错误会提示错误信息,用户可据此信息去修改设计;
  • 如成功则会显示资源占用信息,用户可根据百分比来增减模块。

image-20210427111013493

芯片

板上共有4颗芯片,分别是 DSPEEPROM线性整流芯片升压芯片

image-20210427171901213

U2: EEPROM

ST官网对M24C32-F串行E2PROM的描述:

容量:32-Kbit

电压:1.7 ~ 5.5V

温差:-40 ~ +85℃

Snipaste_2021-04-27_17-18-01

Snipaste_2021-04-27_17-18-18

输入输出控制

供电电压

以下为实际测量数值

USB_5V SCL/SDA(H) VDD IOVDD AVDD
接USBi实测电压(V)-3.3V档 3.471 1.961 1.997 1.997 1.988
接21479实测电压(V)-3.3V档 4.463 3.518 3.518 3.518 3.518
接21479实测电压(V)-1.8V档 4.468 2.260 1.934 1.934 1.933
接21479实测电压(V)-3.3V档 3.3 3.3088

HP输出

HP即Headphone缩写,HP输出有两个输出端,分别是DAC0 和 DAC1,分别对应为 EVAL板 上的 OUT R(HP Right) 和 OUT L(HP Left)。

image-20210427152251539

image-20210427143628880

输出静音

image-20210427153425633

输出断电

关于HP输出的寄存器 HP_EN_RHP_EN_L 说明:

image-20210427152528194

0x310011 0001 ,最后两位 01HP_PDN_L 中的 01

输出音量控制

  • 对输出音量进行控制需要先对S5、S6进行跳针。

image-20210427110159648

TALKTHRU / DSP BYPASS

DSP BYPASS MODE When DSP bypass mode is enabled, a direct path from the ADC outputs to the DACs is set up to enable bypassing the core processing to listen to environmental sounds.

This is useful for listening to someone speaking without having to remove the noise cancelling headphones. The DSP bypass path is enabled by setting an MPx pin low.

Figure 92 shows the DSP bypass path disabled, and Figure 93 shows the DSP bypass path enabled by pressing the push-button switch.

image-20210427144110884

The DSP bypass feature works for both analog and digital microphone inputs.

  • Enabled when a switch connected to an MPx pin that is set to DSP bypass mode is closed and the MPx pin signal is pulled low.

Pressing and holding the switch closed enables the DSP bypass signal path as defined in the TALKTHRU register (Address 0x002A).

The DAC volume control setting is switched from the default gain setting to the new TALKTHRU_GAINx register setting (Address 0x002B and Address 0x002C).

  • DSP bypass is enabled only on ADC0 and ADC1.

The DSP bypass signal path is from the output of ADCx to the input of the DAC(s). When DSP bypass is enabled, the current DAC volume setting is ramped down to −95.625 dB and the DSP bypass volume setting is ramped up to avoid pops when switching paths.

CHIP-ADSP21479

芯片及评估板资料

关于芯片特性:《ADSP-21477 / ADSP-21478 / ADSP-21479》

关于评估板:《ADSP-21479 EZ-Board® Evaluation System Manual》

仿真器配置

与《HPUSB, USB, and HPPCI Emulators User’s Guide》所描述的并不完全一致。

image-20210519104127472

下图为实际安装后,查看官方对21479提供的相关仿真器的信息和从设备管理器中可查看到的设备信息。

image-20210519104034539

image-20210519104001549

本评估板提供的仿真器使用的是14针脚的HPPCI JTAG,PCI仿真器支持的操作模式取决于目标机上14针JTAG接头的连接方式。表1-2显示了目标机JTAG头在传统和自动检测模式下的连接方式。

image-20210519105525684

注意:其中3口是无针脚的防呆设计。

HPUSB JTAG模式

在实际开发中,使用的是HPUSB传统模式。

传统模式用于不提供目标VDDIO输入的旧目标,供仿真器自动检测电压。 在这种模式下,JTAG信号运行的电压是通过配置器工具手动设置的。在配置目标时,配置器工具提供了一个电压选择设置。

Legacy mode is used for older targets that do not provide a target VDDIO input for automatic voltage detection by the emulator.

In this mode, the voltage at which the JTAG signals run is set manually through the Configurator utility.

The configurator utility provides a voltage selection setting when configuring the target.

注意:HPUSB-ICE 和 USB-ICE 仿真器都不支持自动电压检测模式。

以下为JTAG的电路示意:

image-20210519111126670

I2C/TWI串行通信

根据文件《ADSP-21477_21478_21479_cn》的描述,可知21479支持TWI接口,进而支持I2C。

image-20210519112357298

21479没有针对TWI做专门的驱动,Blackfin系列大部分产品都提供了。

DAI接口

Digital Application Interface,即数字应用接口。所有数字应用接口都以SRU的方式连接至处理器。

SRU(Signal Routing Unit),即信号路由单元。SRU是处理器内部的一个提供超大系统信号流的复杂路由系统。通过SRU可以将DAI针脚利用不同组合路由至不同的内部设备。DAI所能连接的设备在每块评估板上都不同。下图展示了DAI接口的针脚、所连接的设备及其网络、所连接的开关和默认设置。

要在扩展II接口上使用DAI,请先用相关开关禁用驱动DAI引脚上的任何信号。

image-20210520110207578

image-20210520110221920

DPI接口

Digital Peripheral Interface,即数字外围(设备)接口 或 数字设备接口。DPI连接至第二块信号路由单元(SRU2)。

与SRU相似,SRU2也是一块能将大型系统信号流路由至处理器的复杂路由系统。

同样,每块评估板的DPI所连接的设备也不同。下图同:

image-20210520111001486

image-20210612111607855

image-20210612111848897

SRU.H

SRU()

以下是 <sru21479.h> 中对 SRU() 的宏定义,SRU2() 与其相同 :#define SRU2(out,in) SRU(out,in)

读取、修改和写回一个特定的SRU寄存器,以改变一个SRU的分配(即选择一个输入到一个输出)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
** Macro: SRU
** Reads, modifies and writes back a particular SRU register to change a single
** SRU assignment (i.e. selects an input to an output).
*/
# ifdef _LANGUAGE_C
# define SRU(out,in) \
do { \
*(volatile unsigned int *) in##_REG = \
((unsigned int)sru_field(out,in) | \
(* (volatile unsigned int *) in##_REG & (unsigned int)sru_mask(out,in))); \
} while (0)
# else
# define SRU(out,in) \
r0=dm(in##_REG); \
r1=sru_mask(out,in); \
r0=r0 and r1; \
r1=sru_field(out,in); \
r0=r0 or r1; \
dm(in##_REG)=r0;
# endif

sru_field()

为一个给定的输入和输出信号创建位域(bit field)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
** Macro: sru_field
** Creates the bit field for a given input and output signal.
*/
#define sru_field(out,in) \
(((in##_GROUP & GROUP_A) >> LOG_GROUP_A) * A_##out \
|((in##_GROUP & GROUP_B) >> LOG_GROUP_B) * B_##out \
|((in##_GROUP & GROUP_C) >> LOG_GROUP_C) * C_##out \
|((in##_GROUP & GROUP_D) >> LOG_GROUP_D) * D_##out \
|((in##_GROUP & GROUP_E) >> LOG_GROUP_E) * E_##out \
|((in##_GROUP & GROUP_F) >> LOG_GROUP_F) * F_##out \
|((in##_GROUP & GROUP_G) >> LOG_GROUP_G) * G_##out \
|((in##_GROUP & GROUP_H) >> LOG_GROUP_H) * H_##out \
|((in##_GROUP & GROUP_I) >> LOG_GROUP_I) * I_##out \
|((in##_GROUP & GROUP_A2)>> LOG_GROUP_A2)* A2_##out \
|((in##_GROUP & GROUP_B2)>> LOG_GROUP_B2)* B2_##out \
|((in##_GROUP & GROUP_C2)>> LOG_GROUP_C2)* C2_##out ) << in##_SHIFT

sru_mask()

创建一个掩码,可用于清除属于给定输入和输出信号的位域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
** Macro: sru_mask
** Creates a mask which can be used for clearing the bitfield belonging
** to the given input and output signal.
*/
#define sru_mask(out,in) \
~((((in##_GROUP & GROUP_A) >> LOG_GROUP_A) * MASK_A \
|((in##_GROUP & GROUP_B) >> LOG_GROUP_B) * MASK_B \
|((in##_GROUP & GROUP_C) >> LOG_GROUP_C) * MASK_C \
|((in##_GROUP & GROUP_D) >> LOG_GROUP_D) * MASK_D \
|((in##_GROUP & GROUP_E) >> LOG_GROUP_E) * MASK_E \
|((in##_GROUP & GROUP_F) >> LOG_GROUP_F) * MASK_F \
|((in##_GROUP & GROUP_G) >> LOG_GROUP_G) * MASK_G \
|((in##_GROUP & GROUP_H) >> LOG_GROUP_H) * MASK_H \
|((in##_GROUP & GROUP_I) >> LOG_GROUP_I) * MASK_I \
|((in##_GROUP & GROUP_A2)>> LOG_GROUP_A2)* MASK_A2\
|((in##_GROUP & GROUP_B2)>> LOG_GROUP_B2)* MASK_B2\
|((in##_GROUP & GROUP_C2)>> LOG_GROUP_C2)* MASK_C2) << in##_SHIFT)

示例

如下图所示,1~8的LED灯珠都与一个处理器针脚相连。DPI和DAI在此处并没有严格划分界限,但是用法上仍有些差异,如前三个LED连接的是DPI针脚,其函数SRU()的第一个参数写的是 FLAG,而其他 DAI 的第一个参数是 LOW

image-20210520113025876

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void Init_LEDs(void)
{
/* 设置SRU和路由,使标志引脚连接到DPI引脚缓冲区 */

/* 只使用标志4至15,标志0至3在DPI上不可用。 */

SRU(FLAG4_O,DPI_PB06_I); /* 将 Flag4 输出 连接到 DPI_PB06 输入(用于LED1) */
SRU(FLAG5_O,DPI_PB13_I); /* 将 Flag5 输出 连接到 DPI_PB13 输入(用于LED2) */
SRU(FLAG6_O,DPI_PB14_I); /* 将 Flag6 输出 连接到 DPI_PB14 输入(用于LED3) */

SRU(LOW,DAI_PB03_I); /* connect Input LOW to LED4 */
SRU(LOW,DAI_PB04_I); /* connect Input LOW to LED5 */
SRU(LOW,DAI_PB15_I); /* connect Input LOW to LED6 */
SRU(LOW,DAI_PB16_I); /* connect Input LOW to LED7 */
SRU(LOW,DAI_PB17_I); /* connect Input LOW to LED8 */

/* 使用以下顺序启用缓冲器:高电平->输出,低电平->输入 */

SRU(HIGH,DPI_PBEN06_I); /* LED1 */
SRU(HIGH,DPI_PBEN13_I); /* LED2 */
SRU(HIGH,DPI_PBEN14_I); /* LED3 */
SRU(HIGH,PBEN03_I); /* LED4 */
SRU(HIGH,PBEN04_I); /* LED5 */
SRU(HIGH,PBEN15_I); /* LED6 */
SRU(HIGH,PBEN16_I); /* LED7 */
SRU(HIGH,PBEN17_I); /* LED8 */

/* 将标志引脚设置为输出 */
sysreg_bit_set( sysreg_FLAGS, (FLG4O|FLG5O|FLG6O) );

/* 清除标志引脚 */
sysreg_bit_clr( sysreg_FLAGS, (FLG4|FLG5|FLG6) );
}

定时器

《ADSP-21477_21478_21479_cn》

image-20210611170204474
image-20210611170253655
image-20210611170342735
image-20210611170355842

创建定时器

1
2
3
4
5
6
7
8
/*
* Install and enable a handler for the high priority core timer interrupt.
*/
adi_int_InstallHandler(ADI_CID_TMZHI, /*iid - high priority core timer */
timer_isr, /*handler*/
(void *)&timer_isr_count1, /*handler parameter*/
true /*do enable*/
);

定时器中断句柄

来自实例《core_timer》:

  • 在定时器中断句柄 timer_isr 里面,不能调用标准IO函数,或者更新非volatile全局变量
  • 可以使用处理程序参数来识别被处理的中断 iid,并通过中断特定的回调指针参数 handlerArg 来访问数据。
image-20210612151008408

EXAMPLES

EXP1

本案例使用麦克风采集信号并从前两个通道输入,经过信号增益放大器调整后经过立体声通道输出。

具体步骤如下:

  1. 从左侧 树状工具箱(TreeToolBox)中拖出1772和USBi,并进行连接。

image-20210428094527305

  1. 原理图(SCHEMATIC) image-20210506150111553中需要对输入输出路径进行定义,在此处定义的所有图形编程内容都是对 可编程增益放大器(PGA)的使用,即此处的输入到输出所有内容都不经过 信号通路(SIGNAL ROUTING) 选项卡中的 音频处理核心(AUDIO PROCESSING CORE),是由 核心输入选择器(CORE INPUT SELECTION)完成的,也可以理解为PGA就是在其中,且PGA的设置在原理图中进行。

image-20210506145903478

  1. 在原理图中,从左侧 image-20210506150230833 拖出组件并连线如下,其中需要用到四个通道中的第1及第2通道,每个通告分别连接到一个 线性增益器(LINEAR GAIN),增益50分贝,将原本的麦克风信号从-60分贝左右提升一下。然后经过 全通角过滤器(ALL POLE FILTER),对1500Hz以下的声音增益10分贝。再经过 分线器(T CONNECTION),将信号分别传输给 分贝显示器(DISPLAY DBREG)输出通道(OUTPUT)

image-20210428095433721

image-20210506144919655

  1. 另,PGA的设置还需要在 PGA/ADC 选项卡中进行设置:
  • 启用PGAxPGAx Boost
  • 启用 Micx Bias
  • 调整 各通道的增益大小等

image-20210506145534521

  1. 信号通路 选项卡进行设置,使信号不经过 音频处理核心 ,启用 输出ASRC源选择器(OUTPUT ASRC SOURCE SELECT) ,信号经流如图示:

image-20210506150516695

  1. ​ 如果设置芯片使用,可以在 芯片控制(CHIP CONTROL)选项卡中设置性能增强模式

image-20210506151533990

  1. 接入正常的TS接口麦克风即可输入正常波形。

EXP2

本案例为PLL及时钟案例,首先需要明确以下几点:

  1. 1772的工作频率为12.288兆赫,PLL的输出频率被要求一定是24.576兆赫。
  2. 且从MCLKIN输入的频率范围为8至27兆赫,可以通过整数或分数分频来获得1772所需的工作频率(最终必须是12.288兆赫)。
  3. 通过设置4个参数 xRNM 对PLL进行参数调整,其中整数倍分频时只有在 MCLKIN = 12.288MHzMCLKIN = 24.576MHz 时可用。

已知,MCLK的输入频率16.625MHz,符合输入范围要求,以及最终目标输出频率24.576MHz。

首先启用PLL,点击image-20210513100438475,然后通过对 PLL M and N Calculator 进行设置,并点击 Load Parameters 进行自动计算和加载即可。

在主时钟源选项(Main Clock Source)中选择经过PLL处理的时钟源,并设置主时钟和核心时钟的分频率为 1/2即可。

从旁边也可以看到自动计算出来的分频系数:image-20210513100800163

image-20210513100908671

除了可以直接应用 SigmaStudio 的 load parameters 直接进行参数计算外,可以参考《在linux上编写求解ADAU1772的PLL系数》文章,自行系数计算。

EXP3

本例中主要完成TWI代码的编写,具体可以参见《I2C通信》笔记。以下是一开始的开发思路:

利用ADI官方提供(导出)的C代码,通过I2C协议向ADAU1772 codec芯片写入寄存器值,在ADAU寄存器写入的C代码中,依赖头文件<SigmaStudioFW.h>,其所有宏定义类型的函数都需要用户自行定义。

image-20210520095648245

Arduino示例

在Github上的 ADAU1761-Self-Boot-With-Arduino 中,适用于 Arduino 和 ADAU1761 的寄存器块(WRITE_REGISTER_BLOCK)定义实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void SIGMA_WRITE_REGISTER_BLOCK(byte IC_address, word subAddress, int dataLength, byte pdata[]) {

// start I2C transfer
if (!i2c_start((IC_address)|I2C_WRITE)) {
Serial.println("I2C device busy for WRITE REGISTER BLOCK");
return;
}

// write subAddresses. (ADAU1761 needs the 16 bit subAddress written as two 8 bit bytes with an "ACK" inbetween
uint8_t addressLowByte = subAddress & 0xff;
uint8_t addressHighByte = (subAddress >> 8);

i2c_write(addressHighByte);
i2c_write(addressLowByte);

if (dataLength < 50 ) {
for (int i=0; i<dataLength; i++) {
i2c_write(pdata[i]); //write data bytes
}
}
else {
for (int i=0; i<dataLength; i++) {
i2c_write(pgm_read_byte_near(pdata + i)); //write data bytes from PROGMEM (for param and program data)
}
}
i2c_stop(); // stop the I2C communication

}

在MBED网站中,大量往右对ADAU1701的 <SigmaStudioFW.h> 提供了支持,原网页如:ADAU1701

将宏定义改为函数形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void SIGMA_WRITE_REGISTER_BLOCK(int devAddress, int address, int length, ADI_REG_TYPE *pData ) {
int ii = 0;
int zz = 0;
Tx_Idx = 0;

/*----- Transmission Phase -----*/
ThisBufferSize = Address_Length + length;

I2C1_Buffer_Tx[0] = (address & 0xFF00)>>8;
I2C1_Buffer_Tx[1] = address & 0x00FF;

for(zz=0;zz<length;zz++){
I2C1_Buffer_Tx [zz + Address_Length] = pData[zz];
}
Tx_Idx = 0;
for(ii =0;ii < ThisBufferSize;ii++){
NextBufferEnd = ThisBufferSize;//I2C1_numbytes[ii];
if(ii == 0){
I2C_GenerateSTART(I2C1, ENABLE);
}
/* Send data */
while(Tx_Idx < NextBufferEnd)
{

}
}
}

void SIGMA_WRITE_DELAY(int devAddress, int length, ADI_REG_TYPE *pData )
{
int nCount=0;
nCount=0xFFFFF;
for(; nCount != 0; nCount--);
}

具体的代码已经贴在《I2C通信》了,21478和21479支持TWI的寄存器控制,但是更为复杂,官方没有给示例,因此使用了引脚高低高低电平的控制来实现通信。

数字逻辑分析仪

在EXP3中会频繁采集I2C、I2S、SPI等通信协议发过来的数据,因此需要使用数字逻辑分析仪进行数据采集和分析,在本次开发过程中使用了两种数字逻辑分析仪,分别是 USBee SuiteSaleae Logic ,推荐使用后者,软件更夹稳定、成熟和易使用。如果采用前者,那么软件经常崩溃。后者在采集I2S等高速通信协议中的电平信号时,需要将采样速率提升一下,24MS/s 的速度仍然能会采样变形。

image-20210623134058687
image-20210623134114244
image-20210623133953887

image-20210623134006076