首页 > 其他分享 >i2s

i2s

时间:2023-11-11 17:34:06浏览次数:26  
标签:采样 LRCLK 音频 i2s lrclk input reg

I2S简单介绍及接收端代码实现

简介

I2S(Inter-IC Sound)是一种数字音频传输协议,通常用于在数字音频设备之间传输音频数据。它是一种同步的串行数据传输协议,用于将音频信号从一个设备传输到另一个设备,例如从麦克风到音频编解码器、音频接口到音频处理器等。

接口定义

  • SCLK:对应数字音频的每一位数据,$f_{SCLK}=2采样频率采样位宽$。
  • LRCLK:用于同步左右声道的采样数据,低电平为左声道,高电平为右声道。
  • SDATA:使用二补码表示的音频数据。
  • MCLK:高速率主时钟

接口时序

pi16tD1.jpg

可以看到LRCLK跳变后的第一个SCLK周期没有数据写入。

代码实现

  1. 定义模块接口和内部寄存器,并通过异或LRCLK检测边沿信号

pi16bbq.png

  1. 对LRCLK延迟一拍采集,并产生计数信号

pi1c9M9.png

  1. 将串行数据写入寄存器中,输出并行数据和接收完成信号

pi1cBd0.png

完整代码

module i2s_receive #(
    parameter WL = 6'd32  //采样位宽
) (

    input rst,
    input sclk,
    input lrclk,
    input sdata_in,

    output reg        rx_done,
    output reg [31:0] data_out
);

  reg         lrclk_d0;
  reg  [ 5:0] rx_cnt;
  reg  [31:0] data_out_t;

  wire        lrc_edge;  // 边沿信号检测

  assign lrc_edge = lrclk ^ lrclk_d0;  // LRC信号的边沿检测



  always @(posedge sclk or negedge rst) begin
    if (!rst) begin
      lrclk_d0 <= 1'b0;
    end else lrclk_d0 <= lrclk;
  end

  always @(posedge sclk or negedge rst) begin
    if (!rst) begin
      rx_cnt <= 6'd0;
    end else if (lrc_edge == 1'b1) rx_cnt <= 6'd0;
    else if (rx_cnt < 6'd35) rx_cnt <= rx_cnt + 1'b1;
  end

  always @(posedge sclk or posedge rst) begin
    if (rst) begin
      data_out_t <= 32'b0;
    end 
    else if (rx_cnt < WL) begin
      data_out_t[WL-1'd1-rx_cnt] <= sdata_in;
    end

  end

  always @(posedge sclk or negedge rst) begin
    if (!rst) begin
      rx_done  <= 1'b0;
      data_out <= 32'b0;
    end else if (rx_cnt == 6'd31) begin
      rx_done  <= 1'b1;
      data_out <= data_out_t;
    end else rx_done <= 1'b0;
  end
endmodule

标签:采样,LRCLK,音频,i2s,lrclk,input,reg
From: https://www.cnblogs.com/sawen/p/17826109.html

相关文章

  • t113-c-i2s设备设置尝试
    记录一下i2s设备设置,由于没买麦克风阵列所以结果应该是一个虚拟的设备显示1.设置设备树,板级设备树:由于我的板子上只有PB4567,所以只能设置PB4复用为in和out,不知道这样可不可以用,在学i2s的时候明明说是可以dat用一条线的。设置状态为okay2.menuconfig的设置3.烧录验证直接......
  • t113-c-i2s学习篇(cards)
    学习一下t113的i2s驱动1.模块功能规格介绍一堆看不懂的名词,处于半看懂半看不懂的状态2.模块源码结构介绍又是一堆看不懂的文件名字,还是不懂怎么用3.模块配置介绍3.1DeviceTree配置介绍什么是dmic?硬件接口之DMIC 举例,以i2s为例子:3.2board.dts板级配置介绍......
  • Rockchip RK3399 - Platform驱动(DMA&i2s0)
    Platfromdriver提供了配置/使能SoC音频接口的能力;Plaftrom驱动分为两个部分:snd_soc_platform_driver、snd_soc_dai_driver。snd_soc_platform_driver:负责管理音频数据,把音频数据通过DMA或其他操作传送至CPUDAI中;snd_soc_dai_driver:负责完成SoC一侧的DAI参数配置,同时也会通过......
  • I2S 协议
    参考NXP《I2Sbusspecification》NXP《I2S在Kinetis上的应用》https://www.python100.com/html/R62183SDTAU0.htmlhttps://blog.51cto.com/u_15459030/5225825I2C相关内容见tag.1.I2S概述1.1为什么需要I2SI2S是I2C的变种,全称:InterIc-Sound.专门为传输......
  • AD82584F兼容替代TAS5707/TAS5711,用于智能音箱语音辨识的2x25W立体声数字音频功放,带I2
    AD82584F是一种数字音频放大器,能够将一对8Ω负载扬声器驱动到25W(BTL)和将4Ω负载扬声器驱动到50W(PBTL),播放音乐不需要外部散热器或风扇。AD82584F提供先进的音频处理功能,如音......
  • AIR32F103(六) ADC,I2S,DMA和ADPCM实现录音播放功能
    目录AIR32F103(一)合宙AIR32F103CBT6开发板上手报告AIR32F103(二)Linux环境和LibOpenCM3项目模板AIR32F103(三)Linux环境基于标准外设库的项目模板AIR32F103(四)2......