前面在qt和matlab中实现了音频的播放,最终目的是在底层硬件中实现数据播放,之所以使用裸跑是为了更好的理解音频codec的相关配置和IIC、I2S的接口的通用代码的开发和测试。
        芯片ADAU1761 是一款低功耗、集成数字音频处理功能的立体声音频编解码器,支持立体 声 48 kHz 录音和回放,采用1.8V 模拟电源供电,功耗为 14mW。立体声音频 ADC 和DAC 支持 8 kHz 至 96 kHz 范围内的采样速率,并支持数字音量控制。

  1. 配置接口

ADAU1761支持SPI和IIC两种配置接口,在音频codec中,一般采用IIC时序来完成配置。

IIC读写寄存器有两种模式:单字节和块模式。

  1. 数据接口

音频接口有四种:I2S、左对齐、右对齐和TDMmode。比价常用的是I2S接口时序。可以从图中可以清楚得到:LRCLK的周期为fs,占空比为50%。

项目需求:

  1. 采样率:8kHz
  2. 配置接口:IIC
  3. 数据接口:I2S
  4. 实现音频采集和播放功能
  5. 音频采集和播放的位宽为16bit

第一步接口确认:

数据口:数据口有以下几个:MCLK、ADC_SDATA、BCLK、LRCLK和DAC_SDATA.

  1. 根据I2S接口时序,可以确认LRCLK为频率为8kHz、占空比为50%。
  2. 下一个确认MCLK频率,在ADAU1761中带有一个PLL,时钟配置有很多中,具体如下所示:

寄存器0x4000:时钟寄存器

这里采用默认配置,CLKSRC直接等于MCLK,INFREQ设置为1024 × fs ,这样可以计算出MCLK=8*1024=8.192MHz

  1. 再确认BCLK,思路为需要确认在LRCLK为高或低时,一共有几个时钟周期

如果一个LRCLK周期中有64个bit时钟周期,那么可以确认BCLK=64*LRCLK,所以可以确认BCLK=512kHz。

寄存器

说明

0x4000

0x01

不使用核时钟,直接使用MCLK

0x4015

0x00

使用默认配置,50%占空比,从模式

0x4016

0x00

使用默认配置 该寄存器设置BCLK频率

0x4017

0x00

使用默认配置 不清楚这个寄存器含义

0x401C

0x21

0x401D

0x00

使用默认配置

0x401E

0x41

0x401F

0x00

使用默认配置

0x4020

0x05

0x4021

0x11

0x4022

0x00

使用默认配置

0x4023

0xFF

设置左边耳机使能和音量最大

0x4024

0xFF

设置右边耳机使能和音量最大

0x4029

0x03

0x402A

0x03

使能DAC

0x40F2

0x01

0x40F9

0x7F

使能全部时钟

0x40FA

0x01

在弄清楚了时钟之间的关系,和寄存器的配置,后面就简单很多。

下面就是IIC接口实现和I2S接口实现:

IIC模块网上很多,根据ADAU1761,最多写6个byte,修改了一个可以设置写1-6个字节的版本。

iic_rw_module
(input                clk                ,                //50MHzinput                rst_n              ,                output    reg        scl                ,                inout                sda                ,                input                iic_en             ,                input                rd_or_wr           ,            //读写标志:读1,写0input [6:0]          device_addr         ,        input [15:0]         iic_reg_addr       ,        input [47:0]         iic_reg_data        ,input [7:0]          iic_bytes        ,output[47:0]         iic_read_data      ,            output reg           iic_done
);

I2S接口,也是在网上找的,简单好用。实际工程中,对调用进行了修改,没有采用axi总线进行写数据。

 module myI2STx_v1_0 #(parameter integer C_S00_AXIS_TDATA_WIDTH  = 32)(// I2S Interfaceinput mclk,output reg bclk = 1,output reg lrclk = 1,output reg sdata = 0,// User ports ends// Do not modify the ports beyond this line// Ports of Axi Slave Bus Interface S00_AXISinput wire  s00_axis_aclk,input wire  s00_axis_aresetn,output reg  s00_axis_tready = 0,input wire [C_S00_AXIS_TDATA_WIDTH-1 : 0] s00_axis_tdata,input wire [(C_S00_AXIS_TDATA_WIDTH/8)-1 : 0] s00_axis_tstrb,input wire  s00_axis_tlast,input wire  s00_axis_tvalid);reg mclkdelay = 0;reg halfclk = 0;reg [0:0]counter = 0;reg [15:0]ramp = 16'hFFFF;reg [15:0]shiftreg = 0;reg [4:0]bitcounter = 0;reg [2:0] state = 0;reg [31:0] buffer = 0;reg bufvalid = 0;localparam S0 = 0;localparam S1 = 1;localparam S2 = 2;localparam S3 = 3;localparam S4 = 4;always @(posedge s00_axis_aclk) beginif (bufvalid==0 && s00_axis_tready==0) begins00_axis_tready <= 1;end else if (bufvalid==0 && s00_axis_tready==1 && s00_axis_tvalid==1) begins00_axis_tready <= 0;buffer <= s00_axis_tdata;bufvalid <= 1;endif (mclk==1 && !mclkdelay) begincounter <= counter+1;if (counter == 0) beginhalfclk <= 1;endmclkdelay <= mclk;end else beginhalfclk <= 0;mclkdelay <= mclk;endif (halfclk==1) begincase(state)S0:     beginif (bufvalid==1) beginbufvalid <= 0;bitcounter <= 0;lrclk <= 0;bclk <= 0;sdata <= 0;state <= S1;shiftreg <= buffer[31:16];endendS1:     beginbclk <= 1;state <= S2;endS2:     beginbclk <= 0;sdata <= shiftreg[15];bitcounter <= bitcounter+1;state <= S3;                           endS3:     beginbclk <= 1;shiftreg <= shiftreg<<1;if (bitcounter==31) beginif (lrclk==0) beginstate <= S4;end else beginstate <= S0;endend else beginstate <= S2;endendS4:     beginbitcounter <= 0;lrclk <= 1;bclk <= 0;sdata <= 0;state <= S1;shiftreg <= buffer[15:0];enddefault:beginstate <= S0;endendcaseendendendmodule

接下来就是 生成原始音频文件或者数据,这里采用了matlab,对笔记本的麦克风进来录音,代码如下所示:

R = audiorecorder(8000,16,1);
record(R);
stop(R);
pause(R);
play(R);
stop(R);
myspeech = getaudiodata(R,'int16');
filename = ('test4.wav'); %给文件取吿
audiowrite(filename,myspeech,8000);

最后是如何把数据下发给codec。

我的思路:PS裸跑读取音频数据(可以通过SD卡读取文件,或者简单点直接定义一个short数组存放音频数据),通过乒乓操作,使用BRAM接口把数据下发给PL。

具体交互逻辑其实是构建一个FIFO空满标志:

PS判断RAM1是否为空,为空写入数据,否则等待;

当PS端写完数据后,通过寄存器通知PL,写完成;

PS第一次写完成触发PL开始取数据;

PL读使能一直根据音频采样率固定节拍;

工程源码链接:https://download.csdn.net/download/weixin_39813867/16616593

