SPI双向通信时,主机收到的数据有问题!
时间:10-02
整理:3721RD
点击:
最近在做SPI的双向通信,采用两个PIC16F1828,现在的问题是从机能收到主机发送的数据,但是主机收到的从机发送的顺序却有问题。比如主机发送的数据是0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,从机能按顺序收到主机发送的数据。从机发送的数据是0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,但是主机收到的数据却是0x10,0x11,0x17,0x01,0x02,0x03,0x16,0x17。有时候主机收到的数据顺序又是正确的,不知道是什么原因,请大神指点指点~
主机配置发送接收程序
void SPI_INIT(void)//SPI的配置
{
SPI_SCK_OUT;
SPI_SDO_OUT;
SPI_SDI_IN;
SPI_nSS_OUT;
ANSELB=0X00;
SSP1STAT=0X80;
SSPCON=0X32;
SPI_nSS=1;
INTCON=0XC0;
PIE1=0X08;//开MSSP中断
PIR1=0X00;//清零MSSP中断
}
void SPI_WRITE(uchar data)
{
uchar back;
SPI_nSS=0;
DELAY(20);
SSP1BUF=data;
back=SSP1BUF;
SPI_nSS=1;
DELAY(20);
}
//中断方式接收
void interrupt mssp(void)
{
if(SSP1IF)
{
SSP1IF=0;
stage4=stage3;
stage3=SSPBUF;
if((stage4==0x10)&&(stage3==0x11))
{ begin=1;j=0; }
if(begin==1)
{
receive_spi[j++]=stage3;
if(j==8)
{ begin=0;j=0;send=1; }
}}}
从机配置发送接收程序
void SPI_INIT(void)
{
SPI_SCK_IN;
SPI_SDO_OUT;
SPI_SDI_IN;
SPI_nSS_IN;
ANSELB=0X00;
ANSELC=0X00;
SSP1STAT=0X00;
SSPCON=0X34;
INTCON=0XC0;
PIE1=0X08;//开MSSP中断
PIR1=0X00;//清零MSSP中断
}
//从机SPI发送
void SPI_WRITE(uchar data)
{
uchar back;
DELAY(20);
SSPBUF=data;
back=SSPBUF;
DELAY(20);
}//中断方式接收
void interrupt mssp(void)
{
if(SSP1IF)
{
SSP1IF=0;
stage4=stage3;
stage3=SSP1BUF;
if((stage4==0x00)&&(stage3==0x01))
{ begin=1;j=0; }
if(begin==1)
{
receive[j++]=stage3;
if(j==8)
{ begin=0;j=0;send=1; }
}}}
主机配置发送接收程序
void SPI_INIT(void)//SPI的配置
{
SPI_SCK_OUT;
SPI_SDO_OUT;
SPI_SDI_IN;
SPI_nSS_OUT;
ANSELB=0X00;
SSP1STAT=0X80;
SSPCON=0X32;
SPI_nSS=1;
INTCON=0XC0;
PIE1=0X08;//开MSSP中断
PIR1=0X00;//清零MSSP中断
}
void SPI_WRITE(uchar data)
{
uchar back;
SPI_nSS=0;
DELAY(20);
SSP1BUF=data;
back=SSP1BUF;
SPI_nSS=1;
DELAY(20);
}
//中断方式接收
void interrupt mssp(void)
{
if(SSP1IF)
{
SSP1IF=0;
stage4=stage3;
stage3=SSPBUF;
if((stage4==0x10)&&(stage3==0x11))
{ begin=1;j=0; }
if(begin==1)
{
receive_spi[j++]=stage3;
if(j==8)
{ begin=0;j=0;send=1; }
}}}
从机配置发送接收程序
void SPI_INIT(void)
{
SPI_SCK_IN;
SPI_SDO_OUT;
SPI_SDI_IN;
SPI_nSS_IN;
ANSELB=0X00;
ANSELC=0X00;
SSP1STAT=0X00;
SSPCON=0X34;
INTCON=0XC0;
PIE1=0X08;//开MSSP中断
PIR1=0X00;//清零MSSP中断
}
//从机SPI发送
void SPI_WRITE(uchar data)
{
uchar back;
DELAY(20);
SSPBUF=data;
back=SSPBUF;
DELAY(20);
}//中断方式接收
void interrupt mssp(void)
{
if(SSP1IF)
{
SSP1IF=0;
stage4=stage3;
stage3=SSP1BUF;
if((stage4==0x00)&&(stage3==0x01))
{ begin=1;j=0; }
if(begin==1)
{
receive[j++]=stage3;
if(j==8)
{ begin=0;j=0;send=1; }
}}}
好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难好难
仔细看手册还是可以搞定的嘛!
还是要仔细看手册,然后多调试
还是得仔细研究研究手册
可能是你烧写程序或发送完,硬件的缓存或内存有残留,需要清空,不然显示的时候就会出现这种有时对,有时顺序又出错的问题!最好每次发送把recevice[]清空!