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