自我扫盲
首先直观点说说SPI的概念,是Motorola提出的,主要用于芯片级的通信。全程呢叫Serial Perpheral Interface串行外设接口。通用的是主从四线全双工,一根选择线,一根时钟线,一根输出,一根输入,支持一主多从,选择与时钟都由主提供。
灵魂画法如下:
唉,这里面我们一步步来:
- NSS选择,可以约定高电平选择还是低电平选择;
- CLK可以约定是上升沿还是下降沿触发;
- 数据就没什么说的。
硬件资源
好,到这里为止就是简单的扫盲,下面基于NUC970怎么实现。
先看看他上面的资源:
翻手册中~NUC970首先支持两个SPI接口/设备;然后
- 支持主模式
- 可以全双工
- 支持1-32位的传输;高载模式下一次传输两个数据,所以最高是64位(这个没验证)
- 支持大端与小端模式
- 支持双/四IO传输模式(说是FLASH情况下用)
哗啦啦是归根结底可以在下面几个端口玩点花出来:
具体功能我就简单如下说说:
- 可以进行触发电平配置、从机选择等基本配置
- 可以设置自动模式(待填坑)
- 可以设置一次多次传输(1-4)
- 可以设置双/四通道传输
- 可以中断
以上内容都有相关的代码支撑,翻手册查~
操作思路
然后下面讲大致的操作流程(当然,也是待我填坑认证)
- 先设置时钟寄存器,走多少频率的定一定;
- 设置要不要走自动模式,时钟是高电平还是低电平算空闲,时钟的触发沿,选择的触发沿;
- 配置下大端还是小端,每次的传输长度,一次传多少个;
- 淡定的把数据写入寄存器;
- 激动人心的设置GO_BUSY,启动SPI
- 等待SPI中断,或者轮询看看GO_BUSY有没有清零,等待结束;
- 读一下输入寄存器;
- 结束
操作前提:
- 把GPIO管脚配置成SPI,主要是往MPF寄存器对应位置写入0xB。
- 设置时钟CLK_PCLKEN1,有关的是CLK_PCLKEN1[4]与CLK_PCLKEN[5]