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

相关文章

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

Python MCPInspector调试思路详解

《PythonMCPInspector调试思路详解》:本文主要介绍PythonMCPInspector调试思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录python-MCPInspector调试1-核心知识点2-思路整理1-核心思路2-核心代码3-参考网址

Linux系统调试之ltrace工具使用与调试过程

《Linux系统调试之ltrace工具使用与调试过程》:本文主要介绍Linux系统调试之ltrace工具使用与调试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、ltrace 定义与作用二、ltrace 工作原理1. 劫持进程的 PLT/GOT 表2. 重定

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模