// 检查是否收到一个帧,在main里循环调用。 void inpertreter_checkFrame(void) { uint8_t i; uint8_t rfBuf[INTERPRETER_ST_MAX_LEN]; const uint8_t validLen = interpreter_getBufferValidDataLen(); // if(interpreter_status == INTERPRETER_ST_FINDING_55) { // 先要判断是否有足够的数据。 if(validLen < 1) return; if(interpreter_getAByte() == (uint8_t)0x55) interpreter_status = INTERPRETER_ST_NEED_AA; } else if(interpreter_status == INTERPRETER_ST_NEED_AA) { if(validLen < 2) return; if(interpreter_getAByte() == (uint8_t)0xAA) { // 获取帧长度。 interpreter_status = interpreter_getAByte(); // // 判断长度有效性。 if(interpreter_status > INTERPRETER_ST_MAX_LEN) interpreter_status = INTERPRETER_ST_FINDING_55; } else // 如果状态是NEED_AA,而实际不是,就重新FINDING_55。 interpreter_status = INTERPRETER_ST_FINDING_55; } else if(interpreter_status <= INTERPRETER_ST_MAX_LEN) { if(validLen < interpreter_status) return; for(i=0;i<interpreter_status;i++) rfBuf[i] = interpreter_getAByte(); rf_transmit(rfBuf,interpreter_status); interpreter_status = INTERPRETER_ST_FINDING_55; } else interpreter_status = INTERPRETER_ST_FINDING_55; }
void rf_broadcast(uint8_t type, uint8_t data) { uint8_t buffer[2] = {type, data}; rf_packet_t packet = { .dest_addr = 0xFFFF, .length = 2, .data = buffer }; rf_transmit(&packet); } void rf_broadcast_16(uint8_t type, uint16_t data) { uint8_t buffer[3] = {type, 0, 0}; *((uint16_t*)(&buffer[1])) = data; rf_packet_t packet = { .dest_addr = 0xFFFF, .length = 3, .data = buffer }; rf_transmit(&packet); } void rf_tx(uint16_t addr, uint8_t type, uint8_t data) { uint8_t buffer[2] = {type, data}; rf_packet_t packet = { .dest_addr = addr, .length = 2, .data = buffer }; rf_transmit(&packet); } void rf_tx_16(uint16_t addr, uint8_t type, uint16_t data) { uint8_t buffer[3] = {type, 0, 0}; *((uint16_t*)(&buffer[1])) = data; rf_packet_t packet = { .dest_addr = addr, .length = 3, .data = buffer }; rf_transmit(&packet); } void rf_transmit(rf_packet_t *packet) { uint8_t status; do { status = TRX_STATUS_struct.trx_status; } while((status == BUSY_TX) || (status == BUSY_TX_ARET) || (status == BUSY_RX) || (status == BUSY_RX_AACK)); TRX_STATE_struct.trx_cmd = CMD_PLL_ON; while(TRX_STATUS_struct.trx_status != PLL_ON) ; // print("In PLL_ON state.\n"); uint8_t length = packet->length + 13; // 2 byte FCF, 1 byte seq no, 4 bytes destination address, 4 bytes source address, ... data ..., 2 byte CRC uint8_t *buffer = (uint8_t*)&TRXFBST; buffer[0] = length; // Reserved(1), Intra PAN(1), ACK req(1), Frame pend(1), Security(1), Frame type(3) // Frame types:: 000: Beacon 001: Data 010: Ack 011: MAC command if (packet->req_ack) buffer[1] = 0b00100001; // FCF else buffer[1] = 0b00000001; // FCF // Src adr mode(2), Frame ver.(2), Dest adr mode(2), Reserved(2) // Adr modes: 00: None 01: Reserved 10: 16-bit 11: 64-bit buffer[2] = 0b10001000; // FCF buffer[3] = rf.seq_no++; // seq no buffer[4] = rf.pan_id&0xFF; buffer[5] = rf.pan_id>>8; buffer[6] = packet->dest_addr&0xFF; buffer[7] = packet->dest_addr>>8; buffer[8] = rf.pan_id&0xFF; buffer[9] = rf.pan_id>>8; buffer[10] = rf.addr&0xFF; // Use address in packet? buffer[11] = rf.addr>>8; memcpy(buffer+12, packet->data, packet->length); dbg_print("Transmitting packet"); TRX_STATE_struct.trx_cmd = CMD_TX_ARET_ON; while (TRX_STATUS_struct.trx_status != TX_ARET_ON); TRX_STATE_struct.trx_cmd = CMD_TX_START; //while(TRX_STATUS_struct.trx_status != BUSY_TX); }