I2S协议和hisi3520调试TLV320AIC3101音频驱动(一)

2023-10-08 14:08

本文主要是介绍I2S协议和hisi3520调试TLV320AIC3101音频驱动(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、I2S引脚介绍
I2S是全双工,即同时接收和发送。重要有三个时钟信号(主时钟MCLK,帧同步时钟左右切换时钟WS,数据时钟BCLK),和一个数据接收SD_RX,一个数据发SD_TX送。可设置主从模式,主控是主模式的话,由主控参数所有用到的时钟,ad芯片即是从模式。主控是从模式的话,由ad芯片外接27mhz晶振,产生时钟。接收和发送可以共用时钟,如果只接一个ad芯片。数据精度可用16/32/24位来表示。
MCLK = 256 * WS
BCLK = WS * 左右通道数 * 位宽 如; 2 * 16 * WS
WS = 1 / 采样频率

在这里插入图片描述
单通道,左右声道,示意图,16/24/位数据
在这里插入图片描述
hisi的多通道示意图,可以接多路输入,ktv可以多个话筒一个意思。不是左右声道的意思,不要搞混了。
在这里插入图片描述
声音是模拟信号,通过ad芯片,对输入的模拟量进行数字化,根据设置的采样频率,抽样采集电压信号,转化为数字信号,最终保存文件,编码,然后解码,由数字信号,转化还原模拟信号,由喇叭播放声音
在这里插入图片描述

一、hisi的音频采集播放原理图
ad就是音频芯片,i2s与hisi主控连接,hisi的采集和输出为ai和ao设备,通过内部的dma,将数据进行保存,不需我们关心。
在这里插入图片描述

二、hisi的I2S文档介绍
在介绍之前,先介绍hisi文档关于音频的说明,多媒体开发文档
在这里插入图片描述
在这里插入图片描述

2、编解码处理器指南介绍
在这里插入图片描述
根据文档,对讲只用一个ad芯片时的引脚设计。ad芯片作为主模式可以外接晶振,供芯片输出时钟,我选择ad芯片作为从模式,hisi就是主模式,提供时钟给ad芯片,输入和输出共用时钟。如下图,WS_TX,BCLK_TX,MCLK是时钟,SD_TX,SD_RX是数据
在这里插入图片描述
三、hisi的I2S引脚和tl芯片引脚介绍**
I2S有四个比较重要的脚
如下原理图,我接的音频芯片是TL3101,主控是海思的3520/3521DV400,hisi的主控,有两个输入,两个输出,文档说明,规定两组混合使用,我使用的是I2S2和I2S1。
I2S2作为发送,提供主时钟MCLK,同步时钟,BCLK,WS,和输出SD_TX。I2S1仅提供接收SD_RX,同步时钟和I2S2共用。和一组I2C用于控制芯片,设置参数。

hisi主控引脚图,注意i2s1的ws,原理图是没用到的。
在这里插入图片描述
音频芯片是TL3101,引脚图如下。
在这里插入图片描述
咪头,是标准的3mm接口,插入耳机,连线如下图。
在这里插入图片描述
在这里插入图片描述

四、驱动调试
1、准备ko驱动文件,根据hisi文档,demo使用的是tl3101芯片,接的也是这款芯片,所以不要从新写驱动,如果其他芯片,就要自己写驱动,调试内核,对于没搞过驱动开发的同志,这是困难,老衲懂驱动和系统,所以简单,直接用hisi的sdk下ko下tl3101下的ko文件,在启动时加在,插断题外话,ko,可以在内核启动时加载,可以在根文件系统挂载后,脚本命令加载或收到加载。
在这里插入图片描述
根据驱动源码,芯片默认是从模式,48k采样率,16位,i2s,这个很重要,下面设置时钟时,就知道设置多少,刚开时调试,就按默认设置
在这里插入图片描述

1、根据多媒体文档调试指南。
在这里插入图片描述
*i2s的时序图如下,WS,是左右声道切换时钟,fs就是采样率,1/fs就是ws但我时钟,bclk就是数据时钟,sd的时钟,bclk = fs * 位宽*通道数,我们是左右声道,选择16位的位宽,所以是 fs * 2 16。那主时钟mclk 就是256 * fs。
在这里插入图片描述

2、根据原理图,先将hisi的引脚,复用为I2S,和i2c。找到hisi的文档Hi3520DV400_PINOUT_CN.xlsx在这里插入图片描述

3、将I2S和I2C_管脚复用,
在load自启动脚本加如下命令。

himm 0x120F00AC 0x2;   #GPIO9_3  I2S1_BCLK_RX  I2S2_MCLK	
himm 0x120F00B8 0x1;   #GPIO9_6  I2S2_BCLK_RX
himm 0x120F00BC 0x1;   #GPIO9_7  I2S2_WS_RX
himm 0x120F00C0 0x1;   #GPIO5_4  I2S2_SD_RX
himm 0x120F00B4 0x1;   #GPIO9_5  I2S1_SD_RXhimm 0x120F00E0 0x1;   #GPIO12_6  I2C_SDA
himm 0x120F00E4 0x1;   #GPIO12_7  I2C_SCL

4、加载驱动,
上面的管脚设置好后,加载ko文件,把hisi默认加载nv6134屏蔽掉,加载音频ko要放在hisi系统system驱动后,否则打开ai,ao失败。

insert_audio()
{insmod tlv_320aic31.koinsmod hi3521d_aio.koinsmod hi3521d_ai.koinsmod hi3521d_ao.koinsmod hi3521d_aenc.koinsmod hi3521d_adec.ko
}remove_audio()
{	rmmod hi3521d_adecrmmod hi3521d_aencrmmod hi3521d_aormmod hi3521d_airmmod hi3521d_aiormmod tlv_320aic31
}

启动系统后,启动时会看到ai,ao,之类的,tl32031驱动加载成功的信息,看看是否有这个设备,ls /dev 可以看到有tlv320aic31这个设备,没有的话,就是驱动未加载成功,i2c有问题或,编译的ko有问题,看调试打印是什么情况,确定是否i2c没有通,还是ko的问题,和i2s没关,这一步,还没到i2s。

4、时钟设置

//rg8
himm 0x13140140 0x003254E7;  #I2S2MCLK 12.288MHZ 
himm 0x13140144 0x00000133;  #I2S2CLK 12.288/4MHZ//rg1
himm 0x13140108 0x003254E7;  #I2S1MCLK 12.288MHZ
himm 0x1314010C 0x00000133;  #I2S1CLK 12.288/4MHZ

在这里插入图片描述

****设置时钟,这里去设置时钟,tl芯片驱动源码,默认是48khz采样率,所以主时钟mclk是256* bck(48k)= 12MHZ,上图hisi文档介绍了,48k采样率时,输出主时钟是12.288mhz。

这里根据实际操作感觉不需,hisi加载ai,ao,驱动时,自动设置了时钟,量了主时钟是12.2mhz。
后面启动应用层demo后,启动ai和ao设备,设置是主模式,48k采样率,后面量时钟,bclk是1.5mhz,wclk是48khz,这里很重要,可以确定我们的管脚设置没有错,应用设置也没有错,否则是不会有数据的,调试驱动时,一定要确保时钟是正确的,用示波器量时钟,再调试应用。****

应用层设置,采集音频,在下章节讲。

这篇关于I2S协议和hisi3520调试TLV320AIC3101音频驱动(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/165800

相关文章

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是