SPI接口共涉及到11个寄存器,下面就来对它们进行具体分析。
先来看SPI配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40058000(SPI0),0x4005C000(SPI1)。
(1)第0位(ENABLE)为SPI使能位,值为0时禁用SPI接口,值为1时使能SPI接口,默认为禁止。
(2)第1位为保留位,写入时只能写0。
(3)第2位(MASTER)为主机模式选择位,值为0时是从机模式,此时SCK、MOSI和SSEL信号为输入,MISO为输出,值为1时是主机模式,此时SCK、MOSI和SSEL信号为输出,MISO为输入,默认为从机模式。
(4)第3位(LSBF)为LSB优先模式使能位,值为0时是标准模式,数据以标准MSB优先顺序发送和接收,值为1时是反转模式,数据以反转顺序发送和接收(LSB优先),默认为标准模式。
(5)第4位(CPHA)为时钟相位选择位,值为0时是更改模式,SPI在传输的第一个时钟转换时捕捉串行数据(此时时钟向休闲状态的反方向变动),数据在下一个边沿改变,值为1时是捕获模式,SPI在传输的第一个时钟转换时改变串行数据(此时时钟向休闲状态的反方向变动),在下一个边沿捕捉数据,默认为更改模式。
(6)第5位(CPOL)为时钟极性选择位,值为0时为低电平,即时钟休闲状态(两次传输之间)为低电平,值为1时为高电平,即时钟休闲状态(两次传输之间)为高电平,默认为低电平。
(7)第6位为保留位,写入时只能写0。
(8)第7位(LOOP)为环回模式使能位,环回模式仅适用于主机模式,它将发送和接收数据相连,支持简单的软件测试,值为0时禁止,值为1时使能,默认为禁止。
(9)第8位(SPOL0)为SSEL0极性选择位,值为0时选择低电平有效,值为1时选择高电平有效,默认为低电平有效。
(10)第9位(SPOL1)为SSEL1极性选择位,值为0时选择低电平有效,值为1时选择高电平有效,默认为低电平有效。
(11)第10位(SPOL2)为SSEL2极性选择位,值为0时选择低电平有效,值为1时选择高电平有效,默认为低电平有效。
(12)第11位(SPOL3)为SSEL3极性选择位,值为0时选择低电平有效,值为1时选择高电平有效,默认为低电平有效。
(13)第12到31位为保留位,写入时只能写0。
接下来看SPI延迟寄存器DLY,下表是它的全部位结构,其地址分别为0x40058004(SPI0), 0x4005C004(SPI1)。
(1)第0到3位(PRE_DELAY)用来控制SSEL有效和数据开始传输之间的时间,SSEL有效和第一个时钟沿之间始终存在1个SPI时钟,它不视为本预延迟的部分,值为0时表示未插入额外延时时间,值从0x1到0xF分别表示插入1到15个SPI时钟的延时时间,默认为未插入额外延时时间。
(2)第4到7位(POST_DELAY)用来控制数据传输结束和SSEL无效之间的时间,值为0时表示未插入额外延时时间,值从0x1到0xF分别表示插入1到15个SPI时钟的延时时间,默认为未插入额外延时时间。
(3)第8到11位(FRAME_DELAY)是当EOF标志置位,则控制当前帧和下一帧(如果EOT置位则为SSEL无效)之间的最短时间,值为0时表示未插入额外延时时间,值从0x1到0xF分别表示插入1到15个SPI时钟的延时时间,默认为未插入额外延时时间。
(4)第12到15位(TRANSFER_DELAY)用来控制两次传输之间SSEL处于无效的最短时间,当值为0x0时表示SSEL处于无效的最短时间为1个SPI时钟时间(零增量时间),当值为0x1时表示SSEL处于无效的最短时间为2个SPI时钟时间,以此类推,当值为0xF时表示SSEL处于无效的最短时间为16个SPI时钟时间,默认为零增量时间。
(5)第16到31位为保留位,写入时只能写0。
接下来是SPI状态寄存器STAT,下表是它的全部位结构,其地址分别为0x40058008(SPI0), 0x4005C008(SPI1)。
(1)第0位(RXRDY)为SPI接收器就绪标志位,值为1时表示可从接收器缓冲区中读取数据,对RXDAT寄存器执行读取操作后自动清除该位。
(2)第1位(TXRDY)为SPI发送器就绪标志位,值为1时表示数据可以被写入发送缓冲区,可能在继续传输之前的数据。数据写入TXDAT或TXDATCTL时自动清零该位,直至数据移入发送移位寄存器,该位默认值便为1。
(3)第2位(RXOV)为接收器溢出中断标志位,此标志仅适用于从机模式(Master=0时),当检测到接收字符,但接收器缓冲区正被使用时,此标志置位,若这种情况发生,则保留接收器缓冲区内容,丢弃输入数据,若本位被置位,则SPI接收的数据应视为未定义。
(4)第3位(TXUR)为发送器下溢中断标志位,此标志仅适用于从机模式(Master=0时),这种情况下, 如果发送器空闲,则发送器必须在下一个输入时钟开始时发送新数据,若此时发送器保持寄存器中该数据不可用,则无数据可供传输,此标志置位,若本位被置位,则SPI发送的数据应视为未定义。
(5)第4位(SSA)为从机选择有效标志位,无论主机还是从机模式,只要任何从机选择从无效转换到有效状态,此标志便置位,这样可以确定SPI发送/接收功能何时变为繁忙,并允许在开始执行从机模式访问时将器件从低功耗模式唤醒,本标志必须通过软件才能清零。
(6)第5位(SSD)为从机选择无效标志位,无论主机还是从机模式,只要任何有效状态的从机选择转换到无效状态,此标志便置位,这样可以确定SPI发送/接收功能何时变为空闲,本标志必须通过软件才能清零。
(7)第6位(STALLED)为终止状态标志位,表示SPI是否处于停止条件。
(8)第7位(ENDTRANSFER)为传输结束控制位,当发送器完成任意执行中的操作时,软件可以置位该位,强制结束当前传输,就好像EOT标志已经在最后一次传输之前完成置位,此功能可以为这种情况提供支持,即它不知道发送数据是何时写入的,并用来结束传输,随着传输即将结束,当发送器变为空闲时,该位清零,以这种方式强制传输结束可以插入任何指定的FRAME_DELAY和TRANSFER_DELAY。
(9)第8位(MSTIDLE)为主机空闲状态标志位,只要SPI主机功能完全空闲,该位便被置1,这意味着发送保持寄存器为空,且发送器未执行数据发送任务,该位默认值便为1。
(10)第9到31位为保留位,写入时只能写0。
接下来看SPI中断使能读取和置位寄存器INTENSET,下表是它的全部位结构,其地址分别为0x4005800C(SPI0)、0x4005C00C(SPI1)。
(1)第0位(RXRDYEN)用于判断当接收器数据可用时确定是否发生了中断,值为0时表示接收器数据可用时不产生中断,值为1时表示接收器数据在RXDAT寄存器中可用时产生中断,默认为不产生中断。
(2)第1位(TXRDYEN)用于判断当发送器保持寄存器可用时确定是否发生了中断,值为0时表示发送器保持寄存器可用时不产生中断,值为1时表示数据可写入TXDAT时产生中断,默认为不产生中断。
(3)第2位(RXOVEN)用于判断当发生接收器溢出时,确定是否发生了中断,在从机模式下,当接收器需要将新接收的数据移动到RXDAT寄存器,而该寄存器正在使用时,就会发生这种情况,主机模式下,接口通过不允许进行可能导致接收器溢出的最新传输而防止接收器溢出,值为0时表示发生接收器溢出时不产生中断,值为1时表示若发生了接收器溢出,则产生中断,默认为不产生中断。
(4)第3位(TXUREN)用于判断当发生发送器下溢时,确定是否发生了中断。在从机模式下,当需要发送数据但无可用数据时,就会发生这种情况,值为0时表示发送器下溢时不产生中断,值为1时表示若发生了发送器下溢,则产生中断,默认为不产生中断。
(5)第4位(SSAEN)用于判断当从机选择有效时,确定是否产生中断,值为0时表示任何从机选择从无效变为有效都不会产生中断,值为1时表示任何从机选择从无效变为有效都会产生中断,默认为不产生中断。
(6)第5位(SSDEN)用于判断当从机选择无效时,确定是否产生中断,值为0时表示当所有已生效的从机选择变为无效时,不产生中断,值为1时表示当所有已生效的从机选择变为无效时,产生中断,默认为不产生中断。
(7)第6到31位为保留位,写入时只能写0。
接下来看SPI中断使能清零寄存器INTENCLR,下表是它的全部位结构,其地址分别为0x40058010(SPI0)、0x4005C010(SPI1)。由于上面的INTENSET寄存器只能写1不能写0,所以INTENCLR寄存器就是实现INTENSET寄存器清零的。
(1)第0到5位用于对应清零上面INTENSET寄存器中相应的位,如果向这些位写入1,便会将INTENSET寄存器中相对应的位清零。
(2)第6到31位为保留位,写入时只能写0。
--待续--
相关文章