SPI模块基本设计都是master/slave一体,可以减少IO的占用。master接口设计,比较简单因为SPI模块自己是发起方,数据发送和接收的SPISCLK是自主可控的。但是,SPI当slave接口时,spi_sclk来自芯片外部的master。因此,高速模式时,对系统时钟sysclk和spi_sclk有要求,它会涉及到几个问题,1、带宽;2、首字节如何发送;3、后续字节如何发送。
1、带宽
现在我们用的很多ST的MCU芯片SPI主从接口都是叫SSP,它的问题是master模式可以做到很高速度。但是slave模式时,由于用的是同步的方式只能跑在一个比较低的速度,它要求sys_clk > 12 * spi_sclk。假如,master要求的spi_sclk跑10MHz,但是SPI Slave接口能用的系统时钟sysclk只有20MHz,怎么办?解决的办法就是用spi_sclk来发送数据。
2、首字节
用master的过来的时钟lauch数据存在一个问题就是,怎么让sysclk时钟域的首字节数据加载到spi_sclk时钟域。可以有以下几种方式:
A、第一帧发送无效数据,利用第一帧的时间,把数据加载到spi_sclk时钟域;
B、利用CS信号下降沿,主动把首字节数据从加载到spi_sclk时钟域;
C、软件写配置的方式,主动把首字节数据从加载到spi_sclk时钟域;
3、后续字节
后续字节的发送分模式:SPH=0时,N字节的更新由N-1字节的最后一个SPI_SCLK预载入;SPH=1时,N字节的更新由N字节的第一个SPISCLK载入;为啥不一样,可以见下图,SPI_SCLK的数据有效方式。
另外,要实现上面的功能的设计,需要仔细处理同步世界的异步信号。