uint8_t mrf_rssi(void) { uint8_t rssi; mrf_write_short(0x3E, 0x80); // Wait for result to be ready while(!(mrf_read_short(0x3E) & 0x01)); rssi = mrf_read_long(0x210); mrf_write_short(0x3E, 0x40); return rssi; }
extern "C" void EINT3_IRQHandler(void) { uint8_t flags; //LPC_GPIO1->FIOPIN ^= 1<<31; LPC_GPIOINT->IO2IntClr |= (1 << 4); // Clear mbed interrupt flag flags = mrf_read_short(INTSTAT); // Read radio interrupt flags if(flags & 0x01) { tx_status_ready = 1; } if(flags & 0x08) { //nrk_led_toggle(GREEN_LED); rf_parse_rx_packet(); rfSettings.pRxInfo = rf_rx_callback(rfSettings.pRxInfo); } }
uint8_t rf_tx_packet(RF_TX_INFO *pRTI) { uint16_t frameControlField; uint8_t packetLength; uint8_t success, i; // Note: checksum is automatic in HW LPC_GPIO1->FIOPIN ^= 1<<31; packetLength = pRTI->length + RF_PACKET_OVERHEAD_SIZE; frameControlField = RF_FCF_NOACK; if(auto_ack_enable || pRTI->ackRequest) frameControlField |= RF_ACK_BM; if(security_enable) frameControlField |= 0x0000; // TODO: Paul Gurniak, add security mrf_write_long(TXNFIFO, RF_PACKET_OVERHEAD_SIZE); // No checksum, overhead is all header mrf_write_long(TXNFIFO+1, packetLength); // Write header bytes mrf_write_long(TXNFIFO+2, frameControlField & 0xFF); mrf_write_long(TXNFIFO+3, frameControlField >> 8); mrf_write_long(TXNFIFO+4, rfSettings.txSeqNumber); mrf_write_long(TXNFIFO+5, rfSettings.panId & 0xFF); mrf_write_long(TXNFIFO+6, rfSettings.panId >> 8); mrf_write_long(TXNFIFO+7, pRTI->destAddr & 0xFF); mrf_write_long(TXNFIFO+8, pRTI->destAddr >> 8); mrf_write_long(TXNFIFO+9, rfSettings.myAddr & 0xFF); mrf_write_long(TXNFIFO+10, rfSettings.myAddr >> 8); // Write payload for(i = 0; i < pRTI->length; i++) { mrf_write_long(TXNFIFO+11+i, pRTI->pPayload[i]); // pPayload is the user defined part of data packet right ? } if(pRTI->cca) { uint8_t cnt = 0; if(!rfSettings.receiveOn) { rf_rx_on(); } while(!rf_rx_check_cca()) { cnt++; if(cnt > 100) { return FALSE; } halWait(100); } } tx_status_ready = 0; mrf_write_short(TXNCON, auto_ack_enable ? 0x05 : 0x01); // Send contents of TXNFIFO as packet //putchar(auto_ack_enable); // Wait for Tx to finish while(!tx_status_ready); wait_ms(50); success = 1; //putchar(auto_ack_enable); if(auto_ack_enable || pRTI->ackRequest) { uint8_t k = mrf_read_short(TXSTAT); success = !(k & 0x01); //printf("ACK%c",k); } //printf("tx_pkt success = %d\r\n",success); // Transmission works fine : Checked by Madhur, success = 1only when the receiver is enabled // Increment sequence, return result rfSettings.txSeqNumber++; return success; }
void rf_set_cca_mode(uint8_t mode) { uint8_t tmp = mrf_read_short(BBREG2); tmp = (tmp & 0x3F) | ((mode & 0x3) << 6); mrf_write_short(BBREG2, tmp); }
void rf_auto_ack_disable() { uint8_t rxmcr = mrf_read_short(RXMCR); mrf_write_short(RXMCR, rxmcr | (1 << 5)); // Disable auto-ack auto_ack_enable = 0; }
void rf_auto_ack_enable() { uint8_t rxmcr = mrf_read_short(RXMCR); mrf_write_short(RXMCR, rxmcr & ~(1 << 5)); // Enable auto-ack auto_ack_enable = 1; }
void rf_addr_decode_disable(void) { uint8_t rxmcr = mrf_read_short(RXMCR); mrf_write_short(RXMCR, rxmcr | (1 << 0)); // SET to IGNORE address field }
void rf_addr_decode_enable(void) { uint8_t rxmcr = mrf_read_short(RXMCR); mrf_write_short(RXMCR, rxmcr &~(1 << 0)); // CLEAR to USE address field }
uint16_t mrf_pan_read(void) { uint8_t panh = mrf_read_short(MRF_PANIDH); return panh << 8 | mrf_read_short(MRF_PANIDL); }