Inter-IC Sount Bus(I2S)是针对数字音频设备之间的音频数据传输而制定的一种总线标准。I2S标准中,既规定了硬件接口规范,也规定了数字音频数据的格式。
I2S总线接口介绍
I2S总线接口有3个主要信号,但只能实现数据半双工传输,后来为实现全双工传输有些设备增加了扩展数据引脚。CKS32F4xx系列控制器支持扩展的I2S总线接口。
SD(Serial Data)
串行数据线,用于发送或接收两个时分复用的数据通道上的数据(仅半双工模式),如果是全双工模式,该信号仅用于发送数据。
WS(Word Select)
字段选择线,也称帧时钟(LRC)线,表明当前传输数据的声道,不同标准有不同的定义。WS线的频率等于采样频率(FS)。
CK(Serial Clock)
串行时钟线,也称位时钟(BCLK),数字音频的每一位数据都对应有一个CK脉冲,它的频率为:2*采样频率*量化位数,2代表左右两个通道数据。
ext_SD(extend Serial Data)
扩展串行数据线,用于全双工传输的数据接收。另外,有时为使系统间更好地同步,还要传输一个主时钟(MCK),CKS32F4xx系列控制器固定输出为256*FS。
CKS32F4xx系列控制器有两个I2S,I2S2和I2S3,两个的资源是相互独立的,但分别与SPI2和SPI3共用大部分资源。这样I2S2和SPI2只能选择一个功能使用,I2S3和SPI3相同道理。资源共用包括引脚共用和部分寄存器共用,当然也有部分是专用的。控制器的I2S支持两种工作模式,主模式和从模式;主模式下使用自身时钟发生器生成通信时钟。I2S功能框图如下图所示:
功能引脚
I2S的SD映射到SPI的MOSI引脚,ext_SD映射到SPI的MISO引脚,WS映射到SPI的NSS引脚,CK映射到SPI的SCK引脚。MCK是I2S专用引脚,用于主模式下输出时钟或在从模式下输入时钟。I2S时钟发生器可以由控制器内部时钟源分频产生,亦可采用CKIN引脚输入时钟分频得到,一般使用内部时钟源即可。
参考下表CKS32F4xx系列控制器I2S引脚分布:
数据寄存器
I2S有一个与SPI共用的SPI数据寄存器(SPI_DR),有效长度为16bit,用于I2S数据发送和接收,它实际由三个部分组成,一个移位寄存器、一个发送缓冲区和一个接收缓冲区,当处于发送模式时,向SPI_DR写入数据先保存在发送缓冲区,总线自动把发送缓冲区内容转入到移位寄存器中进行传输;在接收模式下,实际接收到的数据先填充移位寄存器,然后自动转入接收缓冲区,软件读取SPI_DR时自动从接收缓冲区内读取。I2S是挂载在APB1总线上的。
逻辑控制
I2S的逻辑控制通过设置相关寄存器位实现,比如通过配置SPI_I2S配置寄存器(SPI_I2SCFGR)的相关位可以实现选择I2S和SPI模式切换、选择I2S工作在主模式还是从模式并且选择是发送还是接收、选择I2S标准、传输数据长度等等。SPI控制寄存器2(SPI_CR2)可用于设置相关中断和DMA请求使能,I2S有5个中断事件,分别为发送缓冲区为空、接收缓冲区非空、上溢错误、下溢错误和帧错误。SPI状态寄存器(SPI_SR)用于指示当前I2S状态。
时钟发生器
I2S比特率用来确定I2S数据线上的数据流和I2S时钟信号频率。I2S比特率=每个通道的位数×通道数×音频采样频率。图为I2S时钟发生器内部结构。I2SxCLK(x可选2或3)可以通过RCC_CFGR寄存器的I2SSRC位选择使用PLLI2S时钟作为I2S时钟源或I2S_CKIN引脚输入时钟作为I2S时钟源。一般选择内部PLLI2S(通过R分频系数)作为时钟源。例程程序设置PLLI2S时钟为258MHz,R分频系数为3,此时I2SxCLK时钟为86MHz。
SPI_I2S预分频器寄存器(SPI_I2SPR)的MCKOE位用于设置MCK引脚时钟输出使能;ODD位设置预分频器的奇数因子,实际分频值=I2SDIV*2+ODD;I2SDIV为8位线性分频器,不可设置为0或1。当使能MCK时钟输出,即MCKOE=1时,采样频率计算如下:
FS=I2SxCLK/[(16*2)*((2*I2SDIV)+ODD)*8)](通道帧宽度为16bit时)
FS=I2SxCLK/[(32*2)*((2*I2SDIV)+ODD)*4)](通道帧宽度为32bit时)当禁止MCK时钟输出,即MCKOE=0时,采样频率计算如下:
FS=I2SxCLK/[(16*2)*((2*I2SDIV)+ODD))](通道帧宽度为16bit时)
FS=I2SxCLK/[(32*2)*((2*I2SDIV)+ODD))](通道帧宽度为32bit时)
I2S初始化结构体介绍
标准库函数对I2S外设建立了一个初始化结构体I2S_InitTypeDef。初始化结构体成员用于设置I2S工作环境参数,并由I2S相应初始化配置函数I2S_Init调用,这些设定参数将会设置I2S相应的寄存器,达到配置I2S工作环境的目的。
代码清单:I2S_InitTypeDef结构体
typedef struct { uint16_t I2S_Mode; uint16_t I2S_Standard; uint16_t I2S_DataFormat; uint16_t I2S_MCLKOutput; uint32_t I2S_AudioFreq; uint16_t I2S_CPOL; }I2S_InitTypeDef;
(1)I2S_Mode:I2S模式选择,可选主机发送、主机接收、从机发送以及从机接收模式,它设定SPI_I2SCFGR寄存器I2SCFG位的值。一般设置CKS32控制器为主机模式,当播放声音时选择发送模式;当录制声音时选择接收模式。
(2)I2S_Standard:通信标准格式选择,可选I2S Philips标准、左对齐标准、右对齐标准、PCM短帧标准或PCM长帧标准,它设定SPI_I2SCFGR寄存器I2SSTD位和PCMSYNC位的值。一般设置为I2S Philips标准即可。
(3)I2S_DataFormat:数据格式选择,设定有效数据长度和帧长度,可选标准16bit格式、扩展16bit(32bit帧长度)格式、24bit格式和32bit格式,它设定SPI_I2SCFGR寄存器DATLEN位和CHLEN位的值。对应16bit数据长度可选16bit或32bit帧长度,其他都是32bit帧长度。
(4)I2S_MCLKOutput:主时钟输出使能控制,可选使能输出或禁止输出,它设定SPI_I2SPR寄存器MCKOE位的值。为提高系统性能一般使能主时钟输出。
(5)I2S_AudioFreq:采样频率设置,标准库提供采样采样频率选择,分别为8kHz、11kHz、16kHz、22kHz、32kHz、44kHz、48kHz、96kHz、192kHz以及默认2Hz,它设定SPI_I2SPR寄存器的值。
(6)I2S_CPOL:空闲状态的CK线电平,可选高电平或低电平,它设定SPI_I2SCFGR寄存器CKPOL位的值。
审核编辑:刘清
-
dsp
+关注
关注
552文章
7962浏览量
348232 -
电机控制
+关注
关注
3526文章
1855浏览量
268342 -
FFT
+关注
关注
15文章
434浏览量
59299 -
定时器
+关注
关注
23文章
3237浏览量
114445 -
浮点算法
+关注
关注
0文章
2浏览量
1339
原文标题:MCU微课堂|CKS32F4xx系列I2S功能
文章出处:【微信号:中科芯MCU,微信公众号:中科芯MCU】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论