研究SPI接口时,引申出来的SSP;在网上居然没有找到完整的协议规范文档;只好东拼西凑(多数内容来于博文),但还是没搞明白在硬件上如何兼容其他类型的总线,这种兼容有什么好处? A Synchronous Serial Port (SSP) is a controller that supports the Serial Peripheral Interface (SPI), 4-wire Synchronous Serial Interface (SSI), andMicrowireserial 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大类的工作模式,使之成为一个小强般的强大.
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.