Linux codec-npcp215x调试详解

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.

猜你喜欢

转载自blog.csdn.net/weixin_41965270/article/details/81272747