PYNQ2裸跑之音频ADAU1761相关推荐

  1. F1C100S裸奔nes游戏模拟器-f1c100s裸跑-WINDOWS下keil-MDK纯裸跑 回味80后的小幸福

    裸跑f1c100s-nes游戏模拟器 F1C100S-完整nes游戏模拟器(显示60帧-可音频输出),后附测试文件可下载. 全志F1C100S使用ARM9内核,QNF88封装适合手工焊接,内置32M ...

  2. Part2:S3C2440裸跑一个LED程序

    Part2:S3C2440落跑一个LED程序 0 写在前面 1 明确"操作对象"和"操作过程" 2 代码编写和分析--看一个程序如何裸跑... 2.1 代码编写 ...

  3. 4岁雪地裸跑、7岁自主创业,这个11岁机器人比赛冠军,南京大学自考毕业了!...

      新智元报道   编辑:张佳 [新智元导读]4岁雪地裸跑.独自驾驶帆船出海,5岁开飞机,7岁自主创业成为公司第一大股东,8岁徒步100公里穿越新疆罗布泊无人区,9岁小学毕业,还获得多项机器人世界冠军 ...

  4. 广州高校学生发起百人裸跑要求校方安装空调

    华南师范大学石牌校区的同学们为了装空调出奇招,校方表示正在一校三区逐步安装 新快报讯 炎炎夏日,在没有空调的宿舍里要如何度过?华南师范大学石牌校区的同学们为此出奇招,准备发起一场"百人裸跑& ...

  5. s3c2416运行JAVA_s3c2416裸跑环境配置

    最近刚刚开始学习ARM-linux,上周买了块tq2416的板子,给的Linux资料太复杂太深奥不愿看,等不及想要把2416跑起来.于是到处找相关裸跑资料,可是用2416的人实在少,网上的资料更少,裸 ...

  6. TX2440 裸跑实验-跑马灯(ADS1.2编译) 入门

    TX2440 裸跑实验-跑马灯(ADS1.2编译) 入门 一.实验目的: 理解汇编的编程结构,有助于学习ARM汇编,为后续学习CPU的启动机制来了个入门级 二.实验环境: TX2440平台 三.实验工 ...

  7. s3c2416keil下裸跑

    原文  http://www.cnblogs.com/yanzhicheng/p/3197053.html 最近刚刚开始学习ARM-linux,上周买了块tq2416的板子,给的Linux资料太复杂太 ...

  8. 想出名裸奔可以,但是请自己去,Leo谈“鹰爸训练4岁儿子雪中裸跑”

    周国平说:"一切世俗的头衔都可以凭人力获取,而要成为父亲却必须仰仗神力." 世上很少有父母不爱自己的孩子,不同点在于根据父母自己的判断表达爱的方式.去年有个虎妈,最近又出了个让孩子 ...

  9. 深度测试: LayaAir H5游戏引擎裸跑性能超越Unity3D

    转载:https://blog.csdn.net/vsyoyo/article/details/53332024 本文通过对实际评测报告数据进行逐一分析,验证LayaAir H5游戏引擎的真实性能表现 ...

最新文章

  1. kindeditor上传图片php,Kindeditor编辑器添加图片上传水印功能(php代码)
  2. centos python 安装
  3. 人生如戏,请给我好一点儿的演技
  4. MySQL 怎么变快_如何让mysql索引更快一点
  5. MFC之CAsyncSocket详解
  6. 【Python CheckiO 题解】Roman Numerals
  7. python读音-Python怎么读
  8. Linux 文件类型!
  9. 【游戏开发实战】Unity调用谷歌Google免费翻译API(https接口),年轻人不讲武德,用多个国家语言怎么讲
  10. Chrome 浏览器关闭了360主页防护后每次打开仍然是360导航问题排查与处理方法,不卸载360流氓软件解决chrome浏览器主页锁定问题
  11. Power Switching ----- Controlling power for power shutoff
  12. HTTP 请求 报错信息406
  13. 家用计算机设置网络,手把手教您设置安装家庭无线网络
  14. kdays 游戏汉化教程[日记版本] 序章 接触
  15. Windows桌面任务栏应用图标变白怎么办?
  16. 用GitHub做一份精美的在线简历
  17. 路由器指定dns解析服务器设置
  18. 10 年老程序员教你甩锅必杀技,论【如何优雅的甩锅】
  19. ICC Floorplan遇到的坑以及解决方法
  20. APK部署手机上出现闪退现象

热门文章

  1. 2017电大形考 计算机应用基础6,2015-电大形考-计算机应用基础---Windows-7操作系统---客观题(答案)27689...
  2. 论文工具大全+软件简介
  3. cocos creator 2.4.6 加载json文件 初始化游戏 - 初学者
  4. 服务器七雄争霸官方网站,七雄争霸特效城堡半价购买 全新服务器等您来挑战...
  5. 博升机器人_乐博乐博机器人
  6. 七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包...
  7. 华为 watch fit 鸿蒙,华为新款智能手表 Watch Fit 曝光,矩形表盘,支持近 100 种运动模式...
  8. D. Alex and Julian
  9. 关于英伟达jetson nano的搭配双目摄像头跑ORB_SLAM2
  10. 包(package)与模块的导入--from与import