Exemplo n.º 1
0
uint8 SendByCSMA(u8 *buff,uint8 length)
{
    uint8 cca_value = 0;
    uint32 wait_time = 0;
    uint32 q,w;
    //wait_time = ((MAX_DEVICE_NUM - EndPointDevice.free_node)*SLOT_LENGTH)/10;
    q=MAX_DEVICE_NUM - EndPointDevice.free_node;
    w=q*SLOT_LENGTH;
    wait_time=w/100;

    while(Frame_Time<=wait_time);      //等待到达CSMA时隙 超帧内时间<=负载数*时隙长度
    //TIME1_LOW;
    CSMABackOff();
    //TIME1_HIGH;
    cca_value = (A7139_GetRSSI()+A7139_GetRSSI())/2;

    if(cca_value<CCA)
    {
        SendPack();
        RXMode();
    }
    else
    {
        CSMABackOff();
        CSMA_BackOff_Count++;
    }

    if(CSMA_BackOff_Count>CSMA_BACKOFF_TIME)
        return CSMA_FAIL;
    else
        return CSMA_SUCCESS;

}
Exemplo n.º 2
0
uint8 RecvDataACK()
{
    send_time = Frame_Time;
    while(GIO2==0)
    {
        if(Frame_Time>send_time+DATAACK_TIMEOUT)             //60为DataACK接收超时,在收到ACK时不会进入if内
        {
            TIME1_LOW;
            resend_count++;
            EndPointDevice.data_ack = 0;
            RXMode();
            //TIME1_HIGH;
            PostTask(EVENT_CSMA_RESEND);
            return 0;
        }
        
            
    }
    
    A7139_ReadFIFO(DataRecvBuffer,MAX_PACK_LENGTH);
    RXMode();
    if(PackValid()&&(Unpack(DataRecvBuffer) == DATAACK_TYPE)) //如果收到正确的ACK
    {
        DataACKHandler();
        if(EndPointDevice.power == 1)
        {
            A7139_DeepSleep();
            DIS_INT;
        }
        return 1;
    }
    else                                                        //否则进入CSMA阶段
    {
        PostTask(EVENT_CSMA_RESEND);
        EndPointDevice.data_ack = 0;
        return 0;
    }
        
       
}
Exemplo n.º 3
0
bool NRFLib::wait_for_message(unsigned char buf[], int wait) {
	if (_txmode)
		RXMode();

	unsigned char received;

	for (int i=0; i<wait; i++) {
		received = receive_message(buf);
		if (received) return true;
		delay(1);
	}
	return false;
}
Exemplo n.º 4
0
bool NRFLib::receive_message(unsigned char buf[]) {
	if (_txmode)
		RXMode();
	unsigned char status = SPI_Read(STATUS);                         // read register STATUS's value
	unsigned char fifo = SPI_Read(0x17);
	//if(status&RX_DR){                                              // if receive data ready (TX_DS) interrupt
	if (!(fifo&1)) {
	  SPI_Read_Buf(RD_RX_PLOAD, buf, _payload);             // read playload to rx_buf
	  //flushRX();                                        // clear RX_FIFO
	  SPI_RW_Reg(WRITE_REG+STATUS,0x70); //0x70);                             // clear RX_DR or TX_DS or MAX_RT interrupt flag
	  return true;
	}
	return false;
}
Exemplo n.º 5
0
void DataSend(void)
{
    
    //before_slot_wake = (((EndPointDevice.cluster_innernum-1)*SLOT_LENGTH)-WAKE_TIME)+5000;
    //为什么写一起就不对!!!
    a = (EndPointDevice.cluster_innernum-1);
    b = a*SLOT_LENGTH;
    c = b + 5000;               //每个时隙向后移5ms,让中继切换状态
    before_slot_wake = (c-WAKE_TIME)/100;
    
    DIS_INT;
    while(Frame_Time<=before_slot_wake);
    EndPointDevice.data_ack = 0;
    

    A7139_Wake();

    CreatSendData();
    TIME1_LOW;
    SendPack();
    RXMode();
    ack_flag = RecvDataACK();
    if(ack_flag == 1)
    {
        A7139_Sleep();
    }
    else
    {
        EN_INT;
        
        //TIME1_HIGH;
        //delay_ms(5);
        //TIME1_LOW;
        //delay_ms(5);
        //TIME1_HIGH;
        
    }
    if((EndPointDevice.power == 0))
        EN_INT;
}
Exemplo n.º 6
0
bool NRFLib::data_ready(void){
	if (_txmode)
		RXMode();
	unsigned char status = SPI_Read(STATUS);                         // read register STATUS's value
	return (status & RX_DR);
}