原创 PIC24HJ单片机自学笔记-SPI资料整理

2014-1-16 06:41 2388 17 17 分类: MCU/ 嵌入式 文集: PIC24HJ单片机自学笔记
SPI是一个同步串行通信借口,可以通过SPI与2外设或者其他的控制器通信,外设可以是EEPROM,显示驱动,AD等等,PIC24H的SPI和MOTOROLA的SPI以及SIOP接口兼容。所有的芯片都带SPI,部分芯片带两个SPI接口。
SPI的引脚包括:SDI,SDO,SCK,SS/FSYCN,模块也可以只用两个引脚,或者三个引脚,两个引脚的时候,SDI和SCK使用,而三个引脚的时候,SS不使用。
方框图如下:
20140116063916509.jpg
SPI的寄存器:
  • SPIXSTAT:接收溢出,发送缓冲满,接收缓冲满等状态,使能和去使能
  • SPIXCON1:时钟分频,主从,字/字节选择,时钟极性和数据/数据引脚
  • SPIXCON1:帧通信,以及帧同步脉冲方向,极性和边沿选择
  • SPIXBUF:这个是一个双向的缓冲,使得读写可以同时进行,这里注意,SPIXSR是没有映射的,写入缓存就可以直接发送出去。读的时候也是直接读到缓存。
操作模式
有如下的操作模式
  • 8位和16位数据收发:在MODE16位中设置,注意,正常操作的时候不能设置该位
  • 主从:主从模式就是,主提供时钟和SS信号,主模式下,系统时钟分频给SCK,时钟的脉冲只在发送数据的时候才有脉冲,操作流程如下:
    • 设置成主从模式和使能后,数据写入到SPIXBUF中,此时SPITBF满寄存器设置为1.
    • 然后缓存发到SPIXSR,满标志清零
    • 时钟将数据串行发送到SDO同时SDI的数据到SPIXSR
    • 发送完成,中断控制器设置标志(如果使能),数据从SPIXSR移到SPIXRXB,同时指示接收已满,用户读走后,自动清满标志。
    • 如果满了不读走,继续读入数据会置溢出标志。
    • 发送满标志清后,随时可以写SPIXBUF,当SPIXSR转换完后,可以继续发送。
主从设置流程如下:
  • 如果要设置中断,则先清标志,设置使能,设置优先级
  • 设置主从模式使能位
  • 请接收溢出标志
  • 使能SPI
  • 写数据到SPIXBUF寄存器,立即会开启传送
从机模式:在从机模式,数据的传送和接收使用外部时钟,时钟极性和边沿选择决定数据的传送时间,同样是通过SPIXBUF来读写,从机设置步骤如下:
  • 清SPIXBUF寄存器
  • 如果使用中断,则清标志,使能,优先级。
  • 配置控制寄存器,清主机模式,清数据采样脉冲位,如果时钟边沿选择设置了,设置SSEN使能SS引脚
  • 清接收溢出标志,设置SPI使能
从选择同步:只有当SS为低电平,SSEN使能才能收发信号,如果SS为高,则SDO引脚就失效了。这个功能可以让别的主机,只有需要数据的时候,你这边也准备好了,我就开始收。

SPITBF状态位操作:主机机模式下,SPITBF当用户加载,则为1,发到SR中,则为0,与主机模式一样。但是从机模式就不同了,置一的条件是一样的。但是并不是写入缓存就立马能写出去的哦,还需要等待SS的电平变低。所以只有在数据被读走以后,才能清零。

具体的时序图和设置例程可以参考手册。
  • 帧SPI模式:在主机和从机模式下都可以设置为帧模式,具体的操作为:
    • FRMEN使能,SS引脚用来只是是输入还是输出
    • SPIFSD用来决定SS是输入还是输出
      • 极性和边沿选择为设置
这种模式下,主机模式产生一个帧同步信号给其他器件,从机模式下,从SS上接收同步信号
帧主机模式:这种模式下,主机发帧同步脉冲,数据先写到缓存,然后在帧发送后,数据写到SR中开始收发信号。
帧从机模式:这个是等待一个外部的同步信号以后,再开始发数据。
这种模式看一下下面的图就明白了,SCK是一直发的,只有在SS有效的时候才开始收发数据。
  • 20140116063943684.jpg
另外的几种模式也很简单,看这个同步信号由谁来发。具体看手册。
  • 只收模式:这种模式,DISSDO就行,此时,SDO可做为普通的IO来使用。
  • 错误处理:如果SPIxBUF没有读走,此时新的数据写入,则溢出,溢出需要软件来清零,否则收发功能挂起。可以设置BUF满中断,在程序中清零中断标志。如果溢出,则错误中断标注也置位,这个也需要在软件中清零,SPI错误中断时候,就是读该位。
主模式的时钟计算:
这个简单,FCY经过两次分频得到,FSCK=FCY/主分频*辅分频,也可以参考下表来设置时钟:
20140116064000675.jpg

使用DMA收发
DMA的通道初始化如下:
20140116064017632.jpg
设置请求号是10,这样DMA知道是SPI1请求,读写SPIBUF的地址,知道读写要放入哪个地址中。

通过DMA收发的例子:
下面的例子中,SPI模式配置为主机模式,两个DMA通道中CH0用来发送,CH1用来接收。
配置CH0:数据从RAM到SPI,寄存器后向增长,使用两个ping-pong缓存,每个buffer传送16个数据。
配置CH1:数据从SPI到RAM,寄存器后向增长,使用两个ping-pong缓存,每个buffer传送16个数据。
例程里面,使用PING-PONG模式的中断程序,另外还可以学习如何设置使用DMA和开辟和访问BUFFER空间。

SPI有一点特殊的地方,就是需要写空数据,这个可以在DMA的手册中找到如何写入空的数据。

低功耗模式:
睡眠模式:
如果是主机模式,时钟没了,当然停止工作
如果是从机模式,始终由外面提供,如果中断使能,如果优先级高于CPU,则唤醒。

IDLE模式:
如果使能,同睡眠模式,如果不使能,同正常模式。

在官网上能够找到SPI与数字电位器,AD和EEPROM的操作手册,如下:
20140116064031114.jpg






















PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /3 下一条