PIC16F877A的SPI通信模块应用面很广,由于本人要进行ZIGBEE开发,所以么,SPI通信就得学啦!
这里涉及到了几个跟SPI通信有关的寄存器:
SSPCON 同步串行端口控制寄存器
高 低
WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
WCOL:写冲突检测位,软件清零
WCOL=1 前一个数据未完成发送,又有数据写入
WCOL=0 无冲突
SSPOV:接受溢出标志位 仅用于从动方式
SSPOV=1时SSPBUF中还有上次接受的数据,又接到新的数据 产生溢出 SSPSR中数据被丢失
SSPEN:同步串行端口使能位
SSPEN=1时,使能同步串行端口 RC3 RC4 RC5 被设定为SCK SDI SDA引脚
CKP:时钟极性选择(其实这个没有太大作用的)
SSPM3~SSPM0:同步串行端口模式选择
这个么 我自己做了个表格
SSPM3~SSPM0
值
主控/从动
时钟
0000
主控
FOSC/4
0001
主控
FOSC/16
0010
主控
FOSC/64
0011
主控
TMR输出/2
0100
从动
SCK
0101
从动
SCK
同步串行端口状态寄存器 SSPSTAT
高 低
SMP CKE D/A P S R/W UA BF
SMP:采样位
SMP=1 数据输入期间采样
SMP=0 数据输入完毕采样
(个人认为这个并不重要)
注:从动模式的时候SMP=0
CKE:SPI工作模式选择
CKP:与CKE组成4种情况 (不那么重要我就不写了)
D/A P S R/W UA 与SPI无关
BF:缓冲区状态标志 用于接受数据
BF=0 没有接收数据 SSPBUF为空
BF=1 接收到了数据 SSPBUF为满
后来我借鉴了一下SPI初始化汇编程序 写了一段C语言程序 PICC下编译通过
#include "pic.h"
#include "pic1687x.h"
void SPIinstall()
{
PIR1=0;
SSPCON=0x32;
SSPSTAT=0xC0;
TRISC=0x03;
}
void SPISend(unsigned char Data_Send)
{
SSPBUF=Data_Send;
do
{
;
}
while(SSPIF==0);
SSPIF=0x00;
}
void main()
{
SPIinstall();
unsigned char Data;
Data=1;
SPISend(Data);
}
第一次写笔记 可能写的有点像流水账 呵呵