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

📄 sdpr.c

📁 MSP4250单芯片电子称,采样数据无线发送给主机,编译环境IAR for MSP430
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                             MSP430
*                                       slave data process functions
*
* File    : SDPR.C
* Data	  : April 12, 2007
*********************************************************************************************************
*/

#include "hal.h"

/*
*********************************************************************************************************
*                                              PROTOTYPES
*********************************************************************************************************
*/

//-----------------------------------------------------------------------------
// slave req  master payload
// | FCT | SSN | WID | LTP | STT | DATA |
// | 2   | 2   | 1   | 2   | 1   |  n   |
// master ack slave payload
// | FCT | SSN | CTRL| DATA |
// | 2   | 2   | 1   |   n  |
// master req slave payload
// | FCT | SSN | CMD| DATA |
// | 2   | 2   | 1  |   n  |
//-------------------------------------------------
//  CDM                                 MST      All
//  0x00 --start configing              0         0
//  0x01 --end configing                0         0
//  0x1X --read block configration      0        16  X(0~f)
//  0x2X --Read block check sum         0         2(SUM,/SUM)
//  0x3X --Write block configration    16         2(SUM,/SUM)
//-------------------------------------------------
//STT
// bit7     --  0-data		 1-pre-request
// bit6     --  0-not		 1-Bottle empty
// bit5     --  0-Motor ok   1-Motor error
// bit4     --  0-switchon   1-switchoff
// bit3     --  0-normal     1-cocktail
// bit2..0  --  size
//-------------------------------------------------
//CTRL
// bit7     --  1-Master available 0-not
// bit6     --  1-Slave registered 0-not
// bit5     --  1-Slave enable     0-not
// bit4     --  1-Waiter enable    0-not
// bit3     --  1-reverse
// bit2     --  1-reverse
// bit1..0  --  00- Close time|01- Normal time|10- Happy time|11- Reserved
//-----------------------------------------------------------------------------
//slave to waiter
// | FCT | CMD |SSN | DATA1/2 |
// | 1   | 1   | 2   | 0/1/2  |
//waiter to slave
// slave to master payload
// | FCT | WID | SSN | CMD | DATA1/2 |
// | 1   | 1   | 2   | 0/1 |  0/1/2  |
//-------------------------------------------------
//FCT
//                        |<--------------Note 1--------------------->|
// Bit15..12 |   11..8    |   7    |  6   |  5    |  4..3   | 2..0    |
//   FCS     | Frame type | Router | More | Retry | version |Battery  |
//Note 1: some frame do not use this byte
//-----------------------------------------------------------------------------

//Frame type:
#define FT_MST_REQ    0x00        //MST-master
#define FT_MST_ACK    0x01
#define FT_ALL_REQ    0x02        //ALL-slave, waiter, alarm
#define FT_ALL_ACK    0x03
#define FT_S2W_REQ    0x04        //slave & waiter
#define FT_W2S_ACK    0x05
#define FT_S2A_REQ    0x06        //slave & alarm
#define FT_A2S_ACK    0x07
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
__no_init char  PlateNow 		@LCDM3_;
__no_init char  FrameCS  		@LCDM2_;	//Frame CheckSequence for WID
__no_init char 	WaiterId[5] 	@LCDM11_;	
__no_init char 	PlateInfo[5] 	@LCDM16_;	
 // bit7		0-ok		1-error
 // bit6..4		RF status
 //				000,	rf is used by other plate
 // 			001, 	waiter1
 //				010, 	waiter2
 //				011, 	master req
 //				100, 	master data
 //				101, 	config
 //				...,	rev
 //				
 //	bit3		0-right			1-wrong zero point
 //	bit2		0-right weight  1-over loading
 // bit1..0		00-no bottle  01-normal  10-bottle up	 11-bottle down	

 #define PALTEI_WRONGZERO	BIT3
 #define PLATEI_OVERLOAD	BIT2
 #define PLATEI_NO			0
 #define PLATEI_NORMAL		1
 #define PLATEI_UP			2
 #define PLATEI_DOWN		3
 #define PLATEI_STATE_MSK	3
