DSP

Linux codec-npcp215x调试详解

2019-07-13 18:28发布

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.