AT32讲堂048 | 雅特力AT32 MCU SPI/I2S入门指南

描述

 

SPI接口概述

AT32的SPI接口提供软件编程配置选项,根据软件编程配置方式不同,可以分别作为SPI和I2S使用。本文将分SPI和I2S分别介绍SPI接口作SPI或I2S的功能特性以及配置流程。AT32 SPI特点:
 

可编程配置的全双工或半双工通信

--全双工同步通信--半双工同步通信(可以根据软件编程配置选择传输方向:发送或接收)

可编程配置主/从模式

可编程配置的CS模式:硬件/软件CS模式

可编程配置的时钟极性和相位

可编程配置的数据传输顺序(MSB/LSB)

可编程配置的错误中断标志(CS脉冲异常,接收溢出错误,主模式错误,CRC校验错误)

数据接收/发送均支持DMA

兼容TI的SSP协议(即TI模式)

AT32 I2S特点:

可编程配置的操作模式

--从设备发送--从设备接收--主设备发送--主设备接收

可编程配置的时钟极性

可编程配置的时钟频率(8KHz到192KHz)

可编程配置的数据位数(16位,24位,32位)

可编程配置的声道位数(16位,32位)

可编程配置的音频协议

--I2S飞利浦标准--高字节对齐标准(左对齐)--低字节对齐标准(右对齐)--PCM标准(长帧/短帧)

支持I2S全双工

支持DMA传输

在通讯期间可提供频率固定为256倍Fs(音频采样频率)的外设主时钟

SPI功能介绍

本章主要介绍SPI基本功能,以及AT32 SPI的各种附加可配置选项。

SPI硬件接口

SPI接口定义如下:

CS:片选引脚(可选)。通常由主机输出,从机输入。后续CS管理章节作详细介绍。

SCK:时钟引脚。由主机输出,从机输入。

MISO:主收从发引脚。主机则作为接收数据引脚,从机则做为发送数据引脚。

MOSI:主发从收引脚。主机则作为发送数据引脚,从机则作为接收数据引脚。

以下介绍几种常见的SPI通信接线方式。1)如下图1,是单主单从、全双工、CS硬件模式的应用接线示意图。图1 SPI单主单从、全双工、硬件CS管理接线示意雅特力2)如下图2,是单主单从、全双工、CS软件模式的应用接线示意图。在CS软件管理模式下,无需使用CS引脚,主/从机的CS引脚都可以释放给其他应用使用。此时,从机对SWCSIL位清0或置1等效于“硬件CS模式”下的CS引脚输入低电平和高电平。主机则必须将SWCSIL位置1,以保证正确的处于主机模式。图2 SPI单主单从、全双工、软件CS管理接线示意雅特力

 

3)如下图3,是单主多从全双工接线示意。主机使用普通I/O口1~n输出以驱动从机1~n的片选CS,主机的SCK,MISO,MOSI和从机的SCK,MISO,MOSI引脚一对多连接。此时SPI主机可以通过I/O1~n的选择与多个从机进行分时通信。此时从机必须使用硬件CS模式。主机可以使用软件CS模式,主机CS对应的引脚可以释放给其他应用使用。图3 SPI单主多从、全双工接线示意雅特力4)如下图4,AT32的SPI增加了SPI半双工模式,此模式下只需要使用3线即可通信。主机使用MOSI进行数据收/发。当主机配置为半双工发送模式(SLBEN=1,SLBTD=1)时,主机MOSI为输出引脚,用于发送数据;当主机配置为半双工接收模式(SLBEN=1,SLBTD=0)时,主机MOSI为输入引脚,用于接收数据。从机使用MISO进行数据收/发。当从机配置为半双工发送模式(SLBEN=1,SLBTD=1)时,从机MISO为输出引脚,用于发送数据;当从机配置为半双工接收模式(SLBEN=1,SLBTD=0)时,从机MISO为输入引脚,用于接收数据。图4 SPI单主单从、半双工接线示意雅特力

SPI数据接收和发送

如下图5,用户软件程序可以读和写数据寄存器,其他部分全由硬件自动完成。以全双工,硬件CS管理,8bit数据格式为例。收发一笔数据的流程如下:作为SPI主机时:软件使能SPI(SPIEN=1)后,硬件控制CS引脚输出低电平,以片选从机。之后软件往数据寄存器写入数据,如下图5的“软件写数据寄存器”处,相当于往发送缓冲器写入待发送数据,之后硬件会自动将发送缓冲器的待发送数据搬运到移位寄存器。同时将发送缓冲器空标志置1(TDBE=1),以提醒软件又可以往数据寄存器写入下一笔待发送的数据。之后硬件立即开始在SCK引脚上输出时钟信号,并在MOSI引脚上发出待发送数据的第一bit数据。之后硬件从MISO引脚上读取待接收数据的第一bit数据并放入移位寄存器中(移位寄存器由于之前发送了1bit数据,此时正好有一bit位置可以存放收到的数据)。之后硬件会通过移位寄存器自动发送和接收剩下的7bit数据。之后硬件会将移位寄存器中接收到的8bit数据搬运到接收缓冲器中,并将接收缓冲器满标志置1(RDBF=1),以提醒软件可以通过读取数据寄存器来读取刚刚接收到的这笔数据。作为SPI从机时:软件使能SPI(SPIEN=1)后,软件往数据寄存器写入数据,相当于往发送缓冲器写入待发送数据,然后硬件会将发送缓冲器空标志清0(TDBE=0),以提醒软件此时发送缓冲器已有待发送数据了。之后硬件检测CS引脚和SCK引脚,等待来自主机的片选和时钟信号。检测到片选和时钟信号之后,硬件自动将发送缓冲器的待发送数据搬运到移位寄存器并在MISO引脚上发出待发送数据的第一bit。同时将发送缓冲器空标志置1(TDBE=1),以提醒软件又可以往数据寄存器写入下一笔待发送的数据。之后硬件从MOSI引脚上读取待接收数据的第一bit数据并放入移位寄存器中(移位寄存器由于之前发送了1bit数据,此时正好有一bit位置可以存放收到的数据)。之后硬件根据在SCK上的时钟信号,会在MISO和MOSI引脚上发送和接收剩下的7bit数据。之后硬件会将移位寄存器中接收到的8bit数据搬运到接收缓冲器中,并将接收缓冲器满标志置1(RDBF=1),以提醒软件可以通过读取数据寄存器来读取刚刚接收到的这笔数据。也可以参考下一小节“SPI时序”来理解SPI收发逻辑。

 

图5 SPI数据接收/发送框图雅特力

SPI时序

本节介绍SPI通信时序。包括全双工和半双工的主/从通信时序。1、SPI全双工时序以全双工、硬件CS管理、单主单从通信为例。其中主机端相关配置如下:MSTEN=1:设备为主机;SLBEN=0:全双工模式;CLKPOL=0:SCK空闲输出低电平;CLKPHA=0:SCK第一个边沿开始进行数据捕获;FBN=0:帧位个数为8bit;SWCSEN=0,HWCSOE=1:使用硬件CS管理;主机发送数据(MOSI):0xAA,0xCC,0xAA;从机发送数据(MISO):0xCC,0xAA,0xCC。

 

主机端时序见下图6:图6 硬件CS管理-全双工-主机通信时序

 

雅特力

 

其中从机端相关配置如下:MSTEN=0:设备为从机SLBEN=0:全双工模式;CLKPOL=0:SCK空闲低电平CLKPHA=0:SCK第一个边沿进行数据捕获FBN=0:帧位个数为8bitSWCSEN=0:使用硬件CS管理主机发送数据(MOSI):0xAA,0xCC,0xAA从机发送数据(MISO):0xCC,0xAA,0xCC从机端时序见下图7:图7 硬件CS管理-半双工-从机通信时序雅特力

 

2、SPI半双工时序半双工时序下,有主机发送、从机接收、主机接收、从机发送4种模式。1)以半双工、硬件CS管理、主机发送-从机接收通信为例。其中主机端相关配置如下:MSTEN=1:设备为主机;SLBEN=1:使能单线双向半双工模式;SLBTD=1:发送模式;CLKPOL=0:SCK空闲输出低电平;CLKPHA=0:SCK第一个边沿开始进行数据捕获;FBN=0:帧位个数为8bit;SWCSEN=0,HWCSOE=1:使用硬件CS管理;主机发送数据:0xAA,0xCC,0xAA;

主机端时序见下图8:图8 硬件CS管理-半双工-主发时序

 

雅特力其中从机端相关配置如下:MSTEN=0:设备为从机;SLBEN=1:使能单线双向半双工模式;SLBTD=0:接收模式;CLKPOL=0:SCK空闲低电平;CLKPHA=0:SCK第一个边沿进行数据捕获;FBN=0:帧位个数为8bit;SWCSEN=0:使用硬件CS管理;从机接收数据:0xAA,0xCC,0xAA;从机端时序见下图9:图9 硬件CS管理-半双工-从收时序雅特力

 

2)以半双工、硬件CS管理、主机接收-从机发送通信为例。其中主机端相关配置如下:MSTEN=1:设备为主机;SLBEN=1:使能单线双向半双工模式;SLBTD=0:接收模式;CLKPOL=0:SCK空闲输出低电平;CLKPHA=0:SCK第一个边沿开始进行数据捕获;FBN=0:帧位个数为8bit;SWCSEN=0,HWCSOE=1:使用硬件CS管理;主机接收数据:0xAA,0xCC,0xAA;主机端时序见下图10:此模式下,较为特别的是,SPI主机一旦使能(SPIEN=1),就会连续不断的输出时钟。因此,主机在接收完需要接收的数据后,需要关闭SPI。在本例中,接收完连续的3笔数据后,也就是下图10的箭头处,需要关闭SPI,输出多余的时钟。另外,如下图10,此模式下,BF标志始终为低。图10 硬件CS管理-半双工-主收时序雅特力其中从机端相关配置如下:MSTEN=0:设备为从机;SLBEN=1:使能单线双向半双工模式;SLBTD=1:发送模式;CLKPOL=0:SCK空闲低电平;CLKPHA=0:SCK第一个边沿进行数据捕获;FBN=0:帧位个数为8bit;SWCSEN=0:使用硬件CS管理;从机发送数据:0xAA,0xCC,0xAA;从机端时序见下图11:图11 硬件CS管理-半双工-从发时序雅特力

SPI数据收发方式

SPI的接收和发送如前文所述,是通过操作数据寄存器来完成的。而根据操作数据寄存器的方法,SPI有以下3种数据接收发送方式。轮询方式轮询方式不需要使能SPI中断和DMA。只需要在main函数中不断读取STS寄存器,并判断TDBE和RDBF标志是否置起,以确定何时向数据寄存器写入待发送数据,何时从数据寄存器读取接收到的数据。比较耗费CPU资源,不建议使用此方式。具体请参考“案例1--SPI全双工轮询方式通信”一节。中断方式中断方式需要开启“发送数据缓冲器空中断使能”和“接收数据缓冲器满中断使能”,即设置TDBEIE=1,RDBFIE=1。并配置和使能SPI中断。之后在SPI中断里进行数据的发送和接收,避免了轮询方式的等待耗时,占用CPU资源相对较少。具体请参考“案例4--SPI半双工中断方式通信”或“案例5--SPI半双工中断方式通信--加收发切换”一节。DMA方式DMA方式需要开启SPI的DMA接收/发送功能(DMAREN=1,DMATEN=1)。并配置DMA通道映射到SPI和使能DMA。之后的接收和发送均由DMA完成,收/发过程不再需要软件参与,不占用CPU资源。具体请参考“案例2--SPI全双工DMA方式通信”一节。

时钟控制器

SPI协议采用同步传输。作主机时,需要时钟控制器产生通信时钟用于SPI接口的数据收发,并且需要将该通信时钟通过SCK引脚输出给从机,用于从机的数据收发;作从机时,需要外部提供通信时钟,从SCK引脚输入到SPI接口内部作为通信时钟使用。对用户而言,可软件配置的主要有极性、相位、分频系数三个参数。极性SPI时钟极性,即空闲时SCK引脚输出的电平。通过配置CLKPOL位来选择SPI时钟极性。如下图12:CLKPOL=0时,SCK空闲为低电平;CLKPOL=1时,SCK空闲为高电平。图12 时钟极性对比雅特力相位SPI时钟相位,即SPI数据捕获边缘。通过配置CLKPHA位来选择SPI时钟极性。如下图13:CLKPHA=0时,第一个边沿为捕获采样边沿。在本例中(CLKPOL=0),也就是上升沿为采样沿;相对的,本例中下降沿为驱动沿。CLKPHA=1时,第二个边沿为捕获采样边沿。在本例中(CLKPOL=0),也就是下降沿为采样沿;相对的,本例中上升沿为驱动沿。图13 时钟相位对比雅特力
分频系数SPI时钟是从APB时钟分频得到的,通过配置MDIV[3:0]和MDIV3EN来选择需要的分频系数,以确定SPI时钟。分频系数仅主机配置有效。从机需要外部提供时钟,因此此项配置无效。

CS管理

SPI CS包含硬件和软件管理两种模式,又根据主机/从机的不同,有不同的配置和应用场景。在CS为输入模式时(HWCSOE=0),如下图14,主机和从机均通过SWCSEN位来选择SPI实际使用的CS信号来自软件设置(SWCSIL)还是外部CS引脚电平。在CS为输出模式时(HWCSOE=1),软件CS模式相关配置无效。图14 SPI数据接收/发送框图雅特力以下分别列出了主机和从机在不同的CS管理模式下的状态和应用场景。主机CS管理:下表1列出了几种主机CS管理的配置及应用场景。表1 SPI主机CS管理配置雅特力注:“--”表示此项配置无效,建议保持默认配置。从机CS管理:下表2列出了从机CS管理的几种配置和应用场景。其中,从模式下HWCSOE配置无效,该位只在主模式下有效。表2 SPI从机CS管理配置雅特力注:“--”表示此项配置无效,建议保持默认配置。

CRC校验

AT32 SPI具有独立的发送和接收CRC计算单元,用户可通过软件配置使能此功能。使能CRC校验之后:硬件会对发送的数据进行CRC计算,并将计算得到的CRC校验码放在SPI_TCRC寄存器中,CRC校验码紧接在数据之后发送;且硬件会在接收一笔数据时对接收到的数据进行CRC计算,并将计算得到的CRC校验码放在SPI_RCRC寄存器中,硬件会在一笔连续的数据接收完成后将最后接收到的CRC校验码与SPI_RCRC寄存器中的校验码进行比较,如果不符,CRC校验错误位(CCERR)会置起,若使能了错误中断(ERRIE=1),将会产生中断。另外,SPI通信方式使用DMA和使用轮询/中断方式时,CRC功能的软件操作步骤有区别,如下:轮询/中断方式:①配置CRC多项式:配置SPI_CPOLY寄存器和需要通信的SPI一致(默认值为0x0007);②使能CRC功能:CCEN=1;③使能SPI:SPIEN=1;④发送待发送的数据data_1~data_n;⑤请求发送CRC校验码:NTC=1。注:NTC置1的时间参考下图15的⑤段,需要在最后一笔数据(data_n)写入数据寄存器到发送完成之间。实际编写软件代码时,建议在data_n写入数据寄存器之后立即将NTC置1。⑥硬件自动在data_n发送完成后立即发送CRC校验码(此时无需软件参与)。轮询方式使用CRC功能可参考“案例6--SPI CRC功能使用”。图15 CRC使用流程(轮询/中断方式)雅特力

