Exemplo n.º 1
0
// 检查是否收到一个帧,在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;
}
Exemplo n.º 2
0
Arquivo: rf.c Projeto: skyfex/happygem
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); 
}