以前做过一些I2S的音频信号接口的应用,所以了解一些I2S规格。从官网上看到AN5086,SPI模拟I2S的应用说明,认为很有用,试验一番。
这个应用的基本理论:
通过SPI外设的分频器,将输入的外部时钟分频后,得到一个适合音频通迅的时钟频率SCK。SCK是音频采样率的整倍数,采样率通常用8K,32K,44.1K,48K等。双声道就*2。然后再*采样的分辨率。
比如,8K采样率的双声道,分辨率为16位,那么SCK就要8K*2*16=256K的频率。
得到SCK后再通过一个定位器的触发同步功能,得到左右通道字选择WS信号。所以I2S通常有四根信号线,外部时钟的CLK,通常叫MCLK,SCK,WS,和数据SD。
根据以上要求,设计一个简单例程来测试一下。手上有一个GO70RB NUCLEO的板子,就用它来做了。这个板子上没有合适的时钟输入用作MCLK,暂时先用内部16M时钟来作。所以SCK会有偏差。16M用SPI的64分频,得到250K的SCK,与要求的256K有一些偏差。
首先,定义一个数组用来存储音频数据。并循环赋一个值。
然后利用DMA的MEM TO PER,将数组的值循环通过SPI输出。很容易的就得到了SCK和SD信号。
另外配置一个定时器,一个输入通道做触发,一个做比较输出。SCK信号用作触发信号,比较输出就可以做WS信号使用了。
定时器的配置有点麻烦,它的功能太多了。做了一些调整之后,终于得到这样的一个输出图。
最下面的是SCK信号,中间是SD,最上面的就是WS信号。
定时器的一些配置。
用G070RB NUCLEO调试,SPI1接口。
SPI模拟I2S可以应用在一些需要简单发声的项目中。
|