Serial Peripheral Interface

来源:互联网 发布:石家庄关键词排名优化 编辑:程序博客网 时间:2024/04/27 19:51

  1. 全双工
  2. 8/16/32位收发移位寄存器
  3. 支持3/16/32位总线接口
  4. 2独立32位宽收发FIFO
  5. 主从模式
  6. 独立接收
  7. 最大支持50MHz
CPU(或DMA)能把数据写入SPI_TX_DATA寄存器来写FIFO.寄存器上的数据会自动移动到TX FIFOs,当在FX FIFOs上读取数据时,CPU(或DMA)要进入SPI_RX_DATA寄存器,数据会自动发送到SPI_RX_DATA寄存器中.

CMU寄存器可以控制SPI的操作频率.

SPI有两种模式,分别为主从.SPICLK是主设备端发送到从设备端的,而当片选是低电平的时候,意味着选中冲设备且当在收发打包前设为低电平,数据才有效.

SPI可以CPU或DMA进入FIFOs,数据大小可选8/16/32位.
用户可以定义SPI向CPU中发生中断的触发值.如果用DMA,SPI_MODE_CFG寄存器中的TxDMAOn和RxDMAOn位要设置为使用DMA.DMA访问只支持单发送和4-bust 发送.
对于发送FIFO,在TX FIFO在满的之前DMA的请求信号是高的,也就是说FIFO只要未用到触发值,就能继续装入.
而在接收FIFO,在RX FIFO未空之前,DMA请求信号是高的.也就是说FIFO只要没全部被接收完毕,就能继续读取.
在中断模式或者DMA的4-burst模式中,当Rx FIFO中的采样数据少于触发值时并在此后没有接收到任何其他的数据,那么剩下在FIFO中的字节就叫trailing bytes[随尾字节],要清楚这些Tx FIFO,要用到内部定时器和中断信号,内部定时器的值被定在基于APB总线时钟的1024.当定时器值为0时,中断信号会产生,CPU就会清楚FIFO中的trailing bytes.

SPI在主设备模式下会控制接收的包的数量,设置SFR(PACKET_CNT_REG)来接收任意数量的包,SPI会在包的数量接近PACKET_CNT_REG中的值得时候停止发送SPICLK时钟,而一个包的大小取决于通道的宽度.(当设置宽度为byte,那一个包就是一byte,当设置宽度为word,那一个包就是4个bytes),在功能重载前,是强制软或硬重置的(软重置会清除除特别功能的寄存器,而硬重置会把所有寄存器清除)

片选是低电平使能信号,换言之,一个芯片的片选输入为0的时候,它就被选用了.
可以选择自动设置或者或者人为设置片选,但当认为设置时,应该清除AUTO_N_MANUAL,而NSSOUT位控制片选的电平.
当选用自动控制模式,AUTO_N_MANUAL一定要设置为0,NCS_TIME_COUNT会控制未使能时期的片选,在这个时期,NSSOUT是不能用的.

SPI作为主设备的时候支持最高50MHz的频率,但是由于频率过高(是4412周期的一半),很难让MISO捕捉到,所以SPI提供了3个内部SPICLK的相位延时用的反馈时钟.
反馈时钟的选择取决于spi从设备的MISO输出延时,为了正确地捕捉MISO数据,反馈时钟要满足一下的限制

SPI控制器的MISO输入设置的时间(也就是反馈时钟) < (SPICLK周期/2 - SPI从设备的输出延时时间)        (单位为秒)

如果多个反馈时钟都符合限制,那就选择最小相位延迟的,因为如果大了,可能捕捉到的数据会是下一个周期的.

四中发送数据的格式由CPOL CPHA确定 分别为 00 01 10 11(分别对应内核中的SPI_MODE_0~3的宏.)

SPI的时钟源非常多,也有1~16的分频器和1~256的预分频器,组成SCLK_SPI(最大100MHz),在经过SPI二分频之后,为SPI_CLK(最大50MHz)


调试SPI设备注意事项:
  1. 要先确定SPI设备的连接原理图是对的,GPIO引脚配置对不对得上,GPIO有没有被复用(因为能复用SPI的引脚,通常都能复用其他功能,例如I2C),不确定的话,就打印一下SFN的值.
  2. 然后搭上spi_master控制器,内核的假spidev设备,设置时钟,注册板上信息中的SPI是否成功.
  3. 使用spidev_test,短接MISO和MOSI,看能不能实现自发自收.

0 0