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.