Example #1
0
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;
}
Example #2
0
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);
    }
}
Example #3
0
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;
}
Example #4
0
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);
}
Example #5
0
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;
}
Example #6
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;
}
Example #7
0
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
}
Example #8
0
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
}
Example #9
0
uint16_t mrf_pan_read(void) {
    uint8_t panh = mrf_read_short(MRF_PANIDH);
    return panh << 8 | mrf_read_short(MRF_PANIDL);
}