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

📄 des_mc33696.c

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