DMA方式:

SPI在使用DMA方式通信时,不需要软件代码去设置请求发送CRC校验码,即不需要去置位NTC位。具体步骤如下:①配置DMA:请参考“案例2--SPI全双工DMA方式通信”的DMA配置部分;②配置CRC多项式:配置SPI_CPOLY寄存器和需要通信的SPI一致(默认值为0x0007);③使能CRC功能:CCEN=1;④使能SPI:SPIEN=1;⑤数据及CRC接收完成后需关闭SPI和DMA,之后再开启,准备下一次通信。

TI模式(TI SSP协议)

AT32 SPI接口支持TI SSP协议,即TI模式。用户可以通过将TIEN位置1来使能TI模式。使能TI模式后,SPI接口将按照TI协议要求产生时钟SCK,和片选信号CS。也就是CS软/硬件管理相关控制位、时钟极性/相位相关控制位配置无效,请保持默认设置。使能TI模式后,帧格式(8/16bit)配置、CRC校验、DMA等功能仍然可以使用。TI模式下,连续和不连续通信稍有区别。连续通信时,只有第一笔数据发送时有一个dummy CLK;不连续通信时,每笔数据都有一个dummy CLK。参考下图16和图17。TI模式连续通信时序图见下图16。主机发送数据(MOSI):0xAA,0xCC,0xAA;从机发送数据(MISO):0xCC,0xAA,0xCC。图16 TI模式连续通信时序图雅特力TI模式不连续通信时序图见下图17。主机发送数据(MOSI):0xAA,0xCC,0xAA;从机发送数据(MISO):0xCC,0xAA,0xCC。图17 TI模式不连续通信时序图雅特力注:AT32只有部分型号支持TI模式。AT32F425/F435/F437等型号支持TI模式,AT32F403/F403A/F407/F413/F415等型号不支持TI模式。具体请参考各型号的RM。

SPI错误

AT32的SPI有4种错误标志。这4种错误标志共用一个错误中断使能位(ERRIE)。也就是当ERRIE=1时,产生以下4种错误的任一错误就会进入SPI错误中断。CSPAS--CS脉冲异常置位标志在TI模式下,当SPI作从机使用时,SPI会在数据传输期间侦测非预期的CS脉冲,当发生CS脉冲异常置位错误,CSPAS被硬件置1,如果开启了错误中断使能(ERRIE=1),则会产生错误中断。之后可以通过软件读SPI_STS清除该位。当侦测到CS脉冲异常时,为避免数据错误,软件应当关闭SPI从机,重新配置SPI主机,再打开SPI从机以重新开始通信。注:仅在TI模式下,CSPAS错误标志才有效。ROERR--接收器溢出错误标志当SPI数据寄存器已暂存一笔待读数据时,又收到一笔新数据,则会发生接收器溢出错误,ROERR被硬件置1,如果开启了错误中断使能(ERRIE=1),则会产生错误中断。发生溢出错误之后,SPI_DT寄存器存放的是最早收到的那笔数据,发生溢出错误之后收到的数据都被丢弃。之后依次读取SPI_DT寄存器和SPI_STS寄存器可清除该标志位。MMERR--主模式错误标志参考“CS管理”一节,当SPI主机为CS输入模式且CS引脚输入低电平时,会产生主模式错误,MMERR位会被硬件置1,且硬件会强制SPI进入从机模式(MSTEN清0)并关闭SPI(SPIEN清0)。如果开启了错误中断使能(ERRIE=1),则会产生错误中断。清除MMERR标志位并从错误状态恢复请严格按照以下步骤执行:①拉高CS引脚电平;②执行一次对SPI_STS寄存器的读或写操作;③执行一次对SPI_CTRL1寄存器的写操作;(不需要改变SPI_CTRL1的值,只需要写这个动作)④之后硬件会自动清除MMERR标志(此步骤不需要软件代码参与);⑤之后软件可根据需要重新配置主/从模式和使能SPI。CCERR--CRC校验错误标志当使能了CRC功能后,如果接收到的CRC校验码(发送方发送的校验码)和SPI_RCRC的校验码(接收方根据接收到的数据计算的校验码)不符,则硬件将CCERR位置1,如果开启了错误中断使能(ERRIE=1),则会产生错误中断。由于发生了CRC校验错误,软件程序应当丢弃之前接收到的一笔数据,并重新通信。软件对CCERR位写0可清除该标志位。

SPI中断

如下图18,SPI有一个全局中断向量。SPI中断有三个中断源:接收缓冲器满、发送缓冲器空、通信错误(详见上一节“SPI错误”)。这三个中断源分别有对应的使能位。下图中,3个中断使能位定义如下:

RDBFIE:接收数据缓冲器满中断使能

TDBEIE:发送数据缓冲器空中断使能

ERRIE:错误中断使能

下图中,5个标志位定义如下:

ROERR:接收器溢出错误

MMERR:主模式错误

CCERR:CRC校验错误

RDBF:接收数据缓冲器满

TDBE:发送数据缓冲器空

图18 SPI中断示意雅特力

I2S功能介绍

I2S硬件接口

I2S接口定义如下:

WS:声道选择。由主机输出,从机输入。

