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

RP2040下的I2S Slave Out,PIO状态机(四)

        晚上回家后,进行硬件的实际调试,测试的时候我发现一个问题,输出有点不对劲,BCK和LRCK都是正确的,我用192k的fs,16bit的位深,按道理,发送数据的pin上的信号频率应该是介于BCK和LRCK之间的,但是DOUT的频率示波器测试大概是2K多一点,BCK是6.144Mhz,LRCK是192K,这个数据明显不对。我检查了线路,没有明显的缺陷,我想大概率问题还是在代码上。我又仔细检查了代码。我发现一个问题,DMA的双缓冲区是INT32类型的,而我需要发送的是16位数据。在初始化状态机的代码里面我发现这样的信息:

static inline void i2s_out_slave_init( PIO pio, uint sm, uint offset, uint dout_pin, uint bit_depth) 
{// 自动推导连续时钟引脚(硬件设计常见布局)uint bck_pin  = dout_pin + 1;   // BCK 紧邻 DOUTuint lrck_pin = dout_pin + 2;  // LRCK 紧邻 BCK// 初始化所有引脚功能pio_gpio_init(pio, dout_pin);  // DOUTpio_gpio_init(pio, bck_pin);    // BCK(输入)pio_gpio_init(pio, lrck_pin);   // LRCK(输入)// 核心配置(与标准实现一致)pio_sm_config c = i2s_slave_out_program_get_default_config(offset);sm_config_set_out_pins(&c, dout_pin, 1);          // DOUT 绑定sm_config_set_in_pins(&c, bck_pin);               // BCK 为时钟源sm_config_set_jmp_pin(&c, lrck_pin);              // LRCK 用于声道同步sm_config_set_out_shift(&c, false, false, bit_depth); // 左移(MSB先出),禁用 autopullsm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);    // 合并 FIFO// 应用配置状态机pio_sm_init(pio, sm, offset, &c);// 统一设置初始电平和引脚方向pio_sm_set_pins_with_mask( pio, sm, 0, (7u << dout_pin) );  // zero outputpio_sm_set_pindirs_with_mask( pio, sm, (1u << dout_pin), (7u << dout_pin) );
}

        其中一行代码如下:

sm_config_set_out_shift(&c, false, false, bit_depth); // 左移(MSB先出),禁用 autopull

        这里面有注释,MSB先出,发送16位就终止,这个是I2S标准的格式,意思就是先从高位发送,如果我给的16位有效值都在低位,那岂不是根本发不出去?我想了一下,这个环节我的确还没处理,我想了一下,我应该可以在创建正弦表的时候处理这个问题。我改了一下代码,在生成正弦值之后,把数据左移16位,把有效位放在高16位上,代码如下:

// 生成正弦波表(预计算优化)
bool CSineWave::GenerateSineTable() 
{if( bit_depth == 0 ) {return false;}uint shift = 32 - bit_depth;const double amplitude = static_cast<double>( ( uint32_t(1) << (bit_depth - 1) ) - 1 );for( uint32_t i = 0; i < SINE_TABLE_LENGTH; ++ i ) {int32_t value = static_cast<int32_t>( std::round(amplitude * sin( 2.0 * M_PI * static_cast<double>(i) / SINE_TABLE_LENGTH ) ) );sine_table[i] = value << shift;    }return true;
}

        编译之后,再次测试,OUTPIN输出在示波器上显示出正确的频率。

http://www.dtcms.com/a/318847.html

相关文章:

  • MT信号四通道相关性预测的Informer模型优化研究
  • 此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)
  • 掌握工程化固件烧录,开启你的技术进阶之路-FPGA ISE(xilinx)
  • 微软推出“愤怒计划“:利用AI工具实现恶意软件自主分类
  • Daemon Tools for Mac —— 专业虚拟光驱与磁盘映像工具
  • 手机控制断路器:智能家居安全用电的新篇章
  • Casrel关系抽取
  • 如何快速开发符合Matter标准的智能家居设备?
  • 在 openEuler 24.03 (LTS) 上安装 FFmpeg 的完整指南
  • 接入小甲鱼数字人API教程【详解】
  • 物联网架构全解析:华为“1+2+1”与格行随身WiFi,技术如何定义未来生活?
  • 优选算法 力扣 LCR 179. 查找总价格为目标值的两个商品 双指针降低时间复杂度 C++题解 每日一题
  • 界面组件DevExpress WPF中文教程:网格视图数据布局 - 紧凑模式
  • 代企业开发钉钉数据对接
  • hadoop HDFS 重置详细步骤
  • [bug]AttributeError: module ‘typing_extensions‘ has no attribute ‘TypeVar‘
  • 人工智能的20大应用
  • 图论(1):图数据结构
  • 第二十七天(数据结构:图)
  • uni-app vue3 小程序接入 aliyun-rtc-wx-sdk
  • Android 之 Jetpack- Room
  • 力扣238:除自身之外数组的乘积
  • 快速开发实践
  • 使用Spring Boot + Angular构建安全的登录注册系统
  • 十八、MySQL-DML-数据操作-插入(增加)、更新(修改)、删除
  • LongVie突破超长视频生成极限:1分钟电影级丝滑视频,双模态控制告别卡顿退化
  • 本地组策略编辑器无法打开(gpedit.msc命令异常)
  • 编程之线性代数矩阵和概率论统计知识回顾
  • OpenCV 图像处理基础操作指南(一)
  • 基于人眼视觉特性的相关图像增强基础知识介绍