当前位置: 代码迷 >> 单片机 >> STC12C5A60S2的SPI的有关问题
  详细解决方案

STC12C5A60S2的SPI的有关问题

热度:140   发布时间:2016-04-28 14:55:25.0
STC12C5A60S2的SPI的问题
我用两台STC的片子在最小系统上基于SPI通信,
目前从机根本接收不到主机发来的字节,主机的循环一直在执行,而从机则卡在了SPISwap(tempdata);这里,原因是SPIF位一直是0。
请大家看看我代码方面有没有错。
主机:
BYTE SPISwap(BYTE dat)
{
#ifdef MASTER
SPISS = 0; // pull low slave SS
#endif
SPDAT = dat; // trigger SPI send
while(!(SPSTAT & SPIF)); // wait send complete
tempdata = SPDAT;
SPSTAT = SPIF | WCOL; // clear SPI status
#ifdef MASTER
SPISS = 1; // push high slave SS
#endif
return SPDAT; // return received SPI data
}
void InitSPI() //CPOL = 0, CPHA = 1
{
SPDAT = 0;
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPCTL = SPEN | MSTR | SSIG | CPHA;
#else
SPCTL = SPEN | CPHA;
#endif
}
void main()
{
InitUART();
InitSPI();
IE2 |= ESPI;
EA = 1;  //中断允许总控制位
SendOneByte(0x55); //By Uart


while (1)
{
LED_Toggle();
if(tempdata != 0xff){
SendOneByte(0x11);
SendOneByte(tempdata);
tempdata = 0xff;
}
SPISwap(b++);
}
}
void ser_int (void) interrupt 4 using 0  //RI接收终端标志,TI发送中断标志
{
if(RI==1)  //接收指令
{
tempdata=SBUF; //将接收到的数据保存在变量tempdata中,便于后续操作
//SendOneByte(tempdata);
RI=0;
}
}  
void spi_isr( ) interrupt 9 using 1 
{
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPISS = 1;
tempdata = SPDAT;
#else
tempdata = SPDAT;
#endif
}

从机:
void spi_isr( ) interrupt 9 using 1 
{
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPISS = 1;
SendUart(SPDAT);
#else
tempdata = SPDAT;
#endif
}
void InitSPI() //CPOL = 0, CPHA = 1
{
SPDAT = 0;
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPCTL = SPEN | MSTR | CPHA;
#else
SPCTL = SPEN | CPHA;
#endif
}
BYTE SPISwap(BYTE dat)
{
#ifdef MASTER
SPISS = 0; // pull low slave SS
#endif
SPDAT = dat; // trigger SPI send
while(!(SPSTAT & SPIF)); // wait send complete
tempdata = SPDAT;
SPSTAT = SPIF | WCOL; // clear SPI status
#ifdef MASTER
SPISS = 1; // push high slave SS
#endif
return SPDAT; // return received SPI data
}
void main()
{
InitUART();
InitSPI();
IE2 |= ESPI;
EA = 1;  //中断允许总控制位


while (1)
{
LED_Toggle();
if(tempdata != 0xff){
SendOneByte(0x11);
SendOneByte(tempdata); //send by Uart
tempdata = 0xff;
}

tempdata = SPISwap(tempdata); //卡在了这一句,卡在了函数里面的while循环
SendOneByte(0x35); //send by Uart
LED_Toggle();
}
}

------解决方案--------------------
用逻辑分析仪看看主机到底有没有发起通信