CK:时钟。由主机输出,从机输入。

MCK:主时钟输出(可选)。在通讯期间可提供频率固定为256倍Fs的外设主时钟,仅在作为主机时有效。

SD:数据。主机/从机接收或发送数据均通过这个引脚。

以下是常见的I2S通信接线方式。如下图19,是I2S主发从收的接线示意图。图19 I2S主发从收通信接线示意雅特力如下图20,是I2S主收从发的接线示意图。图20 I2S主收从发通信接线示意雅特力

I2S数据接收和发送

I2S数据收发模块和上文的SPI共用数据寄存器和DMA映射,如上图5中的接收/发送缓冲器、移位寄存器也都是共用的,因此软件代码操作类似,请参考下文的I2S案例一节。不过SPI默认是全双工,而I2S默认是半双工。AT32也为用户提供I2S全双工功能,后文I2S全双工一节详细介绍。

I2S音频协议

AT32的I2S支持以下4种标准协议:

飞利浦标准:STDSLE=0b00;

高字节对齐标准(左对齐):STDSLE=0b01;

低字节对齐标准(右对齐):STDSLE=0b10;

PCM标准:STDSLE=0b11。

其中PCM标准又分为:1、PCM长帧同步:PCMFSSEL=1;2、PCM短帧同步:PCMFSSEL=0。下图21在“16位数据-32位声道格式”,I2S时钟极性为低(I2SCLKPOL=0)条件下对比了几种音频标准一帧数据的通信时序。飞利浦模式下:WS为低电平表示正在传输的声道为左声道,WS为高电平表示正在传输的声道为右声道。数据左对齐,即高位对齐,低位的16个bit被硬件填充为0。MSB标准下:WS为高电平表示正在传输的声道为左声道,WS为低电平表示正在传输的声道为右声道。数据左对齐,即高位对齐,低位的16个bit被硬件填充为0。LSB标准下:WS为高电平表示正在传输的声道为左声道,WS为低电平表示正在传输的声道为右声道。数据右对齐,即低位对齐,高位的16个bit被硬件填充为0。注:LSB标准下,数据发送顺序还是高位在前。PCM标准长帧下:没有左右声道之分,WS的脉冲代表同步信号而不是左右声道。WS脉冲长度为13个CK长度。PCM标准短帧下:没有左右声道之分,WS的脉冲代表同步信号而不是左右声道。WS脉冲长度为1个CK长度。图21 I2S各音频标准时序对比雅特力

I2S帧格式

AT32的I2S支持3种数据位个数选择:

16位:I2SDBN=0b00

24位:I2SDBN=0b01

32位:I2SDBN=0b10

AT32的I2S支持2种声道位个数选择:

16位:I2SDBN=0

32位:I2SDBN=1

数据位个数和声道位个数组合有以下4种帧格式:①16位数据-16位声道格式:I2SDBN=0b00,I2SDBN=0;②16位数据-32位声道格式:I2SDBN=0b00,I2SDBN=1;③24位数据-32位声道格式:I2SDBN=0b01,I2SDBN=1;④32位数据-32位声道格式:I2SDBN=0b10,I2SDBN=1;上述的第②、③帧格式中,由于声道位个数>数据位个数。此时硬件会自动将多余的声道位填充为0。可参考上图21中,“16位数据-32位声道格式”的时序。上述的①、②帧格式,在接收/发送数据时,仅需要读取/写入一次16bit的DT寄存器;而③、④帧格式,在接收/发送数据时,需要读取/写入两次16bit的DT寄存器。

I2S时钟控制器

I2S采样率(Fs)常见的音频的采样频率有:192KHz、96kHz、48kHz、44.1kHz、32kHz、22.05kHz、16kHz、11.025kHz、8kHz等。而实际上AT32的I2S可以产生以上范围内的任何采样率。例如采样率为192K,则表示每秒可传输192K帧音频数据。对于飞利浦/MSB/LSB标准而言,一帧音频数据包含左、右通道两笔16/32bit的数据;对于PCM标准而言,一帧数据仅包含一笔16/32bit的数据。I2S时钟(CK)和主时钟(MCK)如下图22,I2S的时钟从系统时钟SCLK分频得来。不过使用I2S时仍然需要使能挂载在APB时钟总线上的SPI接口时钟(SPIxEN=1),以用于I2S逻辑控制器等。

当需要输出主时钟(I2SMCLKOE=1),声道位个数为16bit(I2SDBN=0)时:

Fs=SCLK/[(16*2)*((2*I2SDIV)+I2SODD)*8];

当需要输出主时钟(I2SMCLKOE=1),声道位个数为32bit(I2SDBN=1)时:

Fs=SCLK/[(32*2)*((2*I2SDIV)+I2SODD)*4];

当不需要输出主时钟(I2SMCLKOE=0),声道位个数为16bit(I2SDBN=0)时:

Fs=SCLK/[(16*2)*((2*I2SDIV)+I2SODD)];

当不需要输出主时钟(I2SMCLKOE=0),声道位个数为32bit(I2SDBN=1)时:

Fs=SCLK/[(32*2)*((2*I2SDIV)+I2SODD)];图22 I2S时钟雅特力如下表3,示例了系统时钟为240MHz时,配置192K的采样率推荐的I2S时钟配置方案。表3 I2S时钟配置方案示例雅特力

