小人现在用两个PIC16F690单片机用SPI通信实验室,Master给slave发8位数据,slave收到数据后,用LED显示出来。
两个单片机的晶振都是32.768KHz
单片机之间的链接:
master slave
RB5-----------------/SS
SDO-----------------SDI
SDI-----------------SDO
SCK-----------------SCK
slave的RC0 ~ RC5 分别接LED
master程序:
#include<pic.h>
__CONFIG(0x00e8);
#define nop() asm("nop")
unsigned char data_temp;
void init()
{
TRISB4 = 1; //SDI设置为输入
TRISB5 = 0; //链接片选,设置为输出
TRISB6 = 0; //时钟设置为输出
TRISC7 = 0; //SDO设置为输出
SSPSTAT = 0x80; //SPI初始化
SSPCON = 0x30;
}
unsigned char spi_comm(unsigned char data)
{
SSPBUF=data;
while(!SSPIF);
SSPIF=0;
data_temp=SSPBUF;
return data_temp;
}
void delay(unsigned int x)
{
unsigned int a,b;
for(a=x;a>0;a--)
for(b=50;b>0;b--);
}
void main()
{
init();
while(1)
{
RB5 = 0;
delay(1);
spi_comm(0xaa); //发送程序
delay(1);
RB5 = 1;
}
}
slave程序:
#include<pic.h>
__CONFIG(0x00e8);
#define nop() asm("nop")
unsigned char data_temp;
void init()
{
TRISB4 = 1; //SDI 设置为输入
TRISB6 = 1; //时钟设置为输入
TRISC = 0x40; //片选设置为输入,SDO设置为输出,连接LED的管脚也设置为输出
SSPSTAT = 0x00;
SSPCON = 0x34;
}
unsigned char spi_comm(unsigned char data)
{
SSPBUF=data;
while(!SSPIF);
SSPIF=0;
data_temp=SSPBUF;
return data_temp;
}
void main()
{
unsigned char val;
init();
while(1)
{
val = spi_comm(0);
PORTC = PORTC|(val & 0x3f);
}
}
上电以后,LED5(连接RC5)是亮的,其他都不亮。
这个问题困扰我好多天了,用示波器看过,Master发送的数据没有问题,不知道问题出在哪里,请高手帮忙。
万分感谢!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
另外master的spi_comm应该是一个void型的函数。
可能存在其他的问题,最好参考microchip官方网站上的spi程序例程。
一周热门 更多>