SPI主的程序大致是这样的:
uchar SendData[4] = {0xA1,0xA2,0xC3,0xC4};
SPICON = 0x33; //Master , fcore/16, cpol="0",cpha=0
IEIP2 |= 0x01 ; //Enable SPI interrupt
for(;;)
{
SPI_CS3 = 0;
SPIDAT = SendData[temp];
temp ++;
if(temp>3) temp = 0;
SPI_CS3 = 1;
delay(1000);
}
SPI从的程序大致:
SPICON = 0x23; //Slave , fcore/16, cpol="0",cpha=0
IEIP2 |= 0x01 ; //Enable SPI interrupt
SPIDAT = 0x55;
void interrupt_spi() interrupt 7
{
DataRcv = SPIDAT; //Auto clear the interrupt flag
if (DataRcv == 0xA1)
{
SPIDAT = 0xF1;
}else if (DataRcv == 0xA2)
{
SPIDAT = 0xF2;
}else if (DataRcv == 0xc3)
{
SPIDAT = 0xF3;
}else
{
SPIDAT = 0;
}
SCISendHex(DataRcv);
SCISendChar(' ');
SCISendHex(SPIDAT);
SCISendString("rn");
}
问题:一开始给SPI从机中的SPIDAT赋的初值0x55可以被SPI主接受到,
但后面在中断if..else里给SPIDAT赋得值好像都没有成功。从机中SPIDAT的值就是从SPI主接受到的值。中断肯定执行了,因为接收到了SPI主发过来的数。
请高手指教!
2018-11-20 09:56:20
如果能确定"中断肯定执行了",有可能是Slave不能在中断中为SPIDAT赋值。
你可以试试,只在中断中判断作标志位,而在主程序中通过对该标志位判断,再为SPIDAT赋值。
附件
如果能确定"中断肯定执行了",有可能是Slave不能在中断中为SPIDAT赋值。
你可以试试,只在中断中判断作标志位,而在主程序中通过对该标志位判断,再为SPIDAT赋值。
附件
举报