I2S全双工

AT32F403A/F407/F435/F437/F425等型号支持I2S全双工,AT32F403/F413/F415/F421等型号不支持I2S全双工,具体请参考对应型号RM文档。不同型号MCU的I2S全双工实现方式也有所区别,本文会分别介绍AT32F403A/F407/F435/F437和AT32F425的I2S全双工功能。AT32F403A/F407/F435/F437的I2S全双工AT32F403A/F407/F435/F437为了支持I2S全双工模式,额外例化了两个I2S模块(I2S2EXT,I2S3EXT)。I2S2可与I2S2EXT组合在一起支持全双工模式,I2S3可与I2S3EXT组合在一起支持全双工模式。代码可参考“案例3—AT32F403A/F407/F435/F437 I2S全双工DMA方式通信”。在I2Sx可与I2SxEXT组成全双工模块时,I2Sx可配置为主或从模式,I2SxEXT只能配置为从模式。I2SxEXT共享I2Sx的CK和WS,对应的有以下几种配置方式:

I2Sx主发(OPERSEL=0b10);I2SxEXT从收(OPERSEL=0b01);

I2Sx主收(OPERSEL=0b11);I2SxEXT从发(OPERSEL=0b00)。

I2Sx从发(OPERSEL=0b00);I2SxEXT从收(OPERSEL=0b01);

I2Sx从收(OPERSEL=0b01);I2SxEXT从发(OPERSEL=0b00)。

注:I2S2EXT和I2S3EXT只用于I2S全双工模式,而不能单独使用。图23 I2S全双工结构图雅特力AT32F425的I2S全双工AT32F425的I2S全双工实现方式和AT32F403A/F407/F435/F437不同。AT32F425可以通过设置SCFG_CFG2寄存器中的I2S_FD将两个SPI组合在一起实现I2S全双工。代码可参考“案例4—AT32F425 I2S全双工DMA方式通信”。CK和WS由I2S主导方提供,附属方的CK和WS对应引脚可以释放给其他功能使用。根据I2S_FD配置,有以下几种组合方式:

I2S_FD=0b00:I2S1~3各自独立半双工工作;

I2S_FD=0b01:I2S1和I2S3组成全双工模式,其中I2S1为主导方,I2S3为附属方。

I2S_FD=0b10:I2S2和I2S3组成全双工模式,其中I2S2为主导方,I2S3为附属方。

I2S_FD=0b11:I2S1和I2S2组成全双工模式,其中I2S1为主导方,I2S2为附属方。

图24 I2S全双工结构图雅特力

I2S错误

ROERR--接收器溢出错误标志此错误标志和SPI一样,请参考前文“2.9.2 ROERR--接收器溢出错误标志”。TUERR--发送器欠载错误标志位在I2S从发模式下,如果在CK上检测到了数据驱动沿,但新的发送数据并没有被写入数据寄存器,则会产生发送器欠载错误,此时硬件会将TUERR位置1。软件读SPI_STS寄存器可清除该标志位。此错误标志仅使用I2S时有效。

I2S中断

I2S和SPI共用一个全局中断向量,即下图25的“I2S中断”和上图18中的“SPI中断”共用同一个中断向量。I2S中断有三个中断源:接收缓冲器满、发送缓冲器空、通信错误(详见上一节“I2S错误”)。这三个中断源分别有对应的使能位。下图中,3个中断使能位定义如下:

RDBFIE:接收数据缓冲器满中断使能(和SPI一样)

TDBEIE:发送数据缓冲器空中断使能(和SPI一样)

ERRIE: 错误中断使能(和SPI一样)

下图中,4个标志位定义如下:

ROERR:接收器溢出错误(和SPI一样)

TUERR:发送器欠载错误(仅I2S有这个错误标志)

RDBF:接收数据缓冲器满(和SPI一样)

TDBE:发送数据缓冲器空(和SPI一样)

图25 I2S中断示意雅特力

SPI案例

注:所有project都是基于keil5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil4/5)进行简单修改即可。

案例1-SPI全双工轮询方式通信

功能简介实现SPI2和SPI3之间的全双工轮询通信。接线如下:spi2 spi3pd1(sck)<--->pc10(sck)pc2(miso)<--->pc11(miso)pd4(mosi)<--->pc12(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\spi\fullduplex_polling软件设计1)配置流程

配置SPI2和SPI3对应的GPIO;

配置SPI2和SPI3通信配置;

开始轮询通信。

2)代码介绍

main函数代码描述

 

雅特力

  • SPI通信配置函数代码描述

 

雅特力

  • SPI GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

案例2-SPI全双工DMA方式通信

功能简介实现SPI2和SPI3之间的全双工DMA通信。接线如下:spi2 spi3pd1(sck)<--->pc10(sck)pc2(miso)<--->pc11(miso)pd4(mosi)<--->pc12(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\spi\motorola_fullduplex_dma软件设计1)配置流程

  • 配置SPI2和SPI3对应的GPIO;
  • 配置SPI2和SPI3的通信配置和DMA配置;
  • 开始DMA通信。

2)代码介绍

  • main函数代码描述

 

雅特力

  • SPI通信配置及DMA配置函数代码描述

雅特力

  • SPI GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

案例3-SPI只收通信

功能简介实现SPI2和SPI3之间的单向只收通信。接线如下:spi2 spi3pd1(sck)<--->pc10(sck)pd4(mosi)<--->pc12(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\spi\only_receive_mode_polling软件设计1)配置流程

  • 配置SPI2和SPI3对应的GPIO;
  • 配置SPI2和SPI3的通信配置;
  • 开始轮询通信。

2)代码介绍

  • main函数代码描述

 

雅特力

  • SPI通信配置代码描述

 

雅特力

  • SPI GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

案例4-SPI半双工中断方式通信

功能简介
实现SPI2和SPI3之间的半双工通信。接线如下:spi2 spi3pd1(sck)<--->pc10(sck)pc2(miso)<--->pc12(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_xxxx\examples\spi\halfduplex_interrupt软件设计1)配置流程

  • 配置SPI2和SPI3对应的GPIO;
  • 设置SPI2和SPI3的中断处理函数;
  • 配置SPI2和SPI3的通信配置;
  • 开始中断通信。

2)代码介绍

  • main函数代码描述

 

雅特力

  • 中断处理函数代码描述

 

雅特力

  • SPI通信配置函数代码描述

 

雅特力

  • SPI GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

案例5-SPI半双工中断方式通信-加收发切换

功能简介实现SPI2和SPI3之间的半双工收发切换通信。接线如下:spi2 spi3pd1(sck)<--->pc10(sck)pc2(miso)<--->pc12(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\spi\halfduplex_transceiver_switch软件设计

1)配置流程

  • 配置SPI2和SPI3对应的GPIO;
  • 设置SPI2和SPI3的中断处理函数;
  • 配置SPI2和SPI3的通信配置;
  • 开始中断通信。

2)代码介绍

  • main函数代码描述

 

雅特力

  • 中断处理函数代码描述

雅特力

  • SPI通信配置函数代码描述

雅特力

  • SPI GPIO配置函数代码描述

雅特力

 

实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

案例6-SPI CRC功能使用

功能简介实现SPI2和SPI3之间的全双工通信和CRC校验。接线如下:spi2 spi3pd1(sck)<--->pc10(sck)pc2(miso)<--->pc11(miso)pd4(mosi)<--->pc12(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\spi\crc_transfer_polling软件设计1)配置流程

  • 配置SPI2和SPI3对应的GPIO;
  • 配置SPI2和SPI3通信配置;
  • 开始轮询通信和CRC校验。

2)代码介绍

  • main函数代码描述

雅特力

  • SPI通信配置函数代码描述

 

雅特力

  • SPI GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

案例7-SPI TI模式使用(TI SSP协议)

功能简介实现SPI2和SPI3之间的TI模式DMA通信。接线如下:spi2 spi3pd0(cs)<--->pa4(cs)pd1(sck)<--->pc10(sck)pc2(miso)<--->pc11(miso)pd4(mosi)<--->pc12(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\spi\ti_fullduplex_dma软件设计1)配置流程

  • 配置SPI2和SPI3对应的GPIO;
  • 配置SPI2和SPI3的通信配置和DMA配置;
  • 开始DMA通信。

2)代码介绍

  • main函数代码描述

 

雅特力

  • SPI通信配置及DMA配置函数代码描述

雅特力

  • SPI GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

案例8-SPI读写FLASH(W25Q128)

功能简介实现SPI2读/写flash(w25q128)。接线如下:spi2 w25q128pd0(cs)<--->cs pinpd1(sck)<--->clk pinpc2(miso)<--->di pinpd4(mosi)<--->do pin资源准备1)硬件环境:一块AT32F437的AT-START BOARD和w25q128电路板w25q128建议电路如下图26:图26 w25q128建议电路雅特力2)软件环境:project\at_start_f437\examples\spi\w25q_flash软件设计1)配置流程

  • 配置SPI2和对应GPIO;
  • 读取flash ID;
  • 擦除flash扇区;
  • 向flash写入数据;
  • 读取上一步flash写入数据的区域。

2)代码介绍

  • main函数代码描述

雅特力

  • spi接口配置函数和gpio配置函数代码描述

雅特力

  • flash擦除函数代码描述

 

雅特力

  • flash读数据函数代码描述

 

雅特力

  • flash读ID函数代码描述

 

雅特力

  • flash写函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和FLASH通信正常。

案例9-SPI使用jtag引脚的配置

功能简介实现SPI2和SPI3之间,使用特殊的jtag引脚的全双工轮询通信。接线如下:spi2 spi3pd0(cs)<--->pa15(cs)pd1(sck)<--->pb3(sck)pc2(miso)<--->pa13(miso)pd4(mosi)<--->pa14(mosi)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\use_jtagpin_hardwarecs_dma软件设计注意:本文仅介绍了AT32F435/F437的SPI使用jtag引脚的配置,其他型号的使用配置稍有不同,请参照对应型号的BSP使用。1)配置流程

  • 配置SPI2和SPI3对应的GPIO;
  • 配置SPI2和SPI3通信配置;
  • 开始轮询通信。

2)代码介绍

  • main函数代码描述

雅特力

  • SPI通信配置函数代码描述

雅特力

  • SPI GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明SPI2和SPI3通信正常。

I2S案例

案例1-I2S半双工DMA方式通信

功能简介实现I2S2和I2S3之间的半双工DMA通信。接线如下:I2S2 I2S3pd0(ws)<--->pa4(ws)pd1(ck)<--->pc10(ck)pd4(sd)<--->pc12(sd)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\i2s\halfduplex_dma软件设计1)配置流程

  • 配置I2S2和I2S3对应的GPIO;
  • 配置I2S2和I2S3的通信配置和DMA配置;
  • 开始DMA通信。

2)代码介绍

  • main函数代码描述

雅特力

  • I2S配置及DMA配置函数代码描述

雅特力

  • GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明I2S2和I2S3通信正常。

案例2-I2S半双工中断方式通信

功能简介实现I2S2和I2S3之间的半双工中断方式通信。接线如下:I2S2 I2S3pd0(ws)<--->pa4(ws)pd1(ck)<--->pc10(ck)pd4(sd)<--->pc12(sd)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\i2s\halfduplex_interrupt软件设计1)配置流程

  • 配置I2S2和I2S3对应的GPIO;
  • 配置I2S2和I2S3的通信配置;
  • 配置中断函数;
  • 开始中断通信。

2)代码介绍

  • main函数代码描述

雅特力

  • I2S配置函数代码描述

雅特力

  • I2S中断配置函数代码描述

雅特力

  • GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明I2S2和I2S3通信正常。

案例3-AT32F403A/F407/F435/F437 I2S全双工DMA方式通信

功能简介实现I2S2和I2S3之间的全双工DMA通信。接线如下:I2S2 I2S3pd0(ws)<--->pa4(ws)pd1(sck)<--->pc10(sck)pc2(ext_sd)rx<--->pc11(ext_sd)txpd4(sd)tx<--->pc12(sd)rx资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_xxxx\examples\i2s\fullduplex_dma软件设计1)配置流程

  • 配置I2S2和I2S3对应的GPIO;
  • 配置I2S2和I2S3的通信配置和DMA配置;
  • 开始DMA通信。

2)代码介绍

  • main函数代码描述

雅特力

  • I2S配置及DMA配置函数代码描述

雅特力

  • GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明I2S2和I2S3全双工通信正常。

案例4-AT32F425 I2S全双工DMA方式通信

功能简介实现I2S1和I2S2组成一个全双工I2S,组成的全双工I2S接口定义如下:pa4(ws)pa5(ck)pa6(mck)pa7(sd tx)pb14(ext_sd rx)由于AT32F425只有3个spi(I2S),只能组成一个全双工I2S,所以不能在同一块AT-START上用两个全双工I2S进行通信。所以本案例使用一个全双工I2S进行自收自发通信,接线如下:pa4(ws)<--->NCpa5(ck)<--->NCpa6(mck)<--->NCpa7(sd)<--->pb14(ext_sd)用户也可以准备两块AT-START板子对测。使用两块板子时,需要注意一块AT-START配置为主机,一块AT-START配置为从机。本案例中的代码仅展示配置为主机,在一块AT-START上进行自发自收的配置。资源准备1)硬件环境:一块AT32F425的AT-START BOARD2)软件环境:project\at_start_f425\examples\i2s\fullduplex_dma软件设计1)配置流程

  • 配置I2S1和I2S2对应的GPIO;
  • 配置I2S1和I2S2的通信配置和DMA配置;
  • 开始DMA通信。

2)代码介绍

  • main函数代码描述

雅特力

  • I2S配置及DMA配置函数代码描述

雅特力

  • GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明I2S全双工通信正常。

案例5-I2S和SPI功能切换通信

功能简介实现SPI2和SPI3之间通信切换到I2S2和I2S3之间通信。接线如下:spi2/i2s2 spi3/i2s3pd0(cs/ws)<--->pa15(cs/ws)pd1(sck/ck)<--->pb3(sck/ck)pd4(mosi/sd)<--->pb5(mosi/sd)资源准备1)硬件环境:一块AT32F437的AT-START BOARD2)软件环境:project\at_start_f437\examples\i2s\spii2s_switch_halfduplex_polling软件设计1)配置流程

  • 配置SPI2/I2S2和SPI3/I2S3对应的GPIO;
  • 配置I2S2和I2S3的通信配置(主发从收);
  • 开始I2S2和I2S3的轮询通信,并核对数据;
  • 配置SPI2和SPI3的通信配置(SPI3为主机半双工只发;SPI2为从机单向只收);
  • 开始SPI2和SPI3的轮询通信,并核对数据;
  • 配置I2S2和I2S3的通信配置(主收从发);
  • 开始I2S2和I2S3的轮询通信,并核对数据。

2)代码介绍

  • main函数代码描述

雅特力

  • I2S配置函数代码描述

雅特力

  • SPI配置函数代码描述

雅特力

  • GPIO配置函数代码描述

雅特力实验效果AT-START BOARD的LED2亮起,说明I2S2和I2S3通信正常,SPI2和SPI3也通信正常。关于雅特力雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(MCU)创新趋势的芯片设计公司,专注于ARM Cortex-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM Cortex-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、ADAS、T-BOX、数字电源、电动工具等终端设备应用,广泛地覆盖5G、物联网、消费、商务及工控等领域。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分