//1秒调用1次
uchar SlaveStatus = 0;
//默认阶段分析
//阶段1 度命令
//阶段2读地址
//阶段3读数据
//阶段4返回数据
uchar Index = 0;//指示数据标号的
//uchar TxCnt = 0;//发送数据的下标
uchar RxData[5]={0,0,0,0,0x00};
uchar TxData[2]={0xaa,0x01};
volatile bit RxOK=0;
volatile bit TxOK=0;
extern uchar MyKeyValue;
uchar CrcRx=0x00;
uchar CrcTx=0x00;
extern uchar Errlinkcnt;
extern volatile bit ErrLinkFlag;
uchar SPITXRXPro(void)
{
uchar Temp=0;
if(!B_SpiTxRx) return 0;
B_SpiTxRx=0;
Temp = SSPBUF ;
if(SlaveStatus==0)
{
if(Temp==0xA0)//接收到写指令
{
SlaveStatus=1;
return 0;
}
if(Temp==0xb0)//接收到读指令
{
SSPOV=0;
WCOL=0;
SSPBUF=TxData[0];
SlaveStatus=5;
}
return 0;
}
if(SlaveStatus==1)
{
if(Temp==0x05)
{
SlaveStatus=2;
Index = 0;//清零
return 0;
}
//通信不对
SlaveStatus=0;
return 0;
}
if(SlaveStatus==2)
{
if(Index<4)
{
RxData[Index] = Temp ;
Index++;
return 0;
}
//结束最后一帧数据的
RxData[4] = Temp ;
Index = 0;
SlaveStatus=3;
return 0;
}
//计算校验和
if(SlaveStatus==3)
{
CrcRx = SSPBUF ;
//清零状态
SlaveStatus=0;
//if(CrcRx==CRC8( RxData,5))
//{
// ShowDataChange();
// Errlinkcnt=0;
// ErrLinkFlag=0;
// }
return 0;
}
if(SlaveStatus==5)
{
WCOL=0;
//发送按键数值
SSPBUF=TxData[1];
SlaveStatus=6;
return 0;
}
if(SlaveStatus==6)
{
WCOL=0;
//计算CRC并发送
//CrcTx = CRC8( TxData,2);
SSPBUF = CrcTx;
//结束发送操作
SlaveStatus=0;
return 0;
}
return 0;
}