当前位置: 首页 > news >正文

我和老刘又被搞惨了

前两天在调试PHY的时候遇到了一堆问题,老刘都不耐其烦的搞定了,这次我们开始调试音频部分,音频部分很简单,无非就是录音,要是能把录音的音频拿到了,那就万事大吉了。老刘也是信心满满,老刘对我说,发哥,我对这个芯片特别熟悉,你要是搞不定的话,可以把驱动代码给我看看,我来帮你调试。

然后我们就开始调试了

也很快,我们就遇到了问题了,使用录音命令录音一会就崩了,是的,崩了。

我跟老刘说,我这边程序崩了,什么音频数据都录不到。

老刘跟我说,没事发哥,只要我们的波形正确了,我有办法帮你搞定录音的。

然后我和老刘就开始测量波形,我们遇到的第一个问题是,我们配置的Mclk是12.288M,但是呢,测量出来的波形是50M。

你看得没错,我也从来没有看到过50M的波形,这部分肯定是CPU的问题了,CPU当然是没有问题了,所以就是我的问题了。

我用命令查看了下时钟的配置,也确实不是12.288M

884b04a903af4aa51b0200f18c0a9fb9.png

这个地方我就折腾了一段时间,刚开始是猜测我的ADC是不是没有配置正确,如果CPU配置成了master模式,ADC又配置成了master模式,那就有冲突了不是,所以这个部分我又检查了一会。

后面我看到这个时钟的配置是开始录音的时候去使能的,然后我每次测试的时候就会先去录音后,再测量波形。

然后还是没啥进展。

在这个没有进展的过程中,我们曾经有一次测量到了正确的波形,也就是16k的LRCLK和3.072M的BCLK,但是在软件没有修改的情况下,我们重新上电后,那些之前看到的美好景象都没有了。

然后,没有其他思路的情况下,我只好软件分析分析了。

使用下面的命令开始录音。

arecord -f S16_LE -c 4 -r 16000 -v -Vmono -D hw:2 /tmp/4ch.wav

命令执行了一会就崩了。

b70084e609c98c9e908dd1b214a08605.png

然后我开始查声卡的信息

9b72ad39a250be998224438142256d20.png

声卡的每个pcm都有两个核心的部分,一个是codec dai,一个是cpu dai,他们之间的配置要一致才可能让音频正确拾取。

我们codec 部分用的是dsp_a的IIS格式,但是我反复检查了CPU部分,cpu部分我们也已经配置成了dsp_a的格式。

dsp_a的LRCK波形如下:

c3e636796142af3bd8ff7a7ad416ac11.jpeg

老刘检查了两遍,硬件没有问题,时钟也都是正常的。

然后我使用下面的命令追踪了下arecord的调用流程

/ # strace arecord -f S16_LE -c 4 -r 16000 -v -Vmono -D hw:2 /tmp/4ch.wav
....
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_PARAMS, 0x7fc8656820) = 0
ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0xf2167e0) = 0
ioctl(4, SNDRV_PCM_IOCTL_SW_PARAMS, 0x7fc86566d0) = 0
ioctl(4, SNDRV_PCM_IOCTL_PREPARE, 0x8)  = 0
ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0xf2167e0) = 0
ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0xf2167e0) = 0
openat(AT_FDCWD, "/dev/snd/controlC2", O_RDWR|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
ioctl(3, SNDRV_CTL_IOCTL_PVERSION, 0x7fc865653c) = 0
ioctl(3, SNDRV_CTL_IOCTL_CARD_INFO, 0x7fc86565b0) = 0
close(3)                                = 0
.....
newfstatat(AT_FDCWD, "/tmp/4ch.wav", {st_mode=S_IFREG|0644, st_size=44, ...}, AT_SYMLINK_NOFOLLOW) = 0
unlinkat(AT_FDCWD, "/tmp/4ch.wav", 0)   = 0
openat(AT_FDCWD, "/tmp/4ch.wav", O_WRONLY|O_CREAT, 0644) = 3
write(3, "RIFF$\0\0\200WAVE", 12)       = 12
write(3, "fmt \20\0\0\0", 8)            = 8
write(3, "\1\0\4\0\200>\0\0\0\364\1\0\10\0\20\0", 16) = 16
write(3, "data\0\0\0\200", 8)           = 8
ioctl(4, SNDRV_PCM_IOCTL_READI_FRAMES, 0x7fc8656b40) = -1 EIO (Input/output error)
write(2, "arecord: pcm_read:2143: ", 24arecord: pcm_read:2143: ) = 24
write(2, "read error: Input/output error", 30read error: Input/output error) = 30
write(2, "\n", 1
)                       = 1
ioctl(4, SNDRV_PCM_IOCTL_DROP, 0x8)     = 0
ioctl(4, SNDRV_PCM_IOCTL_HW_FREE, 0x8)  = 0
close(4)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++
/ #

看到调用里面有一个音频的读取相关的ioctl。

c文件里面的函数调用关系是这样的

snd_pcm_capture_ioctl1
->snd_pcm_lib_read
-->snd_pcm_lib_read1

最后的函数会检查子流的状态。如果子流不处于可读取音频数据的状态(如准备、运行、暂停),则直接返回错误。

我这里不能读取到音频就是因为没有可读取的音频,所以就返回错误了,也就是说CPU看到的SDIO线上没有数据。

那问题就来了,示波器测量到的I2S数据线上已经看到数据了,但是为什么读取出来还是不行?

那不就是见了鬼了吗?

我跟老刘说,我这边已经没有办法了,已经把能检查的地方检查过了一遍,然后我让老刘给原理图,我想再检查一下。

我看了下原理图,其中有一个地方很奇怪,就是有一个GPIO口标注了两个名字,我就跟老刘说,这个GPIO口怎么又两个名字呢?

老刘跟我说,这个是一个比较牛逼的设计,因为我可以通过飞跳电阻的方式把这两个引脚飞到另外两个引脚,是硬件上面的预留设计。

我质疑了下老刘,我说这个地方会不会有问题呢?

老刘说,不会的,我已经检查了,波形也都出来了,说明这个地方是没有问题的。

老刘说,我想看看你的ADC程序,会不会程序上有什么可以配置的,我到你电脑上看看代码。

然后就是老刘看代码的时间,看了一会老刘给我指出一个宏,他说这个宏是不是可能配置成1,然后就是我给老刘解释代码的时间。

过了挺久时间。

大概是晚上10点40左右了,因为9点后这栋楼的空调会被物业统一关闭,实验室里面有点闷,老刘把我前面的窗户打开了,从外面吹进来一阵阵的热风把脑子吹得有些膨胀,这个时候我已经干掉了5瓶怡宝了。

我跟老刘说,你们有没有硬件配置跟这个差不多的,拿过来给我验证一把呢?

老刘说有的,然后就给我拿了一个硬件,我把我的固件烧录进去,神奇的事情是,录音程序没有崩。

7b47ec860392c5be9d017fe0dd1cd422.png

我又跟老刘说,这个板子跑我的程序没有问题的。

老刘让我断电拿起板子去量了下,说了句,卧槽,这个地方短路了。

下面就是老刘的表演时间了,因为之前的GPIO反了的原因,这次的捣鼓也特别不容易。

这个时候是晚上11点20左右。

然后,就用刚才那个程序,录到声音了,我们用了一个linein给ADC输入了音频,也能从示波器上看到了音频波形。

真的是惊险万分,惊喜万分。

这个时候我跟老刘说,收工吧,明天再继续调试其他部分,老刘也是神情舒畅,心满意得,毕竟在硬件工程师这个职业中,老刘的技术威望那是不允许有过夜的问题存在的。

哦对了,今天有同学问,搞定寄存器计划的浮力还有吗?

我说,那必要还有,具体看下面这个链接

跟韦东山老师搞事

cc36b01601d48d75bf159ec72f86fc55.jpeg

相关文章:

我和老刘又被搞惨了

前两天在调试PHY的时候遇到了一堆问题,老刘都不耐其烦的搞定了,这次我们开始调试音频部分,音频部分很简单,无非就是录音,要是能把录音的音频拿到了,那就万事大吉了。老刘也是信心满满,老刘对我说…...

DDD--基本概念

最近项目组一直在推DDD领域驱动设计,现就一些个人理解分享如下。 DDD(领域驱动设计)是一种软件开发方法论,旨在解决复杂业务场景下的软件设计与开发问题。以下是DDD的基本概念: 领域(Domain)&…...

chatgpt赋能python:Python多行注释

Python 多行注释 在 Python 中,我们经常需要写注释来解释代码或者用于调试。Python 的注释分为单行注释和多行注释,本文主要介绍 Python 中如何多行注释。 单行注释 在 Python 中,单行注释以符号 # 开头,可以写在代码的任何位置…...

JSP详细基础教学

目录 前言 环境设置 创建JSP文件 编写基本的JSP代码 部署和运行JSP页面 基础语法 前言 JSP(JavaServer Pages)是一种用于开发动态网页的Java技术。它允许将Java代码嵌入HTML页面中,以便在服务器端生成动态内容。在本次教程中&#xff…...

mysql修改登录用户的密码

文章目录 mysql5.7即mysql7.0 的修改方式mysql5.8即mysql8.0的修改方式如果修改完密码,发现旧密码和新密码都登录不进来怎么办?发现设置密码老报错 mysql5.7即mysql7.0 的修改方式 1.如果是使用docker里装的mysql 首先使用 [rootlocalhost /]# docker p…...

SNAT和DNAT

SNAT和DNAT 一、SNAT的策略及应用: 1.SNAT: (1)定义:又称源地址转换。源地址转换是内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址(可指定具体的服务以及相应的端口或端口范围&…...

好程序员:月薪2万程序员的简历,原来长这个样子!

6月份现在正是招聘季节,不少同学java岗位投递不少,但回复不多,根本原因可能是java面试简历不够吸引人。 你的java简历不会写?看看别人就知道咋写了,这里给大家拆解一份好程序员月薪2万的java简历。 java自我评价模块&a…...

STM32之FreeRTOS

目录 FreeRTOS 介绍 什么是 FreeRTOS ? 为什么选择 FreeRTOS ? FreeRTOS 资料与源码下载 祼机开发与 FreeRTOS 祼机开发: FreeRTOS: FreeRTOS 实现多任务的原理 二、移植 FreeRTOS 手动移植 使用CubeMX快速移植 快速移植流程…...

有趣的图(二)(56)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 咱们书接上回,上次学了图的基本概念,你都学会了吗? 咱们今天要学习内容如下&a…...

Linux之环境变量

目录 Linux之环境变量 分类 环境变量 定义 设置环境变量 设置环境变量(永久) 用户环境变量配置所在文件: 全局环境变量配置所在文件: 显示与取消环境变量 通过echo或printf打印环境变量 通过env或set显示默认的环境变量 用 …...

python带你制作自动点赞小程序,让我看看谁还在呆呆的手动点赞

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 知识点: 动态数据抓包 requests发送请求 开发环境: 代码所使用软件工具: python 3.8 >>>>>> 运行代码 pycharm 2022.3 >>>>>> 辅助敲代码 需下载的第三方模块&a…...

shell脚本编写辅助命令

目录 一、echo 命令 二、字符串相关操作 1.截取字符串 2.获取字符串长度 3.字符串追加字符 4.从开头或结尾删除字符串指定格式内容 三、随机数 1.使用 $RANDOM 2.指定RANDOM变量的范围 (1)从0开始的范围 (2)从指定数始…...

高并发编程:线程池

一、概述 线程池首先有几个接口先了解第一个是Executor,第二个是ExecutorService,在后面才是线程池的一个使用ThreadPoolExecutor。 二、Executor Executor看它的名字也能理解,执行者,所以他有一个方法叫执行,那么执…...

微信小程序开发uni-app-8分钟上手开发

本篇文章uni-app微信小程序开发-8分钟上手开发 -首先到微信小程序官网登录/注册微信小程序 微信小程序官网 uni-app 微信小程序 注册微信小程序 这里要注意: 激活邮箱之后,选择主体类型为 “个人类型”,并按要求登记主体信息。主体信息提…...

【C++11】 initializer_list | 右值引用 | 移动构造 | 完美转发

文章目录 1. 统一的列表初始化{ } 初始化initializer_list 2. 引用左值引用右值引用左值引用与右值引用的相互转换右值引用的真正使用场景移动构造 C98与C11传值返回问题注意事项总结 3. 完美转发 1. 统一的列表初始化 { } 初始化 C11 扩大了括号括起的列表(初始化列表)的使用…...

基于html+css的图展示122

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...

《Unix环境高级编程》/bin/sh: ./fixup.awk: Permission denied

我的代码是从http://www.apuebook.com/code3e.html下载的,先是在 使用cat /etc/redhat-release看到操作系统是CentOS Linux 7.6,使用uname -r看到内核是3.10.0-957.el7.x86_64。 在代码顶级目录下,执行make。 发现报错: ./fi…...

万字长文+示例代码详解DDD中常用的架构(含代码示例)

目录 分层架构(Layered Architecture) 概念 示例代码 总结 领域驱动设计的六边形架构(Hexagonal Architecture) 概念 示例代码 总结 CQRS(Command Query Responsibility Segregation) 概念 示例…...

Debezium UI On ECS编译安装及开放Web访问

1. 访问debezium-ui的代码仓库,下载源码 GitHub - debezium/debezium-ui: A web UI for Debezium; Please log issues at https://issues.redhat.com/browse/DBZ. 2. 解压zip源码包: TEST[hadoopshdcvfsla1894 ~]$ cd /data/module TEST[hadoopshd…...

【支付系统】核心支付流程

支付在产品中常见的用处为购买和充值.这两种功能操作大相径庭,其中购买相对充值多了很多步骤,它需要锁商品或者库存,还需要超时未支付取消订单等操作.在这篇文章中主要探讨支付部分,属于购买和充值公共部分. 下面是绘制的简易支付时序图 以上时序图并非完整,其实核心步骤就是, …...

电脑系统可以直接备份到其它硬盘上吗

在日常使用电脑的过程中,我们都希望能够保护好重要的系统数据,以防止意外数据丢失或系统崩溃。那么,能否将电脑系统直接备份到其他硬盘上呢?本文将为您解答这个问题,并探讨备份系统的方法和注意事项。 工具/原料&…...

springboot项目如何优雅停机

文章目录 前言kill -9 pid的危害如何优雅的停机理论步骤优雅方式1、kill -15 pid 命令停机2、ApplicationContext close停机3、actuator shutdown 停机4、ApplicationListener 监听延时停机 前言 相信很多同学都会用Kill -9 PID来杀死进程,如果用在我们微服务项目里…...

springboot mybatis-plus 代码生成工具

介绍 基于mybatis-plus代码生成工具 后续会不断完善 规划 后续会基于此功能搞低代码平台,会有前端VUE mybatis-plus介绍&特性 • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 • 损耗小&#xff1…...

超全、超详细的Redis学习笔记总结

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…...

Day05 04-MySQL分库分表介绍

文章目录 第十七章 MySQL分库分表17.1 什么是分库分表17.2 为什么要分库分表17.3 垂直切分17.3.1 垂直分库17.3.2 垂直分表 17.4 水平切分17.4.1 水平分库17.4.2 水平分表17.4.3 常见的水平切分规则 第十七章 MySQL分库分表 17.1 什么是分库分表 MySQL数据库常见的优化方案中…...

基于SpringBoot+vue的毕业生信息招聘平台设计和实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…...

git一定要学会,加油

gitgit文档http://file:///F:/%E8%B5%84%E6%96%99%E5%A4%8D%E4%B9%A0/Git%E4%BC%98%E7%A7%80%E5%BC%80%E6%BA%90%E4%B9%A6%E7%B1%8D/Git%E5%BC%80%E6%BA%90%E4%B9%A6%E7%B1%8D/Pro%20Git%E4%B8%AD%E6%96%87PDF%E7%89%88.pdf init 初始化仓库 这个命令在当前目录下初始化一个 G…...

TVM面试题

1、TVM中的调度器(Scheduler)是什么?请简要解释TVM调度器的作用和工作原理。 TVM中的调度器(Scheduler)是负责将计算图映射到特定硬件目标上的组件。调度器在TVM中起着关键的作用,它决定了计算图的执行方式、并行化策略以及内存布局等,以优化…...

CSS相关面试题

1、标准盒子模型和IE怪异盒子模型? 标准盒子模型就是指的元素的宽度和高度仅包括的内容区域,不包括边框和内边距,也就是说,元素的实际宽度和高度等于内容区域的宽度和高度IE怪异盒子是指元素的高度和宽度,包括内容区域…...

6.11总结

这周准备了蓝桥杯,主要看了一些以前学过的东西,看了二分,树状数组,树状数组二分,复习了利用倍增相关的算法。 周六去打的蓝桥杯,总体来说也就一般吧,出了考场突然想起来我b题中间的称号写成了加…...