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)rxpc11(ext_sd)txpd4(sd)txpc12(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、物联网、消费、商务及工控等领域。
中国联通提供多种基础能力构建开放化的终端解决方案生态
SOP8士兰微SDH8322S非隔离电源芯片AC-DC控制IC
THE MATHWORKS推出新版并行计算工具箱
Linux驱动入门-设备树DTS概念介绍
中南大学物理院长一行到访奥士康深调研工作
AT32讲堂048 | 雅特力AT32 MCU SPI/I2S入门指南
Luminus宣布推出新款园艺板上芯片LED设备
同步发电机的工作原理 同步发电机作用
Argo AI将建立一个自动驾驶汽车研究中心
接地和接零的基本目的与其作用
PCBA设计相关的检验流程介绍
Chiplet可以让SoC设计变得更容易吗?
iPhone12无线充电器推荐
选择烧结银的经验总结
4G模块的应用场景 4G通信模块功能
亚马逊向用户开放VR/AR创建工具Amazon Sumerian
e传媒系统软件定制
艾为电子测试中心二期正式投入使用
CPU里坏了部分晶体管,还可以使用吗
华为P9、小米5等四款热销手机如今都清仓降价,不能再等了!