|||
对于SPI通信,一直不“陌生”,从最早使用它到现在已经三四年了。玩无线模块的时候就是SPI通信。具体点来说就是“芯片”是客户机,程序已被厂家固化,我需要做的就是写出主机程序,给从机提供时钟。当初用的还是stc89c51单片机,模拟SPI。也仅仅是主机的程序,所以对它的认识也仅仅停留在MISO,MOSI,的阶段,甚至连含义都不知道(以后遇到新东西尽量都搞明白)。
最近一个项目需要在不同型号的单片机之间用SPI通信,于是才发现自己之前了解的是多么少。SPI总线是一个环形结构,CS片选使能,CLK时钟,MISO,MOSI,数据线;其中:
MOSI:主机输出,从机输入数据线,该线一段接主机的SDO,另一端接从机的SDI;
MISO:主机输入,从机输出数据线,该线一段接主机的SDI,另一端接从机的SDO;
这两个概念要搞清楚,否则设计电路容易搞混。
这些知道了,接下来就是SPI的四种工作模式,这四种模式不同的芯片厂商所给的说明也会有不同,以下是在网络上搜集的一些事例:
Eg1:
| CPOL | CPOH |
mode 0 | 0 | 0 |
mode 1 | 0 | 1 |
mode 2 | 1 | 0 |
mode 3 | 1 | 1 |
Eg2:
| CPOL | CPHA |
mode 0 | 0 | 0 |
mode 1 | 0 | 1 |
mode 2 | 1 | 0 |
mode 3 | 1 | 1 |
Eg3:
| CPOL | NCPHA |
mode 0 | 0 | 1 |
mode 1 | 0 | 0 |
mode 2 | 1 | 1 |
mode 3 | 1 | 0 |
如此看来,其实大同小异,网上说他们这样设计估计就是为了避开摩托罗拉的版权吧;
这里我用到的处理器是microchip和TI的,他们的定义不同,描述也不同。
这里TI的描述更好理解,那我们就把microchip的翻译为TI的。
首先TI的四种模式:
POLARITY PHASE
0 0 即下降沿输出,上升沿输入,空闲高电平(无延时);(1)
0 1 即下降沿输出,上升沿输入,空闲高电平(半个周期的延时);(2)
1 0 即上升沿输出,下降沿输入,空闲低电平(无延时);(3)
1 1 即上升沿输出,下降沿输入,空闲低电平(半个周期的延时);(4)
Microchip的四种模式:
CKE CKP
0 0 空闲低电平,由空闲变有效发送数据(1)
0 1 空闲高电平,由空闲变有效发送数据(2)
1 0 空闲低电平,由有效变空闲发送数据(3)
1 1 空闲高电平,由有效变空闲发送数据(4)
Microchip的翻译为TI的:
CKE CKP
0 0 上升沿发送数据,下降沿接收数据,默认低电平
0 1 下降沿发送数据,上升沿接收数据,默认高电平
1 0 下降沿发送数据,上升沿接收数据,默认低电平
1 1 上升沿发送数据,下降沿接收数据,默认高电平
这里就可以看到不同的芯片厂家规定的SPI通信的不同规范了,MICROCHIP的不支持延时。这样TI的(1)和(3)模式对应microchip的(2)(1)(均作为主机或从机来说),若TI的为主机,microchip的位从机,那TI的(1)和(3)对应后者的(4)和(3)。这样匹配就没有问题。
以上两个片子也是这次使用的两个片子。选定一个模式后,即开始通信,接下来就是通信的过程了。TI为主机,microchip为从机。SPI协议就是发的同时也在收,一个时钟信号的同时,主机的BUF低位移出1bit,同时高位接收到从机移低位出的1bit。即一个时钟信号,主机和从机都完成了收发。注意到了这一个特点,就会明白刚开始主机发完成的时候,BUF里的垃圾数据的来源了,就是从机BUF里的数据。关于这一特点在具体使用中的体会最为深刻,没有同时做主机和从机的经历,很难体会到。这里吧搜集的资料再记录下:
举例:
假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据
脉冲 主机sbuff 从机sbuff sdi sdo
0 10101010 01010101 0 0
1上 0101010x 1010101x 0 1
1下 01010100 10101011 0 1
2上 1010100x 0101011x 1 0
2下 10101001 01010110 1 0
3上 0101001x 1010110x 0 1
3下 01010010 10101101 0 1
4上 1010010x 0101101x 1 0
4下 10100101 01011010 1 0
知道了这些后,以后再写主从机的SPI的时候,关键点就是模式的匹配,主机发的时候,从机收,但是他们的时钟是一样的。
Eg:主机上升沿发,从机上升沿收。
总结完成,留待以后查看学习。