#include<reg9e5.h> #define HFREQ 0 // 0=433MHz, 1=868/915MHz #define CHANNEL 106 // Channel number: f(MHz) = (422.4+CHANNEL/10)*(1+HFREQ) #define POWER 3 // 0=min power...3 = max power #define uchar unsigned char; uchar incoming, outgoing; bit newin=0, gone=0; int i, inbox[20]; //typedef unsigned char byte; unsigned char SpiReadWrite(unsigned char b); void Delay400us(volatile unsigned char n); unsigned char ReceivePacket(); void serint(void); void UartInit(void); void NrfInit(void); void Receiver(void); void send(void); void initial_t(void); void TransmitPacket(unsigned char b); void Transmitter(void); void main(void) { i = 0; UartInit(); Receiver(); NrfInit(); while(1) { if(newin) { inbox[i] = incoming; i++; newin = 0; } if(gone) { send(); gone = 0; } } } void serint(void) interrupt 4 { if(RI) { incoming = SBUF; RI = 0; newin = 1; } if(TI) { outgoing = inbox[i--]; SBUF = outgoing; TI = 0; gone = 1; } } void UartInit(void) { TH1 = 243; // 19200@16MHz (when T1M=1 and SMOD=1) CKCON |= 0x10; // T1M=1 (/4 timer clock) TMOD &= ~0x30; TMOD |= 0x20; // Timer1 8bit auto reload TCON = 0x40; // Start timer1 PCON = 0x80; // SMOD=1 (double baud rate) SCON = 0x52; // Serial mode1, enable receiver P0_ALT |= 0x06; // Alternate functions on pins P0.1-2 P0_DIR |= 0x02; // P0.1 (RxD) is input IE=0x90; // Enable serial port interrupt } void NrfInit(void) { //unsigned char cklf; unsigned char tmp; SPICLK = 0; // Max SPI clock SPI_CTRL = 0x02; // Connect SPI controller to Radio /*// switch to 16MHz clock: RACSN = 0; SpiReadWrite(RRC | 0x09); cklf = SpiReadWrite(0) | 0x04; RACSN = 1; RACSN = 0; SpiReadWrite(WRC | 0x09); SpiReadWrite(cklf); RACSN = 1;*/ // Configure Radio: RACSN = 0; SpiReadWrite(WRC | 0x03); // Write to RF config address 3 (RX payload) SpiReadWrite(0x01); // One byte RX payload SpiReadWrite(0x01); // One byte TX payload RACSN = 1; RACSN = 0; SpiReadWrite(RRC | 0x01); // Read RF config address 1 tmp = SpiReadWrite(0) & 0xf1; // Clear the power and frequency setting bits RACSN = 1; RACSN = 0; SpiReadWrite(WRC | 0x01); // Write RF config address 1 // Change to 433 or 868/915MHz defined by HFREQ above: SpiReadWrite(tmp | (HFREQ << 1)); RACSN = 1; } unsigned char SpiReadWrite(unsigned char b) { EXIF &= ~0x20; // Clear SPI interrupt SPI_DATA = b; // Move byte to send to SPI data register while((EXIF & 0x20) == 0x00) // Wait until SPI has finished transmitting ; return SPI_DATA; } void send(void) { initial_t(); Transmitter(); } void initial_t(void) { unsigned char tmp; P0_ALT = 0x00; P0_DIR = 0xFF; RACSN = 0; SpiReadWrite(WRC | 0x01); // Write RF config address 1 // Change power defined by POWER and to 433 or 868/915MHz defined by HFREQ above: SpiReadWrite(tmp | (POWER <<2) | (HFREQ << 1)); RACSN = 1; } void TransmitPacket(unsigned char b) { RACSN = 0; SpiReadWrite(WTP); SpiReadWrite(b); RACSN = 1; TRX_CE = 1; Delay400us(1); TRX_CE = 0; } void Transmitter(void) { int b; TXEN = 1; for(b=1;b<=10;b++) { TransmitPacket(P0); } } void Delay400us(volatile unsigned char n) { unsigned char i; while(n--) for(i=0;i<35;i++) ; } unsigned char ReceivePacket() { unsigned char b; TRX_CE = 1; while(DR == 0); RACSN = 0; SpiReadWrite(RRP); b = SpiReadWrite(0); RACSN = 1; TRX_CE = 0; return b; } void Receiver(void) { unsigned char b; TXEN = 0; for(b=1;b<=10;b++) { b = ReceivePacket(); P0 = (b >> 1); } }