?? des_mc33696.c
字號:
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF;
ECHO_TFLG1 = ECHO_TIMER_INT;
/* Turn off the PA and turn on the LNA */
#ifdef ECHO_ENABLELNA
ECHO_ENABLELNA = 1;
#endif
#ifdef ECHO_ENABLEPA
ECHO_ENABLEPA = 0;
#endif
/* Switch to Rx mode */
echoRegisters[ECHO_COMMAND_REG] &= ~ECHO_BIT_MODE;
Echo_EnterConfig();
Echo_Config(BUILDCMD(CMD_ONE, ECHO_COMMAND_REG, 1), \
&echoRegisters[ECHO_COMMAND_REG], 1);
Echo_ExitConfig();
ECHO_SPIxC1 &= ~ECHO_SPIxC1_SPE; /* Keep SPI disabled */
status.Bits.Tx = 0;
status.Bits.ModeSwitchDelay = 1;
bitCounter = ECHO_500uS_DELAY;
echoDriverNextState = ECHO_TXRX_SWITCH_DELAY;
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;
ECHO_TFLG1 = ECHO_TIMER_INT;
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* TxRx Mode Switch delay: wait for 500uS then end */
case ECHO_TXRX_SWITCH_DELAY:
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF; /* Pin disconnceted */
ECHO_TFLG1 |= ECHO_TIMER_INT; /* Clear any old int. pending */
if (--bitCounter == 0) {
status.Bits.Busy = 0;
status.Bits.Mode = 0;
status.Bits.ModeSwitchDelay = 0;
ECHO_TIE &= ~ECHO_TIMER_INT; /* Turn off channel int. */
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF; /* Turn off channel pin */
#if ECHO_TIMER_DISABLE == 1
ECHO_TSCR1 &= ECHO_TIMER_OFF;
#endif
ECHO_SPIxC1 |= ECHO_SPIxC1_SPIE; /* Enable SPI interrupts */
ECHO_SPIxC1 |= ECHO_SPIxC1_SPE; /* Reenable SPI and MOSI */
ECHO_SEB = 0; /* Let Echo take MOSI pin back */
echoDriverNextState = ECHO_READY;
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* End No Switch: Stop the transmission, do not switch back to Rx */
/* Can't jump straight to end because End turns off the timer which */
/* occurs immediately, and therefore does not allow the last bit to */
/* finish sending. Also, the output is cleared so next time timer is */
/* turned on, it starts low. */
case ECHO_END_NOSWITCH:
ECHO_TCTL = ECHO_CLEAR_ON_COMPARE;/* Output low if timer not off */
ECHO_TFLG1 = ECHO_TIMER_INT;
ECHO_TCxH = ECHO_MODH;
ECHO_TCxL = ECHO_MODL;
echoDriverNextState = ECHO_END;
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* End: Stop the transmission, do not switch back to Rx */
case ECHO_END:
status.Bits.Busy = 0;
status.Bits.Tx = 0;
ECHO_TIE &= ~ECHO_TIMER_INT; /* Turn off channel int. */
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF; /* Turn off channel pin */
#if ECHO_TIMER_DISABLE == 1
ECHO_TSCR1 &= ECHO_TIMER_OFF;
#endif
echoDriverNextState = ECHO_READY;
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Config Delay: 1.2ms delay when Echo enters config mode. */
/* Delays before executing a command on Echo to change its */
/* configuration. Enter with bitCounter = # of bit-times in 1.2ms */
/* Echo_EnterConfig should be called prior to entering this state */
case ECHO_CONFIG_DELAY:
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF; /* Pin disconnceted */
ECHO_TFLG1 |= ECHO_TIMER_INT; /* Clear any old int. pending */
if (--bitCounter == 0) {
echoDriverNextState = ECHO_DO_CONFIG;
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Do Config: Send a command to Echo to r/w registers. */
/* Enter with echoCommand = the command, echoRegPtr = the buffer to */
/* read to or write from and echoRegCounter = the # of registers to */
/* r/w. */
case ECHO_DO_CONFIG:
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF; /* Pin disconnceted */
ECHO_TFLG1 |= ECHO_TIMER_INT; /* Clear any old int. pending */
/* We may have been in Tx mode: turn off the PA and */
/* turn on the LNA */
#ifdef ECHO_ENABLELNA
ECHO_ENABLELNA = 1;
#endif
#ifdef ECHO_ENABLEPA
ECHO_ENABLEPA = 0;
#endif
/* Do the actual configuration required */
Echo_Config(echoCommand, echoRegPtr, echoRegCounter);
/* Switch to Rx mode */
echoRegisters[ECHO_COMMAND_REG] &= ~ECHO_BIT_MODE;
Echo_Config(BUILDCMD(CMD_ONE, ECHO_COMMAND_REG, 1), \
&echoRegisters[ECHO_COMMAND_REG], 1);
Echo_ExitConfig();
ECHO_SPIxC1 &= ~ECHO_SPIxC1_SPE; /* Keep SPI disabled */
status.Bits.ModeSwitchDelay = 1;
bitCounter = ECHO_500uS_DELAY;
echoDriverNextState = ECHO_TXRX_SWITCH_DELAY;
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Read Digital RSSI: Wait for 32*Tdigclk then read RSSI register */
#ifdef ECHO_RSSIC
case ECHO_READ_DIGITAL_RSSI:
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF;
ECHO_TFLG1 |= ECHO_TIMER_INT;
#if ECHO_RSSIC_TICKS < ECHO_TIMER_MODULUS
status.Bits.RSSI_InProgress = 0;
ECHO_RSSIC = 0;
echoCommand = BUILDCMD(CMD_ONE, ECHO_RSSI_REG, 0);
echoRegPtr = &echoRSSIResult;
echoRegCounter = 1;
Echo_EnterConfig();
ECHO_TCxH = ECHO_COMH; /* Compare = half bit-time */
ECHO_TCxL = ECHO_COML;
bitCounter = ECHO_1200uS_DELAY;
echoDriverNextState = ECHO_CONFIG_DELAY;
#else
if (--bitCounter == 0) {
status.Bits.RSSI_InProgress = 0;
ECHO_RSSIC = 0;
echoCommand = BUILDCMD(CMD_ONE, ECHO_RSSI_REG, 0);
echoRegPtr = &echoRSSIResult;
echoRegCounter = 1;
Echo_EnterConfig();
bitCounter = ECHO_1200uS_DELAY;
echoDriverNextState = ECHO_CONFIG_DELAY;
}
#endif
break;
#endif
#if ECHO_USE_MCU_ATD == 1
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Read Analogue RSSI: Wait for ATD conversion then read ATD result */
#ifdef ECHO_RSSIC
case ECHO_READ_ANALOGUE_RSSI:
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF;
ECHO_TFLG1 |= ECHO_TIMER_INT;
/* if conversion is complete... */
if ((ECHO_ATDSTAT0 & ECHO_ATDSTAT_SCF) != 0) {
status.Bits.RSSI_InProgress = 0;
ECHO_RSSIC = 0;
/* read the result in echoAnalgoueRSSIResult */
#if ECHO_ATD_RES8 == 1
#if ECHO_ATD_DJM == 1
echoAnalogueRSSIResult = ECHO_ATDDRL;
#else
echoAnalogueRSSIResult = ECHO_ATDDRH;
#endif
#else
#if ECHO_ATD_DJM == 1
echoAnalogueRSSIResult = ECHO_ATDDRL | \
(ECHO_ATDDRH << 8);
#else
echoAnalogueRSSIResult = (ECHO_ATDDRL >> 6) | \
ECHO_ATDDRH << 2);
#endif
#endif
ECHO_TCxH = ECHO_COMH;
ECHO_TCxL = ECHO_COML;
echoDriverNextState = ECHO_END;
ECHO_ATDCTL2 &= ~ECHO_ATDCTL2_ADPU; /* ATD power off */
ECHO_SPIxC1 |= ECHO_SPIxC1_SPIE;
}
/* else go round again! */
break;
#endif
#endif
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* (Rx States): Decrement the counter and check for timeout */
case ECHO_READ_DATA: case ECHO_LAST_BYTE:
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF;
ECHO_TFLG1 |= ECHO_TIMER_INT;
bitCounter--;
if (bitCounter == 0) { /* Time out - back to ready state */
status.Bits.Error = 1;
status.Bits.Timeout = 1;
status.Bits.Busy = 0;
status.Bits.Rx = 0;
echoDriverNextState = ECHO_READY;
ECHO_TIE &= ~ECHO_TIMER_INT;
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF;
#if ECHO_TIMER_DISABLE == 1
ECHO_TSCR1 &= ECHO_TIMER_OFF;
#endif
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Oh dear something went wrong! */
default:
status.Bits.Error = 1;
break;
}
}
#pragma CODE_SEG DEFAULT
/******************************************************************************
* SPI Rx interrupts occur from Echo when data is received.
* It is processed in here.
******************************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void Echo_RxSPI_Interrupt(void) {
unsigned char temp;
unsigned char i;
temp = ECHO_SPIxSR; /* Read SPIF flag set */
temp = ECHO_SPIxDR; /* Read data reg and clear SPIF flag */
switch (echoDriverNextState) {
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Ready for a message - the first byte received will be the length */
case ECHO_READY:
if (temp <= 0 || temp > ECHO_MAX_DATA_SIZE) { /* Length error! */
ECHO_CONFB = 0; /* Reset Echo state machine */
ECHO_CONFB = 1;
break;
}
echoChecksum = ECHO_ID_VALUE; /* Checksum includes ID and length */
EchoCalcChecksum(temp);
echoRxDataPtr = echoInternalRxBuffer;/* Where to put the message */
echoDataLength = temp+1; /* Add one for checksum */
echoRxDataPtr[1] = temp; /* Store length in buffer */
echoRxDataPtr += 2; /* Move to start of data */
status.Bits.Busy = 1;
status.Bits.Rx = 1;
echoDriverNextState = ECHO_READ_DATA;
bitCounter = ECHO_RX_TIMEOUT_BITS; /* Reset timeout */
Echo_KickOffTimer(); /* Start timeout countdown */
/* Start RSSI conversion if enabled */
#ifdef ECHO_RSSIC
if (status.Bits.RSSI_Enabled == 1) {
ECHO_RSSIC = 1;
}
#endif
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Read the data of a message */
case ECHO_READ_DATA:
bitCounter = ECHO_RX_TIMEOUT_BITS; /* Reset timeout */
EchoCalcChecksum(temp);
*echoRxDataPtr++ = temp;
echoDataLength--;
if (echoDataLength == 0) {
echoDriverNextState = ECHO_LAST_BYTE;
}
break;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Got the last byte of a message */
/* discard as it contains 'extra bit' */
case ECHO_LAST_BYTE:
echoDriverNextState = ECHO_READY;
/* Stop the timeout countdown */
ECHO_TIE &= ~ECHO_TIMER_INT;
ECHO_TCTL &= ~ECHO_TIMER_PIN_OFF;
#if ECHO_TIMER_DISABLE == 1
ECHO_TSCR1 &= ECHO_TIMER_OFF;
#endif
/* Check for a free buffer */
if ((echoEmptyPtr[1] & ECHO_BUFFER_FULL) != 0) {
status.Bits.Overrun = 1;
status.Bits.Busy = 0;
status.Bits.Rx = 0;
break;
}
/* There is a free buffer, so clear Overrun flag */
status.Bits.Overrun = 0;
/* Stop RSSI conversion if enabled */
#ifdef ECHO_RSSIC
if (status.Bits.RSSI_Enabled == 1) {
ECHO_RSSIC = 0;
Echo_EnterConfig();
ECHO_SPIxC1 |= ECHO_SPIxC1_SPIE; /* Enable SPI ints. */
ECHO_SPIxDR = BUILDCMD(CMD_ONE, ECHO_RSSI_REG, 0);
echoDriverNextState = ECHO_READ_RSSI_1;
}
#endif
/* Copy the received message to external buffer */
/*************** TODO: Avoid copying whole buffer!!!! ************/
for(i=1; i<ECHO_MAX_DATA_SIZE+2; i++) {
echoEmptyPtr[i] = echoInternalRxBuffer[i];
}
/* Confirm the checksum */
if (echoChecksum != 0xFF) {
echoEmptyPtr[0] |= ECHO_CHECKSUM_ERROR;
}
else {
echoEmptyPtr[0] &= ~ECHO_CHECKSUM_ERROR;
}
/* Signal buffer full and move on the empty pointer only when */
/* completely finished processing a message - that includes */
/* the RSSI as well */
if (status.Bits.RSSI_Enabled == 0) {
echoEmptyPtr[0] &= 0xC0; /* Clear the RSSI bits */
echoEmptyPtr[1] |= ECHO_BUFFER_FULL;
echoEmptyPtr += ECHO_MAX_DATA_SIZE+2;
if (echoEmptyPtr >= (echoRxBuffer+sizeof(echoRxBuffer))) {
echoEmptyPtr = echoRxBuffer;
}
status.Bits.Busy = 0;
status.Bits.Rx = 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -