Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
I2S音频接口
nuc980
NK-980IOT测评之I2S接口音频测试
发布于 2022-03-14 20:30:52 浏览:2470
订阅该版
[tocm] # 特征 - 支持I2S和PCM接口,支持8/16/18/20/24bit,两通道。 - 18/20/24-bit模式时,每个通道的数据存储在32bit字中,高位有效,低位补零。 - 16位模式时,右通道存储在32bit字的高16位,左通道存储在低16位。 - 支持DMA一次传输4/8/16拍后总线锁定,传输1/8,1/4,1/2或者传输完成时可以产生中断。16位精度时,一次传输8拍或者4拍;24/20/18位精度时,一次传输16或者8拍。 - 使用AHB端口,I2S支持主从,PCM只支持主。 - 支持双地址  # 配置 - 时钟使能 CLK_HCLKEN[24],写1使能。 时钟源如下:  - 复位模块 SYS_AHBIPRST[8],写1复位,写0结束复位。 - 引脚配置  # I2S接口 I2S主  I2S从  时序 高位对齐,左对齐  # PCM接口  时序  # 数据格式  # 寄存器 以下是简介详见手册: - I2S_GLBCON 设置中断,精度,FIFO阈值,使能I2S或PCM。 - I2S_RESET 设置数据格式,复位控制,录音和播放的通道选择,录音和播放的使能, - I2S_RDESB 记录DMA基地址 - I2S_RDES_LENGTH 记录DMA数据长度 - I2S_RDESC 记录DMA当前地址 - I2S_PDESB 播放DMA基地址 - I2S_PDES_LENGTH 播放DMA数据长度 - I2S_PDESC 播放DMA当前地址 - 记录状态寄存器 I2S_RSR - I2S_PSR 播放状态寄存器 - I2S_CON 设置I2S主从模式,频率设置,时钟选择对齐格式。 - I2S_COUNTER 播放DMA数据计数器 - I2S_PCMCON PCM参数设置 - I2S_PCMS1ST PCM通道1数据位置设置 - I2S_PCMS2ST PCM通道1数据位置设置 - I2S_RDESB2 记录DMA目的地址2 - I2S_PDESB2 播放MDA目的地址2 # 硬件资源    音频芯片型号为NAU8822L,其中I2C接口用于配置(MODE引脚低),I2S接口用于传输数据。 I2S_LRCK接FS,用于区分左右通道数据。 I2S_BCLK接BCLK 数据传输bit时钟。 I2S_DI接ADCOUT 主<-从。 I2S_DO接ADCIN 主->从。 I2S_MCLK接MCLK 主时钟,给设备提供时钟源。 ## IIC接口 写寄存器过程 START->发送0x34->等待ACK->发送寄存器地址->等待ACK->发送字节数据源->等待ACK->STOP  读寄存器过程 START->发送0x34(写)->等待ACK->发送寄存器地址->等待ACK->START ->发送0x35(读)->等待ACK->读数据->发送ACK->读数据->发送NACK->STOP  寄存器详见手册P69 14 Appendix C: Details of Register Operation ## I2S接口  # 驱动 I2C驱动见`\components\drivers\i2c` I2S驱动见`\bsp\nuvoton\libraries\nuc980\rtt_port\drv_i2s.c` 参见https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/audio/audio 主要API ``` rt_err_t res; snd_dev = rt_device_find("sound0"); /* 根据设备名称查找 Audio 设备,获取设备句柄 */ if(RT_NULL == snd_dev) { return; } res = rt_device_open(snd_dev, RT_DEVICE_OFLAG_WRONLY | RT_DEVICE_FLAG_RDONLY); if(RT_EOK != res) { return; } /* 设置播放的采样率、采样通道、以及采样位数 */ struct rt_audio_caps caps; caps.main_type = AUDIO_TYPE_OUTPUT; /* 输出类型(播放设备 )*/ caps.sub_type = AUDIO_DSP_PARAM; /* 设置所有音频参数信息 */ caps.udata.config.samplerate = 44100; /* 采样率 */ caps.udata.config.channels = 2; /* 采样通道 */ caps.udata.config.samplebits = 16; /* 采样位数 */ res = rt_device_control(snd_dev, AUDIO_CTL_CONFIGURE, &caps); /* 设置播放的主音量*/ caps.main_type = AUDIO_TYPE_MIXER; /* 音量管理类型 */ caps.sub_type = AUDIO_MIXER_VOLUME; /* 设置播放的主音量 */ caps.udata.value = 100; /* 范围 0 ~ 100 */ res = rt_device_control(snd_dev, AUDIO_CTL_CONFIGURE, &caps); /* 设置录音的采样率、采样通道、以及采样位数 */ caps.main_type = AUDIO_TYPE_INPUT; /* 输入类型(录音设备 )*/ caps.sub_type = AUDIO_DSP_PARAM; /* 设置所有音频参数信息 */ caps.udata.config.samplerate = 44100; /* 采样率 */ caps.udata.config.channels = 2; /* 采样通道 */ caps.udata.config.samplebits = 16; /* 采样位数 */ res = rt_device_control(snd_dev, AUDIO_CTL_CONFIGURE, &caps); /* 设置录音的主音量 */ caps.main_type = AUDIO_TYPE_MIXER; /* 音量管理类型 */ caps.sub_type = AUDIO_MIXER_MIC; /* 设置录音的主音量 */ caps.udata.value = 100; /* 范围 0 ~ 100 */ rt_device_control(snd_dev, AUDIO_CTL_CONFIGURE, &caps); /* 写数据 */ //rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size); /* 读数据*/ //rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size); /* 关闭设备*/ //rt_err_t rt_device_close(rt_device_t dev); ``` # 测试 ## 播放代码解析 INIT_APP_EXPORT(wavplayer_init); 导出变量__rt_init_wavplayer_init 到.rti_fn.6段,值是wavplayer_init, map文件可以看到  main_thread_entry->rt_components_init->wavplayer_init->wavplayer_entry 等待事件player:PLAYER_EVENT_PLAY MSH_CMD_EXPORT_ALIAS(wav_player, wavplay, play wav music); 注册命令,当SH输入wavplay时调用wav_player,处理。 解析调用wavplayer_xxx接口处理。 比如-s 就START调用的是wavplayer_play发送消息play_msg_send,player。 wavplayer_entry等到事件,调用wavplayer_open, 先查找设备rt_device_find sound0 然后打开设备rt_device_open 最后配置参数rt_device_control 然后读文件fread,发送数据rt_device_write。 rt_hw_nau8822_port->nu_hw_nau8822_init找到I2C设备g_I2cBusDev I2C_WriteNAU8822,I2C_ReadNAU8822实现读写寄存器 NAU8822驱动(只初始化使用,读写直接通过I2S设备驱动) INIT_COMPONENT_EXPORT(rt_hw_nau8822_port); rt_hw_nau8822_port->nu_hw_nau8822_init->nu_acodec_ops_nau8822->nau8822_dsp_control->nau8822_dsp_config rt_hw_i2s_init时绑定了 rt_audio_register(&g_nu_i2s_dev.audio, g_nu_i2s_dev.name, RT_DEVICE_FLAG_RDWR, &g_nu_i2s_dev); audio设备。 ## Demo `\bsp\nuvoton\nk-980iot\packages\wavplayer-latest\src`下有wavplayer的demo。 输入wavrecord -s test.wav 8000 2 16 录音到test.wav文件,采样率8000,双通道,16bit。 wavrecord -t 停止录音 wavplay -s test.wav开始播放 wavplay -t 停止播放 ``` msh />wavrecord -s test.wav 8000 2 16 I2S stop recording [I/i2s] Stop record. [I/i2s] Close I2S. Wrote addr 00 -> 0x0000, read back -> 0x0000 msh />[I/acodec.nau8822] Software Reset. Wrote addr 01 -> 0x003f, read back -> 0x003f Wrote addr 02 -> 0x01bf, read back -> 0x01bf Wrote addr 03 -> 0x007f, read back -> 0x006f Wrote addr 04 -> 0x0010, read back -> 0x0010 Wrote addr 05 -> 0x0000, read back -> 0x0000 Wrote addr 06 -> 0x01ad, read back -> 0x01ad Wrote addr 07 -> 0x0006, read back -> 0x0006 Wrote addr 0a -> 0x0008, read back -> 0x0008 Wrote addr 0e -> 0x0108, read back -> 0x0108 Wrote addr 0f -> 0x01ef, read back -> 0x00ef Wrote addr 10 -> 0x01ef, read back -> 0x00ef Wrote addr 2c -> 0x0033, read back -> 0x0033 Wrote addr 2f -> 0x0100, read back -> 0x0100 Wrote addr 30 -> 0x0100, read back -> 0x0100 Wrote addr 32 -> 0x0001, read back -> 0x0001 Wrote addr 33 -> 0x0001, read back -> 0x0001 Wrote addr 34 -> 0x013f, read back -> 0x003f Wrote addr 35 -> 0x013f, read back -> 0x003f [I/acodec.nau8822] Initialized done. Wrote addr 24 -> 0x0008, read back -> 0x0008 Wrote addr 25 -> 0x000c, read back -> 0x000c Wrote addr 26 -> 0x0093, read back -> 0x0093 Wrote addr 27 -> 0x00e9, read back -> 0x00e9 Wrote addr 04 -> 0x0010, read back -> 0x0010 Wrote addr 06 -> 0x01ed, read back -> 0x01ed [I/i2s] Open I2S. Wrote addr 0a -> 0x0800, read back -> 0x0008 IIS start recording... [I/i2s] Start record. Information: samplerate 8000 channels 2 msh />wavrecord -t I2S stop recording [I/i2s] Stop record. [I/i2s] Close I2S. msh />wavplay -s test.wav Wrote addr 0b -> 0x008c, read back -> 0x00ff Wrote addr 0c -> 0x008c, read back -> 0x00ff [I/WAV_PLAYER] play start, uri=test.wav IIS stop playing [I/i2s] Stop replay. [I/i2s] Close I2S. Wrote addr 00 -> 0x0000, read back -> 0x0000 msh />[I/acodec.nau8822] Software Reset. Wrote addr 01 -> 0x003f, read back -> 0x003f Wrote addr 02 -> 0x01bf, read back -> 0x01bf Wrote addr 03 -> 0x007f, read back -> 0x006f Wrote addr 04 -> 0x0010, read back -> 0x0010 Wrote addr 05 -> 0x0000, read back -> 0x0000 Wrote addr 06 -> 0x01ad, read back -> 0x01ad Wrote addr 07 -> 0x0006, read back -> 0x0006 Wrote addr 0a -> 0x0008, read back -> 0x0008 Wrote addr 0e -> 0x0108, read back -> 0x0108 Wrote addr 0f -> 0x01ef, read back -> 0x00ef Wrote addr 10 -> 0x01ef, read back -> 0x00ef Wrote addr 2c -> 0x0033, read back -> 0x0033 Wrote addr 2f -> 0x0100, read back -> 0x0100 Wrote addr 30 -> 0x0100, read back -> 0x0100 Wrote addr 32 -> 0x0001, read back -> 0x0001 Wrote addr 33 -> 0x0001, read back -> 0x0001 Wrote addr 34 -> 0x013f, read back -> 0x003f Wrote addr 35 -> 0x013f, read back -> 0x003f [I/acodec.nau8822] Initialized done. Wrote addr 24 -> 0x0008, read back -> 0x0008 Wrote addr 25 -> 0x000c, read back -> 0x000c Wrote addr 26 -> 0x0093, read back -> 0x0093 Wrote addr 27 -> 0x00e9, read back -> 0x00e9 Wrote addr 04 -> 0x0010, read back -> 0x0010 Wrote addr 06 -> 0x01ed, read back -> 0x01ed [I/i2s] Open I2S. Wrote addr 0a -> 0x0800, read back -> 0x0008 IIS start playing... [I/i2s] Start replay. IIS stop playing [I/i2s] Stop replay. [I/i2s] Close I2S. [I/WAV_PLAYER] play end msh />wavplay -t msh /> ``` 输入sy test.wav回车 CRT,【传输】-【接收Ymodem】到处文件到电脑。 如果没有sy,则添加`\rt-thread\components\utilities\ymodem`下的源码  见附件: [test.wav](https://oss-club.rt-thread.org/uploads/20220314/8c821b148e87aa7bfe6aec004404da27.wav)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
I2S WM8978 DMA没中断问题,参考SAI驱动改写
2
rtthread 中没有stm32的i2s(不是sai)的驱动?
3
rt-thread 官方可以对stm32系列添加i2s的驱动么?
4
求参考I2S 驱动与音频例程
5
咨询大家一个问题,单纯的I2S能调节音量吗?
6
STM32F407ZGT6音频I2S对接audio框架
7
STM32F407+PCM5102APWR+SD卡内播放wav或mp3音乐如何实现?
8
how to send i2s data from rk2108?
9
I2S WM8978 播放速度慢,有哒哒哒的噪声求助
10
求助:STM32如何移植Audio框架?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
6
五分钟玩转RT-Thread新社区
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
Bootloader
AT
Hardfault
CAN总线
ART-Pi
FinSH
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
UART
cubemx
BSP
ESP8266
PWM
ota在线升级
WIZnet_W5500
packages_软件包
flash
freemodbus
GD32
潘多拉开发板_Pandora
ADC
编译报错
keil_MDK
定时器
flashDB
rt_mq_消息队列_msg_queue
ulog
socket
msh
中断
Debug
SFUD
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
加缪
11
个答案
1
次被采纳
三世执戟
6
个答案
1
次被采纳
RTT_逍遥
5
个答案
1
次被采纳
用户名由3_15位
5
个答案
1
次被采纳
本月文章贡献
chejia12
9
篇文章
3
次点赞
纯白酱
2
篇文章
4
次点赞
Hlafklio
2
篇文章
1
次点赞
530china
1
篇文章
7
次点赞
rv666
1
篇文章
7
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部