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; }
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; } }
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; }
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; }
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; }
bool NRFLib::data_ready(void){ if (_txmode) RXMode(); unsigned char status = SPI_Read(STATUS); // read register STATUS's value return (status & RX_DR); }