Linux codec-npcp215x调试详解_CNccion的博客-程序员宅基地

技术标签: Linux Alsa driver  npcp215  linux  i2ctools  i2c  codec调试  

1.介绍

      本章主要介绍arm的外设codec的调试方法,和调试步骤。在本章中,笔者主要以新唐的codec--npcp215x为例来讲解。其他类型的codec,也可以仿照本章的调试步骤来。

2.npcp215x的介绍

特点:

  • 提高低性能扬声器的音频质量
  • System-level BOM
  • 立体声和sub-woofer
  • i2c控制
  • 24bit精确度
  • 音频算法:1.MaxxBASS 2.Maxx3D 3.MaxxTreble 4.MaxxEq 5.MaxxVolume 6.MaxxLeveler 7.MaxxDialog
  • 音频输入:i2s接口,SSI接口
  • 音频输出:i2s输出,SSI输出。D类功耗2x20W.

重要管脚介绍:

  • XTALI/CLKIN  (12.288Mhz, 11.2896Mhz)
  • nReset              (低电平有效)
  • nMute                (低电平mute,不用可以悬空)
  • DCLK                (做master.slaveCLK=32 or 64 FS.master mode,需要33ohm-100ohm的串联电阻)
  • SYNC(LRCLK) (FS,master mode:需要33ohm-100ohm的串联电阻)
  • REF                   (悬空,内部电阻选择DCLK in,外部电阻8.2kohz下拉,选择外部晶振)
  • GP018/I2CMS  (悬空,内部电阻选择slave,外部电阻8.2kohz下拉,选择master)

3.具体应用

        笔者这里的npcp215的应用主要为:npcp215做slave,A113x做master,以DCLK为主要时钟.不用外加晶振。即相关外围电路为:

REF悬空,I2CMS悬空。当然你也可以用适合自己的配置。在这里nuvoton提供了一款UI用来调试和生成相关配置。

3.1codec的几种模式配置-npcp215

Mode1:做master,外部晶振Mclk=11.2896Mhz || 12Mhz || 12.288Mhz .GPIO18/I2CMS =0 ,REF=0.

Mode2:做slave,外部晶振Mclk=11.2896Mhz || 12Mhz || 12.288Mhz.GPIO18/I2CMS =1,REF =0.

Mode3:做slave,外部DCLK=3.072Mhz,GPIO18/I2CMS=0,REF=0.

3.2上层软件介绍-MaxxDSP

  MaxxDSP是新唐为了调试codec出的一款在线调试工具。这里不做详细介绍,只介绍怎么用。具体请自行百度。笔者这里以Mode3为例来介绍用法。以下是我这边的一种硬件接法图。

硬件框图:

  说明:上图中,待调试的npcp215的时钟全部采用外部(a113x)提供。当然也可以通过USB转I2S和i2c的转接口来提供,PC端通过i2c来配置和在线调试npcp215x。

3.3MaxxDSP界面如下

3.4以下是笔者硬件配置【(GPIO18/I2CMS=0,REF=0) DCLK=3.072Mhz(由主a113x来提供,注意在初始化时,Dclk一定得存在)】,当完成以上操作后,点击 DSP connect后,相应的界面是:

打开相关界面,你可以在上一个界面在线调试,比如codec的型号不同,所打开的音频通道不一致,还有比如可以在线调试codec支持的音频音效等等。通过点击上图的红框部分,你可以生成你自己需要的配置文件。

4.i2c tools的应用。

  i2ctools工具,是为调试i2c器件推出的一款软件,相关源码包下载地址:http://packages.debian.org/search?keywords=i2c-tools

以下是笔者在a113x对i2ctools的应用调试:

4.1查看i2c总线的bus和设备地址/sys/bus/i2c/device.

# ls /sys/bus//i2c/devices/
0-0073  1-003c  i2c-0   i2c-1

可以看到,笔者用到了2组i2c设备,i2c0,i2c1其中,i2c0上面的设备地址为0x73,i2c1上面的设备地址为0x3c.

4.2用i2cdetect -l列举i2c bus上面的所有的设备

# i2cdetect -l
i2c-1   i2c             Meson I2C adapter                       I2C adapter
i2c-0   i2c             Meson I2C adapter                       I2C adapter

4.3用i2cdetect -y -r 设备号列举某路i2c设备上面的挂载设备:

# i2cdetect  -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

笔者的i2c1上面挂载了一台设备,其中UU就表示设备。

4.3用i2cdump 查看设备的内容。

# i2cdump -f -y 0 0x73
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

4.4用i2cset和i2cget设置和获取设备的内容

# i2cget -f -y 0 0x73 0x00
0x00

 

# i2cset -f -y 0 0x73 0x00 0x01

5.硬件方式调试,以上的步骤中都可以加上示波器查看相关是否有ACK.

5.1、从spec下摘取一段:

5.2、翻译:

        每个字节后会跟随一个ACK信号。ACK bit使得接收者通知发送者已经成功接收数据并准备接收下一个数据。所有的时钟脉冲包括ACK信号对应的时钟脉冲都是由master产生的。

        ACK信号:发送者在ACK时钟脉冲期间释放SDA线,接收者可以将SDA拉低并在时钟信号为高时保持低电平。

        NACK信号:当在第9个时钟脉冲的时候SDA线保持高电平,就被定义为NACK信号。Master要么产生STOP条件来放弃这次传输,或者重复START条件来发起一个新的开始。

5.1实例

可以看到如下波形,Master发送11100110(0xe6,note:在arm中,读写方向都是用寄存器的单独一位来确定的,有一个7位的域来保存设备地址,所以i2c设备在arm i2c总线上的地址为0xe6右移一位,即得到刚才的0x73)

有ack回应的:第9个时钟脉冲的SDA为低电平

没有ACK回应的:第9个时钟脉冲的SDA为高电平

6.最后--失败的经历分享

  在笔者遇到的codec调试中,遇到过以上所有步骤都可以产生ACK,但是在通过内核系统的启动中,发现codec的配置就是失败的-即没有NACK。其原因是,在初始化codec时,cpu的mclk还没有产生,具体原因是笔者的这款cpu特殊,只有在成功建立card后,cpu才能产生mclk.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41965270/article/details/81272747

智能推荐

URL 路径长度限制(错误:指定的文件或文件夹名称太长)_weixin_33730836的博客-程序员宅基地

本节讨论 URL 的构成、SharePoint 2010 构建 URL 的方式、URL 的编码和加长以及作为其他 URL 中的参数传递的方式。 SharePoint URL 的构成 SharePoint URL 的总长度等于文件夹或文件路径的长度,包括协议和服务器名称和文件夹或文件名称,以及作为 URL 的一部分包含在内的任何参数。公式如下: · URL = 协议 + 服务器名称 + 文件夹...

并查集(Disjoint Set)_AC_Dragon的博客-程序员宅基地

