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

📄 sdpr.c

📁 MSP4250单芯片电子称,采样数据无线发送给主机,编译环境IAR for MSP430
💻 C
📖 第 1 页 / 共 2 页
字号:
					__enable_interrupt();
					return;
				}
			}else{
				Cc_Receive(RfRxBuf,12);														//retry
			}

			return;	//break;																//should be return
			
		//----------------------------------------------------------------------
		case PLRF_MASTER1:	
		//----------------------------------------------------------------------
		
		  	if( (RF0CTRL &0x1f) == RF_OVER){												// correct interrupt
				if(RF0CTRL & RF_TRRV){														// receive a package
					if(RF0STATUS[LQI] & CRC_OK)	{											// check CRC
						
						if( (RfRxBuf[1] == (FrameCS | FT_MST_ACK)) &&
					   		(RfRxBuf[3] == (SlaveSN & 0xff)) &&
					   		(RfRxBuf[4] == (SlaveSN >> 8)) ){
							
							FrameCS += 0x10;
							RF0ERR = 0;
							RF0CTRL = 0;
			
							val = RfRxBuf[5];
							if(val &0x80){                             						//master anailable
								if((val &0x70 >=0x10)&&(val &0x03)){
									PmMode = PM_BOTTLE_UP;	
								}else{
									PmMode = PM_MEASURE | PM_CALL;
								}
							}else{                                   						//Master is busy now ,wait a random time
								val = (RF0STATUS[RSSI]>>1) & 0x0f;   										//wait a random time RandomCnt*10mS
								while(val) {
									val--;
									Pause_1mS(10);
								}
								Req_Master(0);
								return;
							}

						}else if( (RfRxBuf[1] == FrameCS | FT_MST_REQ)&&			
						   		  (RfRxBuf[3] == (SlaveSN & 0xff)) &&
					   			  (RfRxBuf[4] == (SlaveSN >> 8)) ){							//goto config mode
							return;
						}		   															//unknow Frame type
					}																		// if(RF0STATUS[LQI] & CRC_OK)
				}else{																		// finish a transmit
					Cc_Receive(RfRxBuf,5);	
					return;
				}
			}
			break;
			
		//----------------------------------------------------------------------	
		case PLRF_MASTER2:
		//----------------------------------------------------------------------
			
		  	if( (RF0CTRL &0x1f) == RF_OVER){												// correct interrupt
				if(RF0CTRL & RF_TRRV){														// receive a package
					if(RF0STATUS[LQI] & CRC_OK)	{											// check CRC
						
						if( (RfRxBuf[1] == (FrameCS | FT_MST_ACK)) &&
					   		(RfRxBuf[3] == (SlaveSN & 0xff)) &&
					   		(RfRxBuf[4] == (SlaveSN >> 8)) ){
							
							FrameCS += 0x10;
							RF0ERR = 0;
							RF0CTRL = 0;
			
							val = RfRxBuf[5];
							if(val &0x80){                             						//master anailable
								
								PlateInfo[PlateNow]	&= ~PLATEI_STATE_MSK;
								PlateInfo[PlateNow] |= PLATEI_NORMAL;
								if((val &0x70 >=0x10)&&(val &0x03)){
									PmMode = PM_BOTTLE_UP;	
								}else{
									PmMode = PM_MEASURE | PM_CALL;
								}
								
							}else{                                   						//Master is busy now ,wait a random time
								val = (RF0STATUS[RSSI]>>1) & 0x0f;   										//wait a random time RandomCnt*10mS
								while(val) {
									val--;
									Pause_1mS(10);
								}
								Req_Master(0);
								return;
							}

						}	   															//unknow Frame type
					}																		// if(RF0STATUS[LQI] & CRC_OK)
				}else{																		// finish a transmit
					Cc_Receive(RfRxBuf,5);	
					return;
				}
			}
			break;
			
		//----------------------------------------------------------------------
		case PLRF_CONFIG:
		//----------------------------------------------------------------------
		
			if( (RF0CTRL &0x1f) == RF_OVER){												// correct interrupt
				if(RF0CTRL & RF_TRRV){														// receive a package
					if(RF0STATUS[LQI] & CRC_OK)	{											// check CRC
						
						if( (RfRxBuf[1] == FrameCS | FT_MST_REQ) &&
							(RfRxBuf[3] == (SlaveSN & 0xff)) &&
					   		(RfRxBuf[4] == (SlaveSN >> 8)) ){
									
								RfTxBuf[1] = (RfRxBuf[1] &0xf0) | FT_ALL_ACK;   			//fsc0
								RfTxBuf[2] = 0x00;                							//fsc1
								RfTxBuf[5] = RfRxBuf[5];
								val = RfRxBuf[5] <<4;
								RF0ERR = 0;
								
								switch(RfRxBuf[5] &0xf0){
									case 0x00:
										RfTxBuf[0] = 5;
										if(val == 0x10){
											RF0CTRL = 0;
										}
										Cc_Send(RfTxBuf, 3);
										break;
									case 0x10:
										RfTxBuf[0] = 21;
										//for(i =0; i<16; i++)
											//_EEGET(RfTxBuf[i+6], val +i);
										Cc_Send(RfTxBuf, 3);
										break;
									case 0x20:
										RfTxBuf[0] = 7;
										//sum = 0;
										//for(i =0; i<16; i++){
											//_EEGET(val, val +i);			//??????
											//sum += val;
										//}
										//RfTxBuf[6] = sum;
										//RfTxBuf[7] = ~sum;
										Cc_Send(RfTxBuf, 3);
										break;
									case 0x30:
										Cc_Send(RfTxBuf, 3);
										//for(i =0; i<16; i++)
											//_EEPUT(RfRxBuf[i+6], val +i);
										break;
									default:
										break;
								}
								return;
							}							//unknow Frame type
					}																		// if(RF0STATUS[LQI] & CRC_OK)
				}else{																		// finish a transmit
					Cc_Receive(RfRxBuf,5);	
					return;
				}
			}
			break;
			
		//----------------------------------------------------------------------
		default:
		//----------------------------------------------------------------------
			break;
	}

	if(++RF0ERR < MAX_RFRETRY){
		val = (RF0STATUS[RSSI]>>1) & 0x0f;   										//wait a random time RandomCnt*10mS
		while(val) {
			val--;
			Pause_1mS(10);
		}
		//RfTxBuf[2] |= 0x20;    														//retry
		Cc_Send(RfTxBuf, 3);
	}else{
		Disp_Led(LED_MASTER);
		__disable_interrupt();
		CC_INIT();
		__enable_interrupt();
	}
	
}
/*
*********************************************************************************************************
*                                         Dpr_main
*
* Description      :
* Arguments        : none
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
void Dpr_main(void)
{
	char tmp;
	
	tmp = PmMode & (~PM_CALL);
	PmMode &= ~PM_CALL;
	
    switch(tmp){
		
		case PM_INIT:
			Dpr_Init();
			PmMode = PM_MEASURE;
			break;
			
		case PM_PWRDOWN:
			WaiterId[0] = 0;
			RF0CTRL = 0;
			SpiStrobe(CCxxx0_SIDLE);
			SpiStrobe(CCxxx0_SPWD);
			break;
			
		case PM_MEASURE:
			break;
			
		case PM_WAITER: 		Dpr_Frame(); break;
		case PM_MASTER_CMD: 	Dpr_Frame(); break;
		case PM_BOTTLE_UP:		break;
		case PM_MASTER_DATA:	Dpr_Frame(); break;
		case PM_CAL_ZERO:		break;
		case PM_CAL_LO:			break;
		case PM_CAL_HI:			break;
		case PM_CONFIG: 		Dpr_Frame(); break;
		default:				break;
    }
}
/*
*********************************************************************************************************
*                                         WeightPrc
*
* Description      :
* Arguments        :
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
long SD16SteadyTmp;
char SD16SteadyCnt;
#define SD16STEADY_MAX	4

void WeightPrc(void)
{
		int temp16;
	
		switch(PmMode & (~PM_CALL)){
	  		case PM_INIT:		
	  		case PM_PWRDOWN:	
				break;
	  		case PM_MEASURE:
			  	if(SD16Config & SD16_CHANGE){
					if(Wt_Delta1[PlateNow] > 0){
						if(Wt_Delta1[PlateNow] > BottleMinWeight){
							Req_Waiter();										//scan waiter
							TIMER_A30_DURA(TIMER_A30_10MS)						//open timer_a3 10mS duration
							PmMode = PM_WAITER;
							PlateInfo[PlateNow]	&=  ~(BIT0+BIT1);
							PlateInfo[PlateNow]	|=  PLATEI_UP;					//bottle up
							Wt_Delta2[PlateNow] = Wt_Delta1[PlateNow];
							SD16SteadyCnt = 0;									//clear SD16SteadyCnt
						}
					}else{
						if(Wt_Delta1[PlateNow] > BottleMinWeight){
							Wt_Old[PlateNow] = SD16Result;						//new bottle on
						}else{
							Wt_Old[PlateNow] = SD16Result;						//what is wrong???????????
						}
					}
				}
				break;
				
	  		case PM_WAITER:
	  		case PM_MASTER_CMD:
			  	break;
				
	  		case PM_BOTTLE_UP:
				if((PlateInfo[PlateNow]	& PLATEI_STATE_MSK) == PLATEI_DOWN){
					
					temp16 = Wt_Delta2[PlateNow] - Wt_Delta1[PlateNow];			//temp Delt2-Delta1
					Wt_Delta2[PlateNow] = Wt_Delta1[PlateNow];					// Delt2 = Delta1
					
					if( (temp16 < 8)||(temp16 > (int)(-8)) ){					//HandleMinWeight
						SD16SteadyTmp += Wt_Delta1[PlateNow];
						if(++SD16SteadyCnt >= SD16STEADY_MAX){
							Wt_Old[PlateNow] = SD16Result;						//????????????
							if(Wt_Delta2[PlateNow] > 0){
								Wt_Delta2[PlateNow] = ((long)Wt_Delta2[PlateNow]) * CAL_MIN_MAX_SPAN /Cal0Max_t;
								//Wt_Delta2[PlateNow] = ((long)(SD16SteadyTmp >> 2)) * CAL_MIN_MAX_SPAN /Cal0Max_t;		//depend on SD16STEADY_MAX
								Req_Master(1);
								PmMode = PM_MASTER_DATA;
							}else{
								PmMode = PM_MEASURE;
							}
						}
					}else{
						//if(SD16SteadyCnt) SD16SteadyCnt--;
						SD16SteadyCnt = 0;
						SD16SteadyTmp = 0;
					}
					
			  	}else{															// PLATEI_UP	bottle up
					temp16 = Wt_Delta2[PlateNow] - Wt_Delta1[PlateNow];			//temp Delt2-Delta1
					if( (temp16 > HandleMinWeight)||(temp16 < (int)(-HandleMinWeight)) ){	
						
						if(temp16 > 0){
							if(temp16 > BottleMinWeight){
								//if(++SD16SteadyCnt >= SD16STEADY_MAX){
									PlateInfo[PlateNow]	|=  PLATEI_DOWN;		//bottle up
									SD16SteadyCnt = 0;							//clear SD16SteadyCnt
									SD16SteadyTmp = 0;
								//}
							}
						}else{
							Wt_Delta2[PlateNow] = Wt_Delta1[PlateNow];	
						}
					}
			  	}
			  	break;
				
	  		case PM_MASTER_DATA:	
				break;
		  	case PM_CAL_ZERO:
	  		case PM_CAL_LO:
	  		case PM_CAL_HI:
				break;
	  		case PM_CONFIG:
				break;
	  		default:
				break;
		}
		
		SD16Config &= ~(SD16_OVER + SD16_CHANGE);							//clear convert finish sign
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -