最近一段在找工作,因此面试时,肯定会被问到一些自己做过的项目,因此我打算用一个系列把之前做的项目里用到的一些知识列出来复习一下,也方便以后自己查阅吧。
第一篇. SPI
使用场景:无线数传NRF24L01
1.概念
2.使用
上面这张图,是对SPI通信的一个简单的描述,里面有SSPBUF,这相当于一个FIFO。而SSPSR是设备里的移位寄存器。
然后还需要解释两个概念:
上面概述里说到,SPI有4种模式,那么这四种模式怎么来的,就是靠这个两个概念:
CPOL: 时钟极性, 表示 SPI 在空闲时, 也就是不进行数据传输的时候,时钟信号是高电平还是低电平. 若 CPOL 被设为 1, 那么该设备在空闲时 SCK 管脚下的时钟信号为高电平. 当 CPOL 被设为 0 时则正好相反.
CPHA: 时钟相位, 表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样. 若 CPHA 被设置为 1, 则 SPI 设备在时钟信号变为下降沿时触发数据采样, 在上升沿时发送数据. 当 CPHA 被设为 0 时也正好相反.
好了,知道这两个概念,我来描述一下,SPI主机模式的工作流程:
1.首先我们需要知道从机支持4种模式的哪一种,然后我们将上述的极性跟相位配置好。
2.在要进行数据传输时,现将cs片选使能。使能之后,从机就知道你主机要跟我通信了,这个时候,只要一有时钟信号就可以进行同行了。
3.SSBUF在cpu内会存在两个寄存器,假设为Tx-Data和Rx-Data,好,这时候,我们先将数据写到Tx-Data中,之后,这些数据会被 Master-SSPSR 移位寄存器根据 Bus-Width 自动移入 Master-SSPBUF 里, 然后这些数据又会被 Master-SSPSR 根据 Channel-Width 从 Master-SSPBUF 中移出, 通过 Master-SDO 管脚传给 Slave-SDI 管脚Slave-SSPSR 则把从 Slave-SDI 接收到的数据移入 Slave-SSPBUF 里. 与此同时, Slave-SSPBUF 里面的数据根据每次接收数据的大小(Channel-Width), 通过 Slave-SDO 发往 Master-SDI, Master-SSPSR 再把从 Master-SDI 接收的数据移入 Master-SSPBUF.在单次数据传输完成之后, 用户程序可以通过从 Master 设备的 Rx-Data 寄存器读取 Master 设备数据交换得到的数据.