查找函数1:T(n)=O(1)find1(x){ return Set[x];}合并函数1:T(n)=O(n)merge1(a,b){ i=min(a,b); j=max(a,b); for(k=1;k<=N;k++) { if(Set[k] == j) Set[k] = i; } }查找函数2:最坏情况:T(n)=O(n);find2(x){ r=x; while(Set[r]!=r) r=Set[r]; return

python自动化部署hadoop集群_Docker创建的集群下使用ansible部署hadoop_weixin_39983993的博客-程序员宅基地

Docker创建的集群下使用ansible部署hadoop基础环境MBP, Palallels Desktop, Centos7关键词docker, ansible, hadoop集群架构集群包含4台“虚拟主机”,采用Docker创建容器的方式创建,无需创建多台虚拟机,简单方便。OShostnameIPCentos7cluster-master172.18.0.2Centos7cluster-sl...

【技术史】数据中台的前世今生_阿里云云栖号的博客-程序员宅基地_数据中台前世今生

数据中台自14年至今,已然成为了2B、2G业务最热门的话题,政府机构、企事业单位、互联网公司等进行着数字化、数据化、智能化转型。市场普遍认为,阿里巴巴将自身数据中台建设能力对外赋能是拉起本轮数据中台浪潮的根本所在。本文将带你全面了解阿里巴巴做数据中台的历史。1、缘起在2014年以前,阿里巴巴有很多条业务线,都有自己的ETL团队,每个ETL团队建设和维护自己的数据体系。当时许多人认为,这种自下而上的自给自足能够最高效地满足业务需求。也因此,各个ETL团队之间缺乏相互信任,也缺乏最大化互通的可能性。

vscode - 安装离线插件_weixin_30555515的博客-程序员宅基地

打开网站(示例):https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow下载扩展vscode 安装离线扩展注意看进度条进度转载于:https://www.cnblogs.com/cisum/p/9382457.html...

20210226计算机科学速成课40集(31-33)_foundliving的博客-程序员宅基地

计算机安全Cybersecurity:计算机安全的范围和计算能力的发展速度一样快,我们可以把计算机安全,看成是保护系统和数据的:保密性、完整性和可用性。(1)保密性Secrecy/Confidentiality,是只有有权限的人才能读取计算机系统和数据。(2)完整性Intergrity,是只有有限权限的人才能使用和修改系统和数据。(3)可用性Avalibaility,是有权限的人应该随时可以访问系统和数据。拒绝服务攻击Denial of Service Attacks(DDOS)就是黑客发送大量假请求到服.

随便推点

iOS高效开发 —— 管理第三方框架工具 CocoaPods使用_极客James的博客-程序员宅基地

当你开发iOS应用时,会经常使用到很多第三方开源类库,比如MJExtension,AFNetWorking, MJRefresh等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况。手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦。如果能有什么工具能

SpringMVC返回json格式数据出现关于“No converter found for return value of type: class xxx”的解决方法_mojiejieYXM的博客-程序员宅基地

SpringMVC返回json格式数据出现关于“No converter found for return value of type: class xxx”的解决方法今天搭建了Spring+SringMVC+mybatis后台框架写课设,写了一个请求响应的消息类,想让后端返回该类的json格式数据,在使用中出现错误:之后上网搜了发现是因为要处理json对象的类,数据必须要有相关的get和set方法(粗心)因为这个消息类是我从一个Springboot项目里直接拿来,当时是在Springboot项目使

块设备驱动之——block_device、gendisk以及hd_struct之间的关系(一)_lucky tiger的博客-程序员宅基地_block_device gendisk

1、block_device、gendisk以及hd_struct之间的关系2、对于块设备上已经打开的每个分区,都对应一个block_device的实例。对应于分区的block_device示例通过bd_contains关联到对应于整个块设备的block_device示例。所用的block_device通过bd_disk,指向其对应的通用磁盘数据结构gendisk,这里切记对于一个块设备,多个分区但是只有一个gendisk实例。gendisk实例中part成员指向hd_struct指针的

7z文件格式及其源码的分析_weixin_30750335的博客-程序员宅基地

本文是一个系列. 主要是分享我最近一年做7z文件开发的经验. 主要包括7z官方源码的结构分析, 以及7z文件格式的分析. 其中涉及到7z源码结构的各个细节, 以及7z文件格式的具体细节. 本文适合对象: 想要了解学习7z源码的开发人员, 想要了解7z文件格式细节, 做7z文件压缩器和解压器的开发人员, 以及其他压缩文件爱好者等等. 目前7z的最新稳定版是9.20, 而9....

java反编译工具_fantasticcooked的博客-程序员宅基地

https://gitee.com/javen205/weixin_guide/tree/master/https://gitee.com/javen205/weixin_guide/tree/master/https://gitee.com/javen205/weixin_guide/tree/master/https://gitee.com/javen205/weixin_guide/tree...

Splitting a DMA Buffer(MSDN翻译)_小小Paul的博客-程序员宅基地

Splitting a DMA Buffer分割点被VMM用来将KMD提交的大型操作项分割成更小的操作项,使需要执行的GPU资源变少。例如,大的DMA buffer会引用一系列Allocation,而本地显存或共享内存无法满足需求。只有将该操作项分成多个更小的操作项,以降低对GPU资源的需求。Note DMA buffer分割 和 DMA Buffer抢占使两个独立的不同概念。KMD必...