?? des_mc33696.c
字號:
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
if (--halfbitCounter == 0) {
if (tx_config.Bits.IDHeaderSelect == 0) {
data = (echoTxDataPtr[2]) << (8-ECHO_ID_LENGTH);
// bitCounter = ECHO_ID_LENGTH;
halfbitCounter = ECHO_ID_LENGTH*2;
echoDriverNextState = ECHO_SENDID;
}
else {
data = ECHO_HEADER_VALUE << (8-ECHO_HEADER_LENGTH);
// bitCounter = ECHO_HEADER_LENGTH;
halfbitCounter = ECHO_HEADER_LENGTH*2;
echoDriverNextState = ECHO_SENDHEADER;
}
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* SendID: Enter with bitCounter set to # bits to send and data set */
/* to the ID value left justified in the byte */
case ECHO_SENDID:
if ((data & 0x80) == 0) {
if (halfbit == 0) {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
else {
if (halfbit == 0) {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
if (halfbit == 0) {
data = data << 1;
}
halfbitCounter--;
if (halfbitCounter == 0) {
if (tx_config.Bits.CompleteSend == 0) { // only send a single
// P+ID
echoDriverNextState = ECHO_END_NOSWITCH;
}
else { // send a whole telegram: either continuous (IDRepeat)
// or spaced
if (tx_config.Bits.IDRepeat == 1) { // continuous
if (IDCounter == 0) {
data = ECHO_HEADER_VALUE << (8-ECHO_HEADER_LENGTH);
// bitCounter = ECHO_HEADER_LENGTH;
halfbitCounter = ECHO_HEADER_LENGTH*2;
echoDriverNextState = ECHO_SENDHEADER;
}
else {
IDCounter--;
data = (echoTxDataPtr[2]) << (8-ECHO_ID_LENGTH);
// bitCounter = ECHO_ID_LENGTH;
halfbitCounter = ECHO_ID_LENGTH*2;
echoDriverNextState = ECHO_SENDID;
}
}
else { // IDRepeat == 0 i.e. spaced
bitCounter = echoTxDataPtr[1]; /* Spacing bit-times */
/* from buffer */
echoDriverNextState = ECHO_WAIT;
}
}
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* SendHeader: Enter with bitCounter set to # bits to send and data */
/* set to the header value left justified in the byte */
case ECHO_SENDHEADER:
if ((data & 0x80) == 0) {
if (halfbit == 0) {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
else {
if (halfbit == 0) {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
if(halfbit == 0) {
data = data << 1;
}
halfbitCounter--;
if (halfbitCounter == 0) {
data = echoTxDataPtr[3] & ~ECHO_BUFFER_FULL;/* Remove full */
/* bit from */
// bitCounter = 8; /* length */
halfbitCounter = 16;
EchoCalcChecksum(data); /* Length is part of chksum */
echoTxDataPtr+=4; /* Pointer to start of data */
echoDriverNextState = ECHO_SENDDATA;
}
break;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* WAIT: Wait for a number of bit-times before resending P+ID. Ends */
/* when the repeat counter has reached zero: at this point, when */
/* re-entering the preamble sending states, */
/* tx_config.Bits.IDHeaderSelect is set 1 to send header/data. */
/* Enter with bitCounter set to number of bit-times spacing between */
/* P+ID sequences and IDCounter set to number of P+ID's to repeat */
/* for. */
case ECHO_WAIT:
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TFLG1 = ECHO_TIMER_INT;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
if (bitCounter == 0) {
if (IDCounter == 0) { // no more repeats
tx_config.Bits.IDHeaderSelect = 1;
}
IDCounter--; /* One less P+ID to send */
#if ECHO_MODE_VALUE == ECHO_OOK
echoDriverNextState = ECHO_PREAMBLE_1;
bitCounter = ECHO_PREAMBLE_200uS;
#else
echoDriverNextState = ECHO_PREAMBLE_2;
// bitCounter = 4;
halfbitCounter = 8;
#endif
halfbit = 0;
// ECHO_TCxH = ECHO_COMH;
// ECHO_TCxL = ECHO_COML;
}
else {
bitCounter--;
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* SendData: Enter with data set to first byte to send, bitCounter */
/* set # of bits in data, byteCounter set to the # of bytes */
/* remaining in the buffer and dataPtr pointing to the buffer */
case ECHO_SENDDATA:
if ((data & 0x80) == 0) {
if (halfbit == 0) {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
else {
if (halfbit == 0) {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
if (halfbit == 0) {
data = data << 1;
}
halfbitCounter--;
if (halfbitCounter == 0) {
if (byteCounter == 0) {
// bitCounter = 8;
halfbitCounter = 16;
echoChecksum = ~echoChecksum;
echoDriverNextState = ECHO_SENDCHECKSUM;
}
else {
// bitCounter = 8;
halfbitCounter = 16;
data = *echoTxDataPtr++;
EchoCalcChecksum(data);
byteCounter--;
}
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* SendChecksum: Enter with echoChecksum set to the checksum and */
/* bitCounter set to # of bits in checksum */
case ECHO_SENDCHECKSUM:
if ((echoChecksum & 0x80) == 0) {
if (halfbit == 0){
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
else {
if (halfbit == 0) {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
}
if (halfbit == 0) {
echoChecksum = echoChecksum << 1;
}
halfbitCounter--;
if (halfbitCounter == 0) {
echoDriverNextState = ECHO_EXTRA_BIT;
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* Extra Bit: Accomodate a "feature' of the data manager units and maintain */
/* compatibility with Tango/Romeo */
case ECHO_EXTRA_BIT:
if (halfbit == 0) {
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 1;
}
else {
ECHO_TCTL = ECHO_SET_ON_COMPARE;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
ECHO_TFLG1 |= ECHO_TIMER_INT;
halfbit = 0;
}
echoDriverNextState = ECHO_EOM_1;
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* EOM 1: First constant low bit-time */
case ECHO_EOM_1:
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TFLG1 = ECHO_TIMER_INT;
echoDriverNextState = ECHO_EOM_2;
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* EOM 2: Second constant low bit-time */
/* If a complete send, then check for a queued message and possibly */
/* start sending that. Otherwise switch back to Rx. */
case ECHO_EOM_2:
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TFLG1 = ECHO_TIMER_INT;
if (tx_config.Bits.CompleteSend == 1 && \
tx_config.Bits.IDRepeat == 0) {
/* A complete telegram send always uses the internal buffer */
echoInternalTxBuffer[3] &= ~ECHO_BUFFER_FULL; /* Clear buf */
/* full flag */
if ((echoTransmitBuffer[3] & ECHO_BUFFER_FULL) != 0) {
// queued msg
/* Reset state machine to send ID */
tx_config.Bits.IDHeaderSelect = 0;
/* Set up data, length, checksum etc */
EchoCopyTxBuf();
echoTxDataPtr = echoInternalTxBuffer;
byteCounter = echoTxDataPtr[3] & ~ECHO_BUFFER_FULL;
echoChecksum = echoTxDataPtr[2]; /* Start with ID */
IDCounter = echoTxDataPtr[0]; /* Number of P+ID repeats */
/* Set up driver next state */
#if ECHO_MODE_VALUE == ECHO_OOK
echoDriverNextState = ECHO_PREAMBLE_1;
bitCounter = ECHO_PREAMBLE_200uS;
#else
echoDriverNextState = ECHO_PREAMBLE_2;
// bitCounter = 4;
halfbitCounter = 8;
#endif
}
else { // no queued msg
echoDriverNextState = ECHO_SWITCHBACK;
}
}
else {
echoTransmitBuffer[3] &= ~ECHO_BUFFER_FULL; /* Clear buffer */
/* full flag */
echoDriverNextState = ECHO_SWITCHBACK;
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Switch Back: Initiate the switch back to Rx mode, */
/* then go to delay for 500uS */
case ECHO_SWITCHBACK:
/* Turn off channel pin to let SPI config work */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -