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

相关文章

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备