jinzhan0132的个人空间 https://bbs.21ic.com/?1039360 [收藏] [复制] [RSS]

日志

SPI使用总结

已有 794 次阅读2015-3-11 10:48 |个人分类:SPI总线|系统分类:单片机| SPI, 通信协议, 主机, 从机

对于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:主机上升沿发,从机上升沿收。

  总结完成,留待以后查看学习。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)