⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des_mc33696.c

📁 BCM 控制demo源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -