微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 嵌入式系统中I2S总线数据通信的软件模拟

嵌入式系统中I2S总线数据通信的软件模拟

时间:04-25 来源:互联网 点击:

  引言

  I2S(InterIC Sound Bus)是飞利浦公司针对数字音频设备之间的音频数据传输而制定的一种总线标准,采用沿独立的导线传输时钟与数据信号的设计,通过分离数据和时钟信号,避免了时差诱发的失真。I2S总线简单有效,可以有效提升输出数据的质量,在各种嵌入式音频系统中有广泛应用。但是在嵌入式音频系统设计中,并不是所有的MCU都支持I2S总线格式,再加上I2S还没有统一的接口标准,不同的厂家生产的设备接口也是五花八门,采用软件模拟实现I2S总线可有效解决在不支持其的MCU和设备之间通过I2S总线实现数据传输时出现的问题。

  本文通过在以太网数字语音广播系统中软件模拟I2S总线实现语音数据传输,给出了软件模拟实现I2S总线的方法。

  1 I2S总线规范

  I2S为三线总线,3个信号分别为:

  ① 串行时钟SCK,也叫位时钟(BCK)。即每发送1位数字音频数据,SCK上都有1个脉冲。SCK的频率=2×采样频率×采样位数。在数据传输过程中,I2S总线的发送器和接收器都可以作为系统的主机来提供系统的时钟频率。

  ② 帧时钟WS,即命令(声道)选择,用于切换左右声道的数据。WS的频率等于采样频率,由系统主机提供。WS为"0"表示传输的是左声道的数据,WS为"1"表示传输的是右声道的数据。

  ③ 串行数据信号SD,用于传输二进制补码表示的音频数据。

  I2S格式的信号无论有多少位有效数据,数据位的最高位(MSB)总是被最先传输,1次能够发送的数据决定于I2S格式的有效位数。

  1个典型的I2S信号时序如图1所示

  

  图1 I2S总线典型时序图

  随着技术的发展,在统一的I2S接口下出现了多种不同的数据格式。根据SD信号相对于SCK和WS位置的不同,分为左对齐和右对齐2种格式,如图2和图3所示。

  

  图2 16位有效位数的左对齐格式

  

  图3 16位有效位数的右对齐格式

  在上面2种数据传输格式中,当WS为"1"时传输的是左声道的数据,当WS为"0"时传输的是右声道的数据。为了保证数字音频信号的正确传输,发送端和接收端必须采用相同的数据格式。

  2 软件模拟I2S

  以太网数字语音广播系统主要是指以以太网为传播介质提供音频服务的广播系统,将语音信号以标准IP包的形式在以太网上进行传送,以实现语音广播功能。该系统在PC机端通过麦克风采集语音数据,然后将采集到的语音数据通过以太网发送给嵌入式终端,嵌入式终端将接收到的语音数据进行数/模转换后进行播放。系统实现框图如图4所示[5]。

  

  图4 以太网数字语音广播系统框图

  

  图5 LM3S8962与MS6336的连接图

  广播系统终端的MCU LM3S8962将接收到的语音数据通过I2S总线发送给语音解码芯片MS6336进行数/模转换并播放,

  LM3S8962和MS6336的连接如图5所示。为了完整还原出语音信号,需要保证软件模拟I2S信号时序严格精确,高低电平的转换采用延时程序实现。MS6336为16位D/A芯片,其I2S时序如图6所示。

  

  图6 MS6336的典型I2S时序图

  该系统中的语音数据双声道,16位采样,1个采样点的数据为4字节,1个采样点数据通过MCU发送给MS6336,数据发送流程如图7所示。

  

  图7 1个采样点数据发送流程

  软件模拟I2S引脚的定义如下:

  #define I2S_WS GPIO_PIN_5//模拟I2S声道选择时钟控制位

  #define I2S_BCK GPIO_PIN_6//模拟I2S位时钟控制位

  #define I2S_DATA GPIO_PIN_7//模拟I2S数据传送位

  根据MS6336的I2S总线格式以及数据发送流程,软件模拟I2S总线的步骤如下:

  ① 根据语音数据采样率及采样位数计算得到SCK的值和WS的值(WS的值等于采样频率)。

  系统采样率为44.1 kHz,则SCK=2×44.1 kHz×103×16=1 411 200 Hz,WS=44 100 Hz。1个SCK时钟周期T=1/SCK=0?7 μs。采用延时程序模拟SCK时钟周期需要应用示波器来精确延时时间。本系统中一个SCK周期的延时为delayI2S(2)。

  ② 将WS、BCK和DATA均置为高电平。

  ③ 选择左右声道。首先发送左声道数据,将WS置低(若发送右声道数据则将WS置高)。

  for(ChannelCnt=0;ChannelCnt《2;ChannelCnt++){//双声道选择播放

  if(ChannelCnt==0){//左声道选择信号为低电平

  HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS 《《 2))) = ~I2S_WS;

  }

  else{//右声道选择信号为高电平

  HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS 《《 2))) = I2S_WS;

  }

  ……

  }

  ④ 选择高低字节。将左声道数据以高低字节的顺序发送,在发送高字节第1位数据之前先发送1个周期的串行时钟。

f

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top