DSP

SSP接口 (SYNCHRONOUS SERIAL PORT)

2019-07-13 18:42发布

研究SPI接口时,引申出来的SSP;在网上居然没有找到完整的协议规范文档;只好东拼西凑(多数内容来于博文),但还是没搞明白在硬件上如何兼容其他类型的总线,这种兼容有什么好处?
Synchronous Serial Port (SSP) is a controller that supports the Serial Peripheral Interface (SPI), 4-wire Synchronous Serial Interface (SSI), andMicrowire serial buses. A SSP uses a master-slave paradigm to communicate across its connected bus.
支持MOTO Master SPI, TI Synchronous Serial Interface(SSI),1-bit,4-bit,8-bit SD/SDIO/MMC, CE-ATAand 1-bit, 4-bit MS. 5大类的工作模式,使之成为一个小强般的强大.

这个port的设计目的是为了和i2c,可移动多媒体控制和通信.
SSP还加强了spi模式以支持1-bit的legacy MMC Card.
SSP还支持SPI,SSI的slave操作
SSP有一个专用的DMA通道,可以被CPU&PIO直接控制.

SSP有11个external pins,SSP_SCK, SSP_CMD, SSP_DATA[7:0], and SSP_DETECT.
不同的组合定义了不同的模式

bit rate是由SSPCLK分出来的,分频的reg是clcok_divide,从2到254.还有个类似功能的寄存器,叫clock_rate, 值是从1到256.
于是我们有了SSP_CLK=SSPCLK/(clcok_divide*(1+clock_rate));搞成一个reg不就可以了,两个8bit的,和一个9bit的不是一回事.....

SSP, SSI的Frame Format
每个data format长4到16个bit,是programmable的,MSB first when sending,有两种frame type可以被选,
1 moto SPI, 地球人都知道spi是moto定义的.
2 TI SSI
这两种format,SSP_SCK都是无效的,当SSP idle,只有发数据或收数据的时候,SSP_SCK才会toggle. SSP_SCLK的idle状态是用来表明一个接受timeout的,这个情况发生在接收fifo还有数据在一个timeout周期之后.
对于SPI的frame format,在整个传输中,serial frame(SSn)是低的,被拉低的.
对于SSI的frame format,ssn pin有个一周期的pulse,在clock的上升沿发出,提前于每个传输的frame. 并且规定了,任何SSP,片外的slave都必须在SSP_SCK的rising edge驱动数据,对方会latch数据在faling edge.

那么下面开始具体的讲解这些不同的模式
spi
spi被用在inter-component通信和1-bit的mmc card中
spi dma模式
SPI是一个双工双向的接口.但是很多应用只需要半双工的数据传输.这颗芯片里面有一个单独的channel给SSP,可以被配置成收或发,在DMA收模式中,spi会连续的发送data reg里面的数据,而在发模式,输入会被ignore.
spi的frame format
spi是个四线接口,SSn切换到slave选择上.spi的format主要是inactive state和SSP_SCK的phase可以被配置.
被配置是通过两个寄存器来实现的.
1 clock polarity
0会导致一个steady-state low值在ssp_sck pin上
1的时候如果data没有被传输,那么一个steady-state的一个high值会在ssp_sck上
2clock phase
0数据在第一个时钟沿被capture
1数据在第二个时钟沿被capture,这里说的时钟沿是包括上升沿和下降沿.
通过这两个1bit的寄存器,spi有4种不同的工作方式,下面挨着详细讲解.
(1)polarity=0,phase=0
idle被定义为
ssp_sck force to low;
ssn force to high;
output MOSI(最后字母是I,但是功能那,output,呵呵.) force to low;
if master mode, ssp_sck 是output,反之input
定义了idle后,定义下工作条件,发fifo中已经有数据.
ssn拉低后,传输开始.slave的input信号MISO会立即enable,MOSI也会被使能.
半个周期后,有效的master数据已经摆在输出MOSI上面,现在来看master和slave的数据都有效了,master的ssp_sck在又一个半周期后,开始变高.
data就会在上升沿被capture,并且下降沿propagate.
如果是single word的传输,当所有data被传输后,ssn在最后一个数据被capture后一周期就又变回高,idle了撒
如果是连续的back-to-back传输,ssn必须有个pulse是被拉高的,具体操作类似上面的single word.这是因为phase为0时,slave select pin会freeze data.所以需要ssn变化一下来解决这个问题.
(2)polarity=0,phase=1
idle的定义和上面一样
唯一不同的是
data就会被下降沿capture,并且上升沿propagate
(3)polarity=1,phase=0
对于idle的定义,
唯一的区别是ssp_sck force to high
并且由于这点区别,sck先有failing edge,导致了,data就会被下降沿capture,并且上升沿propagate
(4)polarity=1,phase=1
idle的定义没变
由于phase=1了,第二个时钟沿开始work,于是
data就会在上升沿被capture,并且下降沿propagate.