请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR6879 我在从模式下使用 msp430fr6879与另一个 用作主控 的电路通信,
如果我仅在从设备上的交换机之后打开主设备,则可以正常工作。
但是,如果我先给主设备上电,然后再给从设备上电,我接收到的数据就会被破坏。
任何领导都将不胜感激。
下面、我添加了初始化
SPI_SLVTO_BOS_INIT (空)
{
P1SEL1 &=~(BIT4 | BIT6 | BIT4);
//配置从器件选择和 clk
P1SEL0 |= BIT4 | BIT6 | BIT7;
//配置 SOMI 和 MISO
UCB0CTLW0 = UCSWRST;
UCB0CTLW0 |= UCSYNC | UCMSB |UCCKPL;
UCB0CTLW0 &=~UCSWRST;
UCB0IE |= UCRXIE;
}
其次、我还在主 while 循环中包含了溢出标志处理程序
if ((UCB0STATW 和 UCOE)=UCOE)
{
RxBUFF_ATG[MAX_RXBYTECOUNT]= UCB0RXBUF;
}
#include
#include "string.h"
#include "spi_SendReceive.h"
#include "structure.h"
//--- SPI-BOS-Commons--------------------------------------------------
TANK_Config_struct bTankConfig;
Delivery;Delivery;
TANK_Table_struct bTankTable;
Time_struct bTimeData;
firmware_version bFirmWareVersion;
unsigned char bTankNo;
unsigned short int bTankCount;
//---------------
#define rxtxBuffSize 280
枚举 commStateS
{
ideal = 0、
WaitForAck、
WaitForReply、
receiving、
received、
ReadyToTransmit、
Transmit、
Initialize、
Busy
};
volatile unsigned int commState=0、txCount=0、rxCount=0、index=0、forVar;
unsigned long int crc、sum;
volatile unsigned char *txPtr;
volatile unsigned char dummy1;
unsigned char rxBuff[rxtxBuffSize]、txBuff[rxtxBuffSize]、receivedCmd、crcData[4];
char crcMatch;
#define txnStartAddress 0x1F000 //0x1C7FF
#define txnCountAddress 0x1EFFF //0x1C7FE
#define txnMaxSize261/// inbytes
unsigned char txnCount、arnIndex、retVar、busyShaved;
long modbusCRCAddition (unsigned char * arr、int bSize);
void readString (unsigned char * arr、int size、int unsigned char * arr);
void writeChart * getArr (long char * arsize、
int);void writeChart *、int size (unsigned char *、int)
void writeNumberHEX (unsigned char * arr、int size、unsigned long int value);
unsigned long int readNumber (unsigned char * arr、int size);
unsigned long int readNumberHEX (unsigned char * arr、int size);
void BOS_DataParsing (void);
void getTankNumber (void);// CMD = 4(void
)= 4 (void)/GetCMD= 4 (void);void 配置(void)/FCMD/(void)
// CMD = 2
void GetDeliveryData (void);// CMD = 3
void setTankCount (void);// CMD = 6
void setLEDStatus (void);// CMD = 7
void setTankTablePoint (void);// CMD = 8
void getRTCData (void);// CMD = 9 void (
void)
;CMD = 10 (void) TransactionIndex
(void);// CMD = 10 (void)// CMD = 12
void readTransactionIndex (void);// CMD = 13
void readTransactionCount (void);// CMD = 14
void clearAllTransaction (void);// CMD = 15
void readSPIFirmwareVersion (void);// CMD = 16
void writeFRAMTnx (long add、unsigned int
char、unsigned int)、unsigned int long char、unsigned int、unsigned int 长度(unsigned int)
void BOS_Intialization (void)
{
commState = ideal;
__no_operation();
}
void BOS_ReceiveSendFunction (void)
{
if (commState=received)
{
rxCount=index+1;
CRC = modbusCRCAddition (rxBuff+1、rxCount-6);
writeNumberHEX (crcData、4、 crc);
crcMatch=0;
if (crcData[0]=rxBuff[rxCount-5])
if (crcData[1]=rxBuff[rxCount-4])
if (crcData[2]=rxBuff[rxCount-3])
if (crcData[3]=rxBuff[rxCount-4]) if (crcData[2]=rxCount=rxBuf=rxBuy=xe2]=rxBuy=xe;crUCB0Xe=
xe= r= r= xBuy= xe;cr1
) if
) if (cr&trab=cr&trab=cr= r= r= rx 1);cr&trab=cr&trab=r= r= rx
}
否则、如果(commState=ReadyToTransmit)
{
if (txCount < rxtxBuffSize-6)
{
txBuff[0]= 0x02;
CRC = modbusCRCAddition (txBuff+1、txCount);
writeNumberHEX (crcData、4、 crc);
txBuff[txCount+1]=crcData[0];
txBuff[txCount+2]=crcData[1];
txBuff[txCount+3]=crcData[2];
txBuff[txCount+4]=crcData[3];
txBuff[txCount+5]=0x03;
txCount=txCount+6;
txPtR=&txBuff[0];
commState=Transmit;
}
其他
commState=ideal;
伪= UCB0RXBUF;
UCB0IE |=UCRXIE;
}
__no_operation();
}
void BOS_Operations (void)
{
if (commState=WaitForAck)
{
retVar=0;
if (receivedCmd=1)
retVar=b_setTankConfiguration ();
否则 if (receivedCmd=4)
retVar=b_setTankyAck ();
否则 if (receivedCmd=5)
retVar=b_setTankyAck
();elt (receivedCmd=6);elt (retedCankyar = 6);elt (receivedCmd=6)
否则、如果(receivedCmd=7)
retVar=b_setLEDStatus();
否则(receivedCmd=8)
retVar=b_setTankTableData();
否则(receivedCmd=10)
retVar=b_setRTCData();
如果(receivedCankTableData=18)
;stoperHandlers
(receivedCmd=18);retedHandlers (=b);startHandlers (=18);els=b = ver= vredCmd);
writeNumber (txBuff+1、2、(unsigned long int) receivedCmd);
if (retVar=1)
txBuff[3]='1';
否则
txBuff[3]='0';
txCount=3;
commState=ReadyToTransmit;
}
否则 if (commState=WaitForReply)
{
retVar=0;
if (receivedCmd=3)
retVar=b_getDeliveryData();
否则 if (receivedCmd=9)
retVar=b_getRTCData();
否则 if (receivedCmd=16)
b_readDeliveryVersion();
if (retvar=b_getRTCData=b+3)eedC16=eed()
;if (receivedCfeedC16=1eCd=1eC16=1eC16=eCfeed();receivedCfeed();receivedCfeed()
commState=ReadyToTransmit;
}
否则 if (commState=Busy)
{
if (busyShared=0)
{
if (receivedCmd=9)
b_getRTCData();
否则 if (receivedCmd=10)
b_setRTCData();
}
否则 if (busyShared=1)
{
if (receivedCmd=9)
getRTCData();
否则 if (receivedCmd=10)
{
writeNumber (txBuff+1、2、(unsigned long int) receivedCmd);
txBuff[3]='1';
txCount=3;
}
commState=ReadyToTransmit;
}
否则 if (busyShayred=2)
{
writeNumber (txBuff+1、2、(unsigned long int) receivedCmd);
txBuff[3]='0';
txCount=3;
commState=ReadyToTransmit;
}
}
void BOS_DataPars()
{
receivedCmd = readNumber (rxBuff+1,2);
switch (receivedCmd)
{
案例1:
FillTankConfiguration();
commState=WaitForAck;
break;
案例2:
GetTankStatus();
commState=ReadyToTransmit;
break;
case 3:
getTankNumber();
commState=WaitForReply;
break;
case 4:
getTankNumber();
commState=WaitForAck;
break;
case 5:
getTankNumber();
commState=WaitForAck;
break;
判例6:
setTankCount();
commState=WaitForAck;
break;
判例7:
setLEDStatus();
commState=WaitForAck;
break;
case 8:
setTankTablePoint();
commState=WaitForAck;
break;
case 9:
busyShayred=0;
commState=Busy;
break;
case 10:
busyShared=0;
setRTCData();
commState=Busy;
break;
case 11:
addTransactionIndex();
commState=ReadyToTransmit;
break;
case 12:
updateTransactionIndex();
commState=ReadyToTransmit;
break;
case 13:
readTransactionIndex();
commState=ReadyToTransmit;break
;
判例14:
readTransactionCount();
commState=ReadyToTransmit;
break;
判例15:
clearAllTransaction();
commState=ReadyToTransmit;
break;
case 16:
commState=WaitForReply;
break;
case 17:
commState=WaitForAck;
break;
判例18:
commState=WaitForAck;
break;
默认:
break;
}
}//---------------
NVRAM 操作-------------------------------------------------------
void TransactionIndex()
{
if (rxCount>=(261+10))
{
readFRAMTnx (TxnCountAddress,&txnCount, 1);
if (txnCount >70)
{
txnCount=0;
writeFRAMTnx (TxnCountAddress,&txnCount, 1);
if (txnCount+)<rxBuqeCount=0(txnCount=0;txnCount+4)
;writeCRC+3r&txnCount=(rxBunCount=(xx+4);rnCount+4);rxDCMD=(rxCnCount+3r&r&r&nCount=(r&r&r&r&nCount=(rnCount);r&rnCRCnCount+4);r&r&r&r&
rxBuff[rxCount-5]=crcData[0];
rxBuff[rxCount-4]=crcData[1];
rxBuff[rxCount-3]=crcData[2];
rxBuff[rxCount-2]=crcData[3];
writeFRAMTnx ((txnIndex*(MaxStart+nSize) rxBuff+5、txnMaxSize+4);
txnCount=txnIndex+1;
writeFRAMTnx (txnCountAddress、&txnCount、 1);
txBuff[1]=0x31;
txBuff[2]=0x31;
txBuff[3]='1';
txCount=3;
}
}
{
txBuff[1]=0x31;
txBuff[2]=0x31;
writBuff[3]='0';
txCount=3;
}
void updateTransactionIndex (
){if (rxCount >=(261+10)))}
{
readFRAMTnx (txCountAddress、txnNumber、1&1xx)、
rxCount+4 (rx
)
、rxCount+N);rnCount (rx (rx)、rxCnCnCount (rnCnCnCnCnCnCn);rx (rx (rx)、rnCn)、rnCn (rq1)、rnCount (rnCn)、rx (rnCn)、rnCn)、rnCn (rq1)
rxBuff[rxCount-5]=crcData[0];
rxBuff[rxCount-4]=crcData[1];
rxBuff[rxCount-3]=crcData[2];
rxBuff[rxCount-2]=crcData[3];
writeFRAMTnx ((txnIndex*(MaxStart+nSize) rxBuff+5、txnMaxSize+4);
txBuff[1]=0x31;
txBuff[2]=0x32;
txBuff[3]='1';
txCount=3;
}
}否则
{
txBuff[1]=0x31;
txBuff[2]=0x32;
txBuff[3]='0';
txCount=3;
}
}void readTransactionIndex ()
{
readFRAMTnx (readCountAddress、&CounnCount、1);
if (txnCount>3
、txN);txCount (txnCount = 1
);txnCount (txnCount);txnCount (txnCount = 3、txnCount);txnCount = txnCount;txnCount;txnCount = txnCount) 70)
{
txnCount=0;
writeFRAMTnx (txnCountAddress、&txnCount、1);
txBuff[3]=0x30;
txBuff[4]=0x30;
}
否则
writeNumber (txBuff+3、2、(unsigned long int) txnCount);
txCount=4;
}
void clearAllTransaction()
{
txnCount=0;
writeFRAMTnx (txnCountAddress,&txnCount,1);
txBuff[1]=0x31;
txBuff[2]=0x35;
txBuff[3]='1';
txCount=3;
}
void writeFRAMTnx (unsigned long int add、unsigned char * buff、unsigned int length)
{
unsigned int loopVar=0;
for (
unsigned var=0;loopVar<length;unsigned var++)__loopar (unsigned var + int、unsigned vale+);loopvar + val=0;loopvar (unsigned val=val=vale+、loopvale+);enchar (enchar + v=v=val=val=ve+)(unsigned val=ve
5000)
bTankConfig.Probeoffset =(-1)*(tempvar - 5000);
否则
bTankConfig.Probeoffset = tempvar;
tempvar = readNumber (rxBuff+31、4);
if (tempvar > 5000)
bTankConfig.zero_water =(-1)*(txvar - 5000);
else = readNumber (rxBuff+31、4);if (tempedtfar = 0xbankConfig = 0x3
)、btbankConfig = 0xbfuff =
0x3;tidfu20[toff+3](tbfuff = 0xbtbfu.eOff_2);btidfuff = 0xbank3 (tid.t
2、(unsigned long int) tankstatus_struct[bTankNo-1].TAnkNo);
writeNumber (txBuff+5、1、(unsigned long int) tankstatus_struct[bTankNo-1].probe_status);
writeNumber (txBuff+6、2、(unsigned long int) tankstatus_struct[bTankNo-1].alarm_value.Astatus);
writeNumber (txBuff+8、8、 (unsigned long int) tankstatus_struct[bTankNo-1].Product_volume);
writeNumber (txBuff+16、6、(unsigned long int) tankstatus_struct[bTankNo-1].product_height);
writeNumber (txBuff+22、 4、(unsigned long int) tankstatus_struct[bTankNo-1].TEMP);
writeNumber (txBuff+26、6、(unsigned long int) tankstatus_struct[bTankNo-1].water 卷);
writeNumber (txBuff+32、6、(unsigned long int) tankstatus_struct[bTankNo-1].Water 高度);
writeNumber (txBuff+38、8、 (unsigned long int) tankstatus_struct[bTankNo-1].TCVOLUME;
writeNumber (txBuff+46、1、(unsigned long int) tankstatus_struct[bTankNo-1].on_delivery);
txCount=46;
}
void GetDeliveryData()
{txBuff[1]=0x30
;
txBuff[2]=0x33;
writeNumber (txBuff+3、2、(unsigned long int)bTankDeliveration.tank_no);
writeNumber (txBuff+5、1、(unsigned long int) bTankDelivery 交付结果计数);
writeNumberHEX (txBuff+6、2、 (unsigned long int) bTankDelivery。StartTime.year);
writeNumberHEX (txBuff+8、2、(unsigned long int) bTankDelivery。StartTime.Month);
writeNumberHEX (txBuff+10、 2、(unsigned long int) bTankDeliveration.StartTime.dayofmonth);
writeNumberHEX (txBuff+12、2、(unsigned long int) bTankDeliveration.StartTime.hour);
writeNumberHEX (txBuff+14、2、(unsigned long int) bTankDelivery .StartTime.min);
writeNumberHEX (txBuff+16、2、 (unsigned long int) bTankDelivery.Starttime.sec);
writeNumber (txBuff+18、8、(unsigned long int) bTankDelivery .StartVolume);
writeNumber (txBuff+26、 6、(unsigned long int) bTankDelivery .StartHeight);
writeNumber (txBuff+32、4、(unsigned long int) bTankDelivery .StartTemp);
writeNumberHEX (txBuff+36、2、(unsigned long int) bTankDelivery .EndTime.year);
writeNumberHEX (txBuff+38、2、 (unsigned long int) bTankDeliveration.EndTime.Month);
writeNumberHEX (txBuff+40、2、(unsigned long int) bTankDeliveration.EndTime.dayofmonth);
writeNumberHEX (txBuff+42、 2、(unsigned long int) bTankDelivery .EndTime.Hour);
writeNumberHEX (txBuff+44、2、(unsigned long int) bTankDelivery .EndTime.min);
writeNumberHEX (txBuff+46、2、(unsigned long int) bTankDelivery.EndTime.sec);
writeNumber (txBuff+48、8、 (unsigned long int) bTankDelivery。ENDVOLUME);
writeNumber (txBuff+56、6、(unsigned long int) bTankDelivery。EndHeight);
writeNumber (txBuff+62、 4、(unsigned long int) bTankDeliveration.Endtemp);
txCount=65;
}
void getTankNumber()
{
bTankNo = readNumber (rxBuff+3、2);
}
void setTankCount()
{
bTankCount = readNumber (rxBuff+3、5);
}void setLEDStatus(rxBuff+3+)= rbTankCount+3+ tid=rbToxTankCount+3
;rbToxTankNumber+3
(rbToxF=readTankOff+3、rbToxBuff3);}nbToxTankPoint+3 (rbToxTank0=rbToxTankOff_3;} 6);
bTankTable.volume_value = readNumber (rxBuff+14、8);
}
void getRTCData ()
{
txBuff[1]=0x30;
txBuff[2]=0x39;
txBuff[3]=0x31;
txBuff[4]=0x32;
writeNumberHEX (txBuff+5、txBuff+5 2、(unsigned long int) bTimeData.year);
writeNumberHEX (txBuff+7、2、(unsigned long int) bTimeData.Month);
writeNumberHEX (txBuff+9、2、(unsigned long int) bTimeData.dayofmonth);
writeNumberHEX (txBuff+11、2、 (unsigned long int) bTimeData.Hour);
writeNumberHEX (txBuff+13、2、(unsigned long int) bTimeData.min);
writeNumberHEX (txBuff+15、 2、(unsigned long int) bTimeData.sec);
txCount=16;
}
void setRTCData()
{
//bTimeData.year = readNumber (rxBuff+3、2);
bTimeData.year = readNumberHEX (rxBuff+5、2);
bTimeData.Month= readNumberHEX (rxBuff+7、 2);
bTimeData.dayofmonth = readNumberHEX (rxBuff+9、2);
bTimeData.Hour = readNumberHEX (rxBuff+11、2);
bTimeData.min = readNumberHEX (rxBuff+13、2);
bTimeData.sec = readNumberHEX (rxBuff+15、2);
}
void readSPIFirmwareVersion ()
{
txBuff[1]=0x31;
FirmBuff[2]=0x36;
writeNumber (txBuff+3、2)、blong long)
txBuff[5]='.';
writeNumber (txBuff+6、2、(unsigned long int) bFirmWareVersion.second);
txBuff[8]='.';
writeNumber (txBuff+9、2、(unsigned long int) bFirmWareVersion.third);
txCount=10;
}
void writeNumber (unsigned char * arr、int size、unsigned long int value)
{
for (forVar=0;forVar< size;forVar++)
{
unsigned arr[size-forVar-1、
unsigned var =
10;value = 0x30、unsigned v/int value}(void var = 10);void (void v/int value = 10) >(size-1-forVar)*4)& 0x0F)+ 0x30;
}
void writeCharArray (unsigned char * arr、unsigned char * arret、int size)
{
int i=0;
for (forVar = 0;forVar 0x40)?0x37:0x30)< 4)& 0xF0)|((arr[forVar+1]-((arr[forVar+1]> 0x40)?0x37:0x30)& 0x0F);}
无符号整型 int readberHEX (archar * arr * arr、0x30
)(unsigned int 大小
= 0x30);unsigned int (unsigned int r + 1)(unsigned int r (arr +)(arr = 0x30)(unsigned int)(alr + 1)(unsigned int (alr)、int (arr = 0)、unsigned int (arr)、int (alr = 0)、unsigned int (arr、int <size-1; ) forVar++)
sum =(sum +(arr[forVar]- 0x30)*10;
sum+=arr[size-1]- 0x30;
return sum;
}
void readString (unsigned char * arr、int size、unsigned char * getArr)
{
for (forVar=0;forVar<size;forVbus+
)}unsigned cr+
(unsigned char +)(unsigned cr +)(unsigned arge+)、unsigned arge+(unsigned char +)(unsigned cr +) r)(unsigned cr +)
int i;
for (i=0;i < bSize; i++)
{
CRCFull = CRCULL ^
^(unsigned long int)(arr[i]);int j;for (j=0;j<8;j++){CRCLSB = CRCULL & 0x0001;CRCFULL =(CRCULL >> 1)& 0x7FFF;if (CRCLSB=1)}CRCFULL =
1);(CRCFULL = 1)}(CRCFULL = 1)
/**中断服务例程
*
//
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_B0_vector
__interrupt void USCI_B0_ISR (void)
#Elif defined (__GISR__)
void __attribute__((((nuc1_b0_bvector
))#USCI_isr U0!
#endif
{
if (UCB0IFG & UCRXIFG)
{
//////dummy1 = UCB0RXBUF;
//if (0x00!= UCB0RXBUF_L)
//{
//dummy1 = UCB0RXBUF;
//if (dummy1 = 0x02)= UCB0XBUF
;~
// come= 0x0 = 0x0 = U0;//
= UCC0XBUF;//= 0x0 = U0 = U0 = 0x2;//= UCC0XBUF;= 0 = 0 = U0 = U0 = U0 = 0x2;//
}
否则 if (commState==Receiving)
{
if (index <(rxtxBuffSize-1))
index++;
if (0x03 =UCB0RXBUF_L)
{
P9OUT &=~BIT4;
commState=Received;
UCB0IE &=~UCRXIE;
}
else if (commState=Transmit)
= UCB0XBUF;
{=RXBUCFF=UCB0XBUD!= UCB0XF+
}