📄 sdpr.c
字号:
/*
*********************************************************************************************************
* 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 + -