📄 at86rf230.h
字号:
DDR_RF230_IRQ = 0;
DDR_RF230_SLP_TR = 1;
DDR_RF230_RESET = 1;
DDR_RF230_SEL = 1;
RF230_SEL = 1; //Initialize chip select signal high
RF230_RESET = 1;
RF230_SLP_TR = 0;
}
/****************************************************************************
* 2 byte SPI transmit. Information in second byte is thrown away, just
* transmit junk data to receive byte.
****************************************************************************/
unsigned char RF_read_register(unsigned char address) {
unsigned char junk;
RF230_SEL = 0;
//Address should only be 6 bits. MSB should be 1, bit 6 should be 0.
//Writing to SPDR0 starts transmission
SPDR0 = 128 + (address & 0b00111111);
while((SPSR0&0x80) == 0); //Wait for transfer to complete
junk = SPDR0;
//Start next transmission, transmit junk, get back data from register
SPDR0 = 0x00;
while((SPSR0&0x80) == 0); //Wait for transfer to complete
RF230_SEL = 1;
return SPDR0; //Return contents of register in transceiver
}
/****************************************************************************
* 2 byte SPI transmit. Information in second byte is data to write to register
*****************************************************************************/
void RF_write_register(unsigned char address, unsigned char data) {
unsigned char junk;
RF230_SEL = 0;
//First 2 bits are 11, rest is address. Start transmitting command
SPDR0 = 192 + (address & 0b00111111);
while((SPSR0&0x80) == 0); //Wait for transfer to complete
junk = SPDR0;
SPDR0 = data;
while ((SPSR0&0x80) == 0); //Wait for transfer to complete
RF230_SEL = 1;
}
/****************************************************************************
* Initialize basic one-way transmitter
****************************************************************************/
void RF_init_transmitter(void) {
//RF_write_register(TRX_CTRL_0,
//Should write to TRX_CTRL_0 register to set output current and
//clockspeed settings.
RF230_RESET = 0;
#asm
nop
nop
nop
nop
nop
#endasm
RF230_RESET = 1;
RF_write_register(TRX_CTRL_0,0b01001000);
delay_us(800);
//enable ONLY the TRX_done interrupt
RF_write_register(IRQ_MASK,0b00001000);
delay_us(200);
RF_write_register(PHY_TX_PWR,0); //reduced power on transmit
delay_us(200);
RF_write_register(PHY_CC_CCA,11); //channel 11
delay_us(200);
RF_write_register(TRX_STATE,FORCE_TRX_OFF);
delay_us(1880);
RF_write_register(TRX_STATE,PLL_ON);
delay_us(200);
RF_write_register(TRX_CTRL_0,0b01001000);
delay_us(800);
RF_write_register(TRX_STATE,FORCE_TRX_OFF);
delay_us(1880);
RF_write_register(TRX_STATE,PLL_ON);
delay_us(200);
}
/****************************************************************************/
void RF_tx_to_rx(void) {
RF_write_register(TRX_STATE,FORCE_TRX_OFF);
delay_us(1880);
RF_write_register(TRX_STATE,RX_ON);
delay_us(200);
}
/****************************************************************************/
void RF_rx_to_tx(void) {
RF_write_register(TRX_STATE,FORCE_TRX_OFF);
delay_us(1880);
RF_write_register(TRX_STATE,PLL_ON);
delay_us(200);
}
/****************************************************************************
/* Transmit once per second... call this once every second
*****************************************************************************/
void RF_transmit_test(void) {
unsigned char i;
RF_write_register(TRX_STATE,PLL_ON);
RF230_SEL = 0;
SPDR0 = 0b01100000; //Frame transmit mode
while((SPSR0&0x80) == 0); //Wait for transfer to complete
SPDR0 = 100; //Frame length
while((SPSR0&0x80) == 0); //Wait for transfer to complete
for (i=0;i<100;i++) {
SPDR0 = i;
while((SPSR0&0x80) == 0); //Wait for transfer to complete
}
RF230_SEL = 1;
RF230_SLP_TR = 1; //Signal to transmit frame
#asm
nop
nop
nop
nop
nop
#endasm
RF230_SLP_TR = 0;
do { //Loop until end of transmit frame, when we break out of loop
if (RF230_IRQ != 0) {
//Get the status of the IRQ
curr_IRQ_status = RF_read_register(IRQ_STATUS);
PORTA = curr_IRQ_status;
}
//Loop until done done transmitting frame
} while ((curr_IRQ_status & IRQ_TRX_END) == 0);
}
/****************************************************************************/
void RF_init_receiver(void) {
RF230_RESET = 0;
#asm
nop
nop
nop
nop
nop
#endasm
RF230_RESET = 1;
RF_write_register(TRX_CTRL_0,0b01001000);
delay_us(800);
//enable ONLY the TRX_done interrupt
RF_write_register(IRQ_MASK,0b00001000);
delay_us(200);
RF_write_register(TRX_STATE,FORCE_TRX_OFF);
delay_us(1880);
RF_write_register(TRX_STATE,RX_ON);
delay_us(200);
}
/****************************************************************************/
void RF_receive_test(void) {
//Put transceiver in listen mode
//Wait for IRQ indicating end of frame
//Upload frame, digest
//Done, start again immediately
unsigned char length,LQI;
unsigned char junk = 0;
unsigned char frame[128];
unsigned char index = 0;
do {
if (RF230_IRQ != 0) {
curr_IRQ_status = RF_read_register(IRQ_STATUS);
}
//Loop until done receiving frame, then we can start uploading
} while ((curr_IRQ_status & IRQ_TRX_END) == 0);
RF230_SEL = 0;
SPDR0 = 0b00100000; //Frame receive mode
while((SPSR0&0x80)==0); //Wait for frame transfer to complete
SPDR0 = junk; //Transmit a junk byte to receive a byte of frame
while((SPSR0&0x80) == 0); //Wait for transfer to complete
length = SPDR0;
while (length>0) {
SPDR0 = junk;
while((SPSR0&0x80) == 0); //Wait for transfer to complete
frame[index++]=SPDR0; //Get byte of frame
length--;
}
SPDR0 = junk;
while((SPSR0&0x80) == 0);
LQI = SPDR0; //LQI is a byte between 0 (bad) and 255(excellent)
PORTA = LQI;
RF230_SEL = 1;
}
/****************************************************************************
* Transceiver must be in appropriate state before calling this
****************************************************************************/
void RF_download_frame(void) {
unsigned char i;
RF_write_register(TRX_STATE,PLL_ON);
RF230_SEL = 0;
SPDR0 = 0b01100000; //Frame transmit mode
while((SPSR0&0x80) == 0); //Wait for transfer to complete
SPDR0 = tx_frame_length; //Frame length
while((SPSR0&0x80) == 0); //Wait for transfer to complete
for (i=0;i<tx_frame_length;i++) {
SPDR0 = transmit_frame[i];
while((SPSR0&0x80) == 0); //Wait for transfer to complete
}
RF230_SEL = 1;
}
/****************************************************************************
* Function must be called AFTER RF_download_frame() and when Transceiver is
* in PLL_ON state.
****************************************************************************/
void RF_transmit_frame(void) {
//TODO: First test to make sure transceiver is in proper state.
RF230_SLP_TR = 1; //Signal to transmit frame
#asm
nop
nop
nop
nop
nop
#endasm
RF230_SLP_TR = 0;
}
/****************************************************************************
* Call this function when in Receiver mode. When this function returns, it is
* time to start receiving.
****************************************************************************/
void RF_receiver_listen(void) {
do {
if (RF230_IRQ != 0) {
curr_IRQ_status = RF_read_register(IRQ_STATUS);
}
//if ((IRQ_status & IRQ_TRX_END) != 0) break;
//Loop until done receiving frame, then we can start uploading
} while ((curr_IRQ_status & IRQ_TRX_END) == 0);
curr_IRQ_status = 0;
}
/****************************************************************************/
unsigned char RF_quick_listen(void) {
unsigned char returnval = 0;
if (RF230_IRQ != 0) {
curr_IRQ_status = RF_read_register(IRQ_STATUS);
if ((curr_IRQ_status & IRQ_TRX_END) != 0) returnval = 1;
else returnval = 0;
}
curr_IRQ_status = 0;
return returnval;
}
/****************************************************************************/
void RF_upload_frame(void) {
unsigned char i;
RF230_SEL = 0;
SPDR0 = 0b00100000; //Frame receive mode
while((SPSR0&0x80)==0); //Wait for transfer to complete
SPDR0 = 0x00; //Transmit a junk byte to receive a byte of frame
while((SPSR0&0x80) == 0); //Wait for transfer to complete
rx_frame_length = SPDR0;
i = 0;
while (i<rx_frame_length) {
SPDR0 = 0x00;
while((SPSR0&0x80) == 0); //Wait for transfer to complete
receive_frame[i++]=SPDR0; //Get byte of frame
}
SPDR0 = 0x00;
while((SPSR0&0x80) == 0);
LQI = SPDR0; //LQI is a byte between 0 (bad) and 255(excellent)
RF230_SEL = 1;
}
/****************************************************************************/
unsigned char RF_update_IRQ_status(void) {
if (RF230_IRQ == 1) {
curr_IRQ_status = RF_read_register(IRQ_STATUS);
return 1;
}
else return 0;
}
/****************************************************************************/
unsigned char RF_transmit_done(void) {
RF_update_IRQ_status();
if ((curr_IRQ_status & IRQ_TRX_END) != 0) return 1;
//if transmit has completed, return 1.
else return 0;
}
/****************************************************************************/
void RF_wait_for_transmit(void) {
do { //Loop until end of transmit frame, when we break out of loop
if (RF230_IRQ != 0) {
//Get the status of the IRQ
curr_IRQ_status = RF_read_register(IRQ_STATUS);
//PORTA = curr_IRQ_status;
}
} while ((curr_IRQ_status & IRQ_TRX_END) == 0);
curr_IRQ_status = 0;
}
/****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -