boop/betty_TAE/MSP430/trunk/rf.c
2017-07-01 21:56:25 +02:00

163 lines
3.1 KiB
C

/*
rf.c -
Copyright (C) 2008
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "cc1100.h"
#include "hardware.h"
#include "rf.h"
#include <msp430.h>
#include <signal.h>
//#include <mspgcc/util.h>
unsigned char RFbuf[64];
volatile unsigned char RFstatus;
unsigned char cc1100Addr;
void switch_to_idle(void) {
cc1100_strobe(SIDLE);
while (cc1100_read1(0x35 | READ | BURST) != 01);
}
void RF_init (void) {
cc1100_init();
RFstatus = 0;
cc1100Addr = conf[0x09];
cc1100_strobe(SRX);
P1IE = CC_MISO;
}
void waitTX(void)
{
unsigned char status;
unsigned char x;
x=1;
while (x) {
status = cc1100_strobe(SNOP);
switch ( 0xf0 & status) {
case 0x70:
cc1100_strobe(SFTX);
break;
case 0x10:
if (RFstatus & WORsend)
cc1100_strobe(SIDLE);
x=0;
break;
case 0x00:
if (!(RFstatus & WORsend))
cc1100_strobe(SRX);
x=0;
break;
}
}
}
void RF_send(unsigned char* b) {
unsigned char P1IE_state;
P1IE_state = (P1IE & CC_MISO);
P1IE &= ~CC_MISO;
cc1100_write(TX_fifo | BURST,b,b[0]+1);
cc1100_strobe(STX);
waitTX();
P1IE |= P1IE_state;
}
void RF_getfifo(unsigned char* b) {
cc1100_read(RX_fifo, b,1);
cc1100_read(RX_fifo, &b[1],b[0]);
}
void RF_sendWOR(unsigned char addr) {
unsigned char b[2];
b[0]=0x01;
b[1]=addr;
RFstatus |= WORsend;
cc1100_write1(0x18,conf[0x18] & 0xCF);
cc1100_strobe(SIDLE);
cc1100_strobe(SCAL);
waitTX();
TACTL = TASSEL_1 //ACLK
| MC_2 /* Timer A mode control: 2 - Continous up */
| TACLR;
while(TAR < 0x3800) {
cc1100_write(TX_fifo | BURST,b,2);
cc1100_strobe(STX);
waitTX();
}
cc1100_write1(0x18,conf[0x18]);
RFstatus &= ~WORsend;
waitTX();
P1OUT ^= WD_RST;
}
interrupt (PORT1_VECTOR) RF_IRQ (void) {
if (cc1100_read1(0x3B | READ | BURST) > 0) {
RF_getfifo(RFbuf);
cc1100_strobe(SIDLE);
cc1100_strobe(SFRX);
cc1100_strobe(SRX);
struct cc1100frame_ *RXframe;
RXframe = (struct cc1100frame_ *)&RFbuf[0];
if (RXframe->len > 3) {
switch ( RXframe->packetType) {
case 0x01:
break;
case 0x02:
if (RXframe->data[0] == 0x01) {
RXframe->destAddr = RXframe->srcAddr;
RXframe->srcAddr = cc1100Addr;
RXframe->data[0] = 0x02;
RXframe->len = 0x04;
switch_to_idle();
RF_send(RFbuf);
P1OUT ^= WD_RST;
}
else if (RFbuf[headerLen] == 0x02) {
RFstatus |= Received;
}
break;
case 0x03:
break;
}
}
}
waitTX();
P1IFG = 0;
P1OUT ^= WD_RST;
}