//-----------------------------------------------------------------------------
BYTE Waiter_ctrl;
 // bit7..4	reverse
 // bit3 1,high speed	0,low speed
 // bit2 1,use RSSI		0,not
 // bit1	when read waiter 1,if cannot read a waiterid continue  0,if cannot read a waiterid goto sleep
 // bit0 1,read waiter 	0,not
 #define WAITER_READ 		0x01
 #define WAITER_SKIP		0x02
 #define WAITER_RSSI		0x04
 #define WAITER_SPEED		0x08

/*
*********************************************************************************************************
*                                         Dpr_Init
*
* Description      :
* Arguments        :
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
void Dpr_Init(void)
{
	unsigned int i;
	
	SD16Set(SD16OSR_256, 8);									//OSR=256 count=256
	
	for(i=0;i<1;i++){											//test
		if(PlateFlag & (1<<i)){									//sensor connect
			PlateInfo[i] = 0x80;
			PlateNow = i;
			Wt_Old[i] = SD16GetAverage(16);						
			
			if(Wt_Old[i] > CalMax[i])  {
				PlateInfo[i] |= PLATEI_OVERLOAD;				//over loading
				//error display
			}else{
				if(Wt_Old[i] < (-BottleMinWeight)) {
					PlateInfo[i] |= PALTEI_WRONGZERO;			//wrong zero point,
				}else{
					if(Wt_Old[i] > BottleMinWeight) {
						PlateInfo[i] |= PLATEI_NORMAL;			
					}//else{}									//no bottle
				}
			}
		}else{													//sensor not connect
			PlateInfo[i] = 0x00;
		}
		WaiterId[i] = 0;
	}
	
	FrameCS = 0;
	PlateNow = 0;
}
/*
*********************************************************************************************************
*                                        Req_Waiter
*
* Description      :
* Arguments        :
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
void Req_Waiter(void)
{
	RfTxBuf[0] = 4;                   		//Frame length
    RfTxBuf[1] = FrameCS + FT_S2W_REQ;   	 	//fsc
    RfTxBuf[2] = 0x00;                		//cmd
    RfTxBuf[3] = SlaveSN & 0xff;
    RfTxBuf[4] = SlaveSN >> 8;
	
	SpiWriteReg(CCxxx0_CHANNR, RFCH_WAITER);
    SpiWriteReg(CCxxx0_PATABLE, PaTable[RFPA_WAITER]);	
	
	RF0ERR &= 0xf0;
	Cc_Receive(RfRxBuf,12);	
}
/*
*********************************************************************************************************
*                                        Req_Master
*
* Description      :
* Arguments        :
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
//cmd 0 = request
//cmd 1 = data
//cmd 2 = error
//cmd 3 = config
void Req_Master(char cmd)
{

	SpiWriteReg(CCxxx0_CHANNR, RFCH_MASTER);
	RF0ERR &= 0xf0;
    SpiWriteReg(CCxxx0_PATABLE, PaTable[RFPA_MASTER]);

	switch(cmd){
		case 0:
		  	RfTxBuf[0] = 8;
			RfTxBuf[1] = FrameCS | FT_ALL_REQ;
		  	RfTxBuf[2] = 0;
      		RfTxBuf[3] = SlaveSN & 0xff;
    		RfTxBuf[4] = SlaveSN >> 8;
      		RfTxBuf[5] = WaiterId[0];
      		RfTxBuf[6] = Product[0] & 0xff;
      		RfTxBuf[7] = Product[0] >> 8;
      		RfTxBuf[8] = B1000_0000;
      		Cc_Send(RfTxBuf, 3);
			break;
		case 1:											//send weight
		  	RfTxBuf[0] = 10;
			RfTxBuf[1] = FrameCS | FT_ALL_REQ;
		  	RfTxBuf[2] = 0;
      		//RfTxBuf[3] = SlaveSN & 0xff;
    		//RfTxBuf[4] = SlaveSN >> 8;
			RfTxBuf[3] = 0;
			RfTxBuf[4] = 0x41;
			RfTxBuf[5] = WaiterId[0];
      		RfTxBuf[6] = Product[0] & 0xff;
      		RfTxBuf[7] = Product[0] >> 8;
      		RfTxBuf[8] = B0000_0000;                //status
			RfTxBuf[10] = Wt_Delta2[PlateNow] & 0xff;
			RfTxBuf[9] = Wt_Delta2[PlateNow] >> 8;
      		Cc_Send(RfTxBuf,3);
		  	break;
		case 2:
      		RfTxBuf[0] = 8;
			RfTxBuf[1] = FrameCS | FT_ALL_REQ;
		  	RfTxBuf[2] = 0;
      		RfTxBuf[3] = SlaveSN & 0xff;
    		RfTxBuf[4] = SlaveSN >> 8;
      		RfTxBuf[5] = WaiterId[PlateNow];
      		RfTxBuf[6] = Product[0] & 0xff;
      		RfTxBuf[7] = Product[0] >> 8;
      		RfTxBuf[8] = B1011_0000;
      		Cc_Send(RfTxBuf, 3);
		  	break;
	  	case 3:
			break;
		default:
			break;
	}
}

/*
*********************************************************************************************************
*                                         Dpr_Frame
*
* Description      :
* Arguments        : none
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
// AppRFStatus
void Dpr_Frame(void)
{
	char val;
	
	char plate = AppRFStatus & 0x0f;													// generate plate
	
	switch(PlateInfo[plate] & PLRF_MSK){
		
		//----------------------------------------------------------------------
		case PLRF_WAITER1:		
		case PLRF_WAITER2:	
		//----------------------------------------------------------------------
		
			if( (RF0CTRL &0x1f) == RF_OVER){											// correct interrupt
				if(RF0CTRL & RF_TRRV){													// receive a package
					if(RF0STATUS[LQI] & CRC_OK)	{	
						
						if(RfRxBuf[0] == 2){											// waiter sync
							if(RfRxBuf[1] == FT_W2S_ACK){								// FSC always equal 0;
								Cc_Send(RfTxBuf,3);
								return;
							}
						}else{															// waiter to slave ack
							if( (RfRxBuf[1] == (FrameCS | FT_W2S_ACK)) &&
						   		(RfRxBuf[3] == (SlaveSN & 0xff)) &&
						   		(RfRxBuf[4] == (SlaveSN >> 8)) ){
									
								if( (Waiter_ctrl & WAITER_RSSI == 0)||					// RSSI  check
									(Cc_RSSI(RF0STATUS[RSSI]) > (-80)) ){				//??????
								
									FrameCS += 0x10;
									RF0ERR = 0;	
									RF0CTRL = 0;
									WaiterId[plate] = RfRxBuf[2];						// store waiter ID
	
									AppRFStatus &= ~APRF_MSK;
									AppRFStatus |= APRF_FINISH;							// goto master cmd

									Req_Master(0);										//???????????????
									return;
								}														
								
							}
						}
						
					}
				}else{																	//a transmit finish
					Cc_Receive(RfRxBuf,12);
					return;
				}
			}
			
			//error process
			if(++RF0ERR > MAX_RFRETRY){														// cannot read a waiterID
				Disp_Led(LED_WAITER);														// display error
				if(Waiter_ctrl & WAITER_SKIP){		
					
					FrameCS += 0x10;
					RF0ERR = 0;
					RF0CTRL = 0;
					WaiterId[plate] = 0;													// store waiter ID

					AppRFStatus &= ~APRF_MSK;
					AppRFStatus |= APRF_FINISH;												// goto master cmd

					Req_Master(0);															//??????????
	
				}else{
					__disable_interrupt();
					CC_INIT();
					
					AppRFStatus &= ~APRF_MSK;
					AppRFStatus |= APRF_FINISH;												// goto master cmd
					
					PlateInfo[plate] |=  PLRF_ERR;

⌨️ 快捷键说明

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