内容发布更新时间 : 2024/12/26 9:15:03星期一 下面是文章的全部内容请认真阅读。
SPI接口
发送流程
STM32F10xxx参考手册
当外部主设备发送时钟信号,并且当NSS_WS信号请求传输数据时,发送流程开始。必须先使能从设备,并且写入I2S数据寄存器之后,外部主设备才能开始通信。
对于I2S的MSB对齐和LSB对齐模式,第一个写入数据寄存器的数据项对应左声道的数据。当开始通信时,数据从发送缓冲器传送到移位寄存器,然后标志位TXE置为’1’;这时,要把对应右声道的数据项写入I2S数据寄存器。
标志位CHSIDE提示了目前待传输的数据对应哪个声道。与主模式的发送流程相比,在从模式中,CHSIDE取决于来自外部主I2S的WS信号。这意味着从I2S在接收到主端生成的时钟信号之前,就要准备好第一个要发送的数据。WS信号为’1’表示先发送左声道。
注意: 设置I2SE位为’1’的时间,应当比CK引脚上的主I2S时钟信号早至少2个PCLK时钟周期。
当发出第一位数据的时候,半字数据并行地通过I2S内部总线传输至16位移位寄存器,然后其它位依次按高位在先的顺序从引脚MOSI/SD发出。每次数据从发送缓冲器传送至移位寄存器时,标志位TXE置’1’,如果寄存器SPI_CR2的TXEIE位为’1’,则产生中断。
注意,在对发送缓冲器写入数据前,要确认标志位TXE为’1’。 写入数据的操作取决于所选中的I2S标准,详见23.4.2节。
为了保证连续的音频数据传输,建议在当前传输完成之前,对寄存器SPI_DR写入下一个要传输的数据。如果在代表下一个数据传输的第一个时钟边沿到达之前,新的数据仍然没有写入寄存器SPI_DR,下溢标志位会置’1’,并可能产生中断;它指示软件发送数据错误。如果寄存器SPI_CR2的ERRIE位为’1’,在寄存器SPI_SR的标志位UDR为高是,就会产生中断。建议在这时关闭I2S,然后重新从左声道开始发送数据。
建议在清除I2SE位关闭I2S之前,先等待TXE=1并且BSY=0。
接收流程配置步骤除了第1点外,与发送流程一致。需要通过配置I2SCFG[1:0]来选择主接收
模式。 无论何种数据和声道长度,音频数据总是以16位包的形式接收,即每次填满接收缓存,标志位
RXNE置’1’,如果寄存器SPI_CR2的RXNEIE位为’1’,则产生中断。按照不同的数据和声道长度
设置,收到左声道或者右声道数据会需要1次或者2次传输数据至接收缓冲器的过程。 每次接收到数据(将要从SPI_DR读出)以后即更新CHSIDE,它对应I2S单元产生的WS信号。读取SPI_DR寄存器,将清除RXNE位。读取数据的操作取决于所选中的I2S标准,详见23.4.2节。 在还没有读出前一个接收到的数据,又接收到新数据时,即产生上溢,并设置标志位OVR为’1’;如果寄存器SPI_CR2的ERRIE位为’1’,则产生中断,指示发生了错误。 要关闭I2S功能时,需要在接收到最后一次RXNE=1时将I2SE位清’0’。
注意: 外部主I2S器件需要有通过音频声道发送/接收16位或32位数据包的功能。
23.4.6 状态标志位
有3个状态标志位供用户监控I2S总线的状态。
忙标志位(BSY) BSY标志由硬件设置与清除(写入此位无效果),该标志位指示I2S通信层的状
态。该位为’1’时表明I2S通讯正在进行中,但有一个例外:主接收模式(I2SCFG=11)下,在接收期间
BSY标志始终为低。
在软件要关闭SPI模块之前,可以使用BSY标志检测传输是否结束,这样可以避免破坏最后一次传输,因此需要严格按照下述过程执行。
当传输开始时,BSY标志被置为’1’,除非I2S模块处于主接收模式。下述情况时,该标志位被清除:
●当传输结束时(除了主发送模式,这种模式下通信是连续的); ●当关闭I2S模块时。
484/754
参照2009年12月RM0008ReferenceManual英文第10
版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新
版本
SPI接口
当通信是连续的时候:
STM32F10xxx参考手册
注: ●在主发送模式时,整个传输期间,BSY标志始终为高;
●在从模式时,每个数据项传输之间,BSY标志在1个I2S时钟周期内变低。
不要使用BSY标志处理每一个数据项的发送和接收,最好使用TXE和RXNE标志。
发送缓存空标志位(TXE) 该标志位为’1’表示发送缓冲器为空,可以对发送缓冲器写入新的待发
送数据。在发送缓冲器中已有数据时,标志位清’0’。在I2S被关闭时(I2SE位为’0’),该标志位也为’0’。
接收缓存非空标志位(RXNE) 该标志位置’1’表示在接收缓存里有接收到的有效数据。在读取寄存器SPI_DR时,该位清’0’。 声道标志位(CHSIDE)
在发送模式下,该标志位在TXE为高时刷新,指示从SD引脚上发送的数据所在的声道。如果在从发送模式下发生了下溢错误,该标志位的值无效,在重新开始通讯前需要把I2S关闭再打开。 在接收模式下,该标志位在寄存器SPI_DR接收到数据时刷新,指示接收到的数据所在的声道。注意,如果发生错误(如上溢OVR),该标志位无意义,需要将I2S关闭再打开(同时,如果必要修改I2S的配置)。
在PCM标准下,无论短帧格式还是长帧格式,这个标志位都没有意义。
如果寄存器SPI_SR的标志位OVR或UDR为’1’,且寄存器SPI_CR2的ERRIE位为’1’,则会产生中断。(中断源已经被清除后)可以通过读寄存器SPI_SR来清除中断标志。
23.4.7 错误标志位
I2S单元有2个错误标志位。
下溢标志位(UDR)在从发送模式下,如果数据传输的第一个时钟边沿到达时,新的数据仍然没有
写入SPI_DR寄存器,该标志位会被置’1’。在寄存器SPI_I2SCFGR的I2SMOD位置’1’后,该标志位才有效。如果
寄存器SPI_CR2的ERRIE位为’1’,就会产生中断。 通过对寄存器SPI_SR进行读操作来清除该标志位。
上溢标志位(OVR) 如果还没有读出前一个接收到的数据时,又接收到新的数据,即产生上溢,
该标志位置’1’,如果寄存器SPI_CR2的ERRIE位为’1’,则产生中断指示发生了错误。 这时,接收缓存的内容,不会刷新为从发送设备送来的新数据。对寄存器SPI_DR的读操作返回最后一个正确接收到的数据。其他所有在上溢发生后由发送设备发出的16位数据都会丢失。 通过先读寄存器SPI_SR再读寄存器SPI_DR,来清除该标志位。
23.4.8 I2S中断
下表列举了全部I2S中断表170 I2S中断请求
中断事件 发送缓冲器空标志位 接收缓冲器非空标志位 下溢标志位 上溢标志位 事件标志位 TXE RXNE OVR UDR 使能标志位 TXEIE RXNEIE ERRIE 23.4.9 DMA功能
DMA的工作方式在I2S模式除了CRC功能不可用以外,与在SPI模式完全相同。因为在I2S模式下没有数据传输保护系统。
485/754
参照2009年12月RM0008ReferenceManual英文第10
版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新
版本
SPI接口
23.5
SPI和I2S寄存器描述
STM32F10xxx参考手册
关于寄存器描述中所用到的缩略词可参见第1.1节。 可以用半字(16位)或字(32位)的方式操作这些外设寄存器。
23.5.1 SPI控制寄存器1(SPI_CR1)(I2S模式下不使用)
地址偏移:0x00复位值:0x0000
15 14 13 12 11 DFF rw 10 RXONLY rw 9 SSM rw 8 SSI 7 6 5 4 BR[2:0] 3 2 1 0
BIDIBIDICRCEN CRCMODE OE NEXT rw rw rw rw
LSBSPE FIRST rw rw rw MSTR CPOL CPHA rw rw rw rw rw rw 位15 BIDIMODE:双向数据模式使能(Bidirectionaldatamodeenable) 0:选择“双线双向”模式; 1:选择“单线双向”模式。 注:IS模式下不使用。 2位14 BIDIOE:双向模式下的输出使能(Outputenableinbidirectionalmode) 和BIDIMODE位一起决定在“单线双向”模式下数据的输出方向 0:输出禁止(只收模式); 1:输出使能(只发模式)。 这个“单线”数据线在主设备端为MOSI引脚,在从设备端为MISO引脚。 注:IS模式下不使用。 2位13 CRCEN:硬件CRC校验使能(HardwareCRCcalculationenable)0:禁止CRC计算; 1:启动CRC计算。 注:只有在禁止SPI时(SPE=0),才能写该位,否则出错。 该位只能在全双工模式下使用。 注:IS模式下不使用。 2位12 CRCNEXT:下一个发送CRC (Transmit CRCnext) 0:下一个发送的值来自发送缓冲区。 1:下一个发送的值来自发送CRC寄存器。 注:在SPI_DR寄存器写入最后一个数据后应马上设置该位。 注:IS模式下不使用。 2位11 DFF:数据帧格式(Dataframeformat) 0:使用8位数据帧格式进行发送/接收; 1:使用16位数据帧格式进行发送/接收。 注:只有当SPI禁止(SPE=0)时,才能写该位,否则出错。 注:IS模式下不使用。 2位10 RXONLY:只接收(Receiveonly) 该位和BIDIMODE位一起决定在“双线双向”模式下的传输方向。在多个从设备的配置中,在 未被访问的从设备上该位被置1,使得只有被访问的从设备有输出,从而不会造成数据线上数 据冲突。 0:全双工(发送和接收); 1:禁止输出(只接收模式)。 注:IS模式下不使用。 2位9 SSM:软件从设备管理(Softwareslavemanagement) 当SSM被置位时,NSS引脚上的电平由SSI位的值决定。 0:禁止软件从设备管理; 1:启用软件从设备管理。 注:IS模式下不使用。 2
486/754
参照2009年12月RM0008ReferenceManual英文第10
版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新
版本
SPI接口
位8 SSI:内部从设备选择(Internalslaveselect)该位只在SSM位为’1’时有意义。它决定了NSS上的电平,在NSS引脚上的I/O操作无效。 注:IS模式下不使用。 2STM32F10xxx参考手册 位7 LSBFIRST:帧格式(Frameformat) 0:先发送MSB; 1:先发送LSB。 注:当通信在进行时不能改变该位的值。 注:IS模式下不使用。 2位6 SPE:SPI使能(SPIenable)0:禁止SPI设备; 1:开启SPI设备。 注:IS模式下不使用。 BR[2:0]:波特率控制(Baudratecontrol) 000:fPCLK/2 100:fPCLK/32 22位5:3 001:fPCLK/4 101:fPCLK/64 010:fPCLK/8 110:fPCLK/128 011:fPCLK/16 111:fPCLK/256 当通信正在进行的时候,不能修改这些位。 注意:IS模式下不使用。 位2 MSTR:主设备选择(Masterselection) 0:配置为从设备; 1:配置为主设备。 注:当通信正在进行的时候,不能修改该位。 注:IS模式下不使用。 位1 CPOL:时钟极性(Clockpolarity) 0:空闲状态时,SCK保持低电平; 1:空闲状态时,SCK保持高电平。 注:当通信正在进行的时候,不能修改该位。 注:IS模式下不使用。 位0 CPHA:时钟相位(Clockphase) 0:数据采样从第一个时钟边沿开始; 1:数据采样从第二个时钟边沿开始。 注:当通信正在进行的时候,不能修改该位。 注:IS模式下不使用。
22223.5.2 SPI控制寄存器2(SPI_CR2)
地址偏移:0x04复位值:0x0000
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
保留 res
TXEIE RXNEIE ERRIE rw rw rw 保留 res SSOE TXDMARXDMAEN EN rw rw rw 位15:8 位7 保留位,硬件强制为0 TXEIE:发送缓冲区空中断使能(Txbufferemptyinterruptenable)0:禁止TXE中断; 1:允许TXE中断,当TXE标志置位为’1’时产生中断请求。 RXNEIE:接收缓冲区非空中断使能(RXbuffernotemptyinterruptenable)0:禁止RXNE中断; 1:允许RXNE中断,当RXNE标志置位时产生中断请求。 位6
487/754
参照2009年12月RM0008ReferenceManual英文第10
版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新
版本
SPI接口
位5 ERRIR:错误中断使能(Errorinterruptenable)当错误(CRCERR、OVR、MODF)产生时,该位控制是否产生中断0:禁止错误中断; 1:允许错误中断。 保留位,硬件强制为0。 STM32F10xxx参考手册 位4:3 位2 SSOE:SS输出使能(SSoutputenable)0:禁止在主模式下SS输出,该设备可以工作在多主设备模式; 1:设备开启时,开启主模式下SS输出,该设备不能工作在多主设备模式。 注:IS模式下不使用。 2位1 TXDMAEN:发送缓冲区DMA使能(TxbufferDMAenable)当该位被设置时,TXE标志一旦被置位就发出DMA请求0:禁止发送缓冲区DMA; 1:启动发送缓冲区DMA。 RXDMAEN:接收缓冲区DMA使能(RxbufferDMAenable)当该位被设置时,RXNE标志一旦被置位就发出DMA请求0:禁止接收缓冲区DMA; 1:启动接收缓冲区DMA。 位0
23.5.3 SPI状态寄存器(SPI_SR)
地址偏移:0x08复位值:0x0002
15 14 13 12 11 10 9 8 7 BSY r 6 5 4 3 2 1 0
保留 res
OVR MODF CRCUDR CHSIDE TXE RXNE ERR r r rcw0 r r r r 位15:8 位7 保留位,硬件强制为0 BSY:忙标志(Busyflag)0:SPI不忙; 1:SPI正忙于通信,或者发送缓冲非空。 该位由硬件置位或者复位。 注:使用这个标志时需要特别注意,详见第23.3.7节和第23.3.8节。 OVR:溢出标志(Overrunflag)0:没有出现溢出错误; 1:出现溢出错误。 该位由硬件置位,由软件序列复位。关于软件序列的详细信息,参考23.4.7节。 MODF:模式错误(Modefault)0:没有出现模式错误; 1:出现模式错误。 该位由硬件置位,由软件序列复位。关于软件序列的详细信息,参考23.3.10节。 注:IS模式下不使用。 2位6 位5 位4 CRCERR:CRC错误标志(CRCerrorflag)0:收到的CRC值和SPI_RXCRCR寄存器中的值匹配; 1:收到的CRC值和SPI_RXCRCR寄存器中的值不匹配。 该位由硬件置位,由软件写’0’而复位。 注:IS模式下不使用。 2
488/754
参照2009年12月RM0008ReferenceManual英文第10
版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新
版本