diff --git a/radio/nrf24L01/nrf-ftdi-ring.c b/radio/nrf24L01/nrf-ftdi-ring.c index 6e5f3e7966baa6a661af03b839d84a4d1df938fb..45188939ef41ccebea5a94d9546b40ab68c8fd90 100644 --- a/radio/nrf24L01/nrf-ftdi-ring.c +++ b/radio/nrf24L01/nrf-ftdi-ring.c @@ -68,13 +68,21 @@ uint8_t read_register(uint8_t reg){ _delay_us(1); //give time after ss high return temp; } - +void write_register(uint8_t reg, uint8_t val){ + PORTC.OUTCLR = SS_BM; //SS low + _delay_us(1); + SPIC.DATA = W_REGISTER | reg; while(!(SPIC.STATUS & SPI_IF_bm)) {}; + SPIC.DATA = val ; while(!(SPIC.STATUS & SPI_IF_bm)) {}; + PORTC.OUTSET = SS_BM; //SS high + _delay_us(1); +} USART_data_t USART_data; uint8_t token = 0; //token to pass uint8_t tempval = 0; +const int pll_delay_us = 130; void check_registers(uint8_t id){ //debug only @@ -147,21 +155,14 @@ void rx_from_standby(){ //enter standby so we can write to configuration register. PORTC.OUTCLR = CE_BM; _delay_us(10); //should be 10? - //enter RX mode: set PRIM_RX = 1 tempval = read_register(CONFIG); - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = tempval | PRIM_RX; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_us(1); //give time to start up - + write_register(CONFIG, tempval | PRIM_RX) //set CE for at least 10 us PORTC.OUTSET = CE_BM; _delay_us(10); //should be 10? - //wait for pll to settle - _delay_us(130); + _delay_us(pll_delay_us); } void setup(){ @@ -192,7 +193,7 @@ void setup(){ PORTC.DIRSET = CE_BM; //set up CE pin on PC0 //set up spic.ctrl SPIC.CTRL = SPI_PRESCALER_DIV4_gc | /* SPI prescaler. */ - (0 ? SPI_CLK2X_bm : 0) | /* SPI Clock double. */ + (1 ? SPI_CLK2X_bm : 0) | /* SPI Clock double. */ SPI_ENABLE_bm | /* Enable SPI module. */ SPI_MASTER_bm | /* SPI master. */ SPI_MODE_0_gc; //bits driven at falling edge, sampled at rising edge @@ -202,49 +203,20 @@ void setup(){ _delay_ms(5); //warm up - //turn off auto-retransmit - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | SETUP_RETR; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = 0 ; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); - + write_register(SETUP_RETR,0); //turn off disable auto-acknowledge - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | EN_AA; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = 0 ; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); - + write_register(EN_AA,0); //set the PWR_UP bit in the CONFIG register to 1 to enter standby mode - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = PWR_UP; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); //give time to start up - + write_register(CONFIG,PWR_UP); + _delay_ms(3); //set up data pipe 0 - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | EN_RXADDR; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = 1; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); //give time to start up - + write_register(EN_RXADDR,1); //set data pipe 0 payload length to 1 - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | RX_PW_P0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = 1; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); //give time to start up - + write_register(RX_PW_P0,1); //set data rate to 2 Mbps with high power - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | RF_SETUP; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = (0<<5) | (1<<3) | (1<<2) | (1<<1); while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); //give time to start up - + //I think there may be a typo in the data sheet here. + write_register(RF_SETUP,(0<<5) | (1<<3) | (1<<2) | (1<<1)); //flush tx PORTC.OUTCLR = SS_BM; //SS low SPIC.DATA = FLUSH_TX; while(!(SPIC.STATUS & SPI_IF_bm)) {}; @@ -252,36 +224,21 @@ void setup(){ _delay_ms(1); //give time to start up //flush rx PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = FLUSH_TX; while(!(SPIC.STATUS & SPI_IF_bm)) {}; + SPIC.DATA = FLUSH_RX; while(!(SPIC.STATUS & SPI_IF_bm)) {}; PORTC.OUTSET = SS_BM; //SS high _delay_ms(1); //give time to start up - // and mask MAX_RT interrupts on IRQ tempval = read_register(CONFIG); - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = tempval | MAX_RT; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); //give time to start up - + write_register(CONFIG,tempval | MAX_RT) //clear all interrupts tempval = read_register(STATUS); - PORTC.OUTCLR = SS_BM; //SS low - SPIC.DATA = W_REGISTER | STATUS; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = tempval | MAX_RT | RX_DR | TX_DS; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); //give time to start up - - // + write_register(STATUS,tempval | MAX_RT | RX_DR | TX_DS) + _delay_ms(1); sei(); - rx_from_standby(); } - -// NOTE: we can't do SPIC.DATA &= or |= thing because SPIC.DATA will hold STATUS!!! - void send_token(){ //transition from RX to standby1 (CE=0) PORTC.OUTCLR = CE_BM; @@ -296,31 +253,16 @@ void send_token(){ _delay_us(1); tempval = read_register(CONFIG); - PORTC.OUTCLR = SS_BM; //SS low - _delay_us(1); - SPIC.DATA = W_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = tempval & (~PRIM_RX); while(!(SPIC.STATUS & SPI_IF_bm)) {}; //make sure PRIM_RX is low - PORTC.OUTSET = SS_BM; //SS high - _delay_us(1); - + write_register(CONFIG, tempval & (~PRIM_RX)) //pulse CE for at least 10 us PORTC.OUTSET = CE_BM; _delay_us(10); PORTC.OUTCLR = CE_BM; - //wait for pll to settle - _delay_us(130); - + _delay_us(pll_delay_us); //wait until transmit complete while( PORTC.IN & IRQ_BM ){} - //clear IRQ -- need to be in standby. tempval = read_register(STATUS); - PORTC.OUTCLR = SS_BM; //SS low - _delay_us(1); - SPIC.DATA = W_REGISTER | STATUS; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = tempval | TX_DS; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_us(1); - + write_register(STATUS, tempval | TX_DS) rx_from_standby(); //return to RX mode } @@ -340,12 +282,7 @@ void read_token(){ //clear IRQ tempval = read_register(STATUS); - PORTC.OUTCLR = SS_BM; //SS low - _delay_us(1); - SPIC.DATA = W_REGISTER | STATUS; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = tempval | RX_DR; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - PORTC.OUTSET = SS_BM; //SS high - _delay_us(1); + write_register(STATUS, tempval | RX_DR) //check_registers(66); } @@ -369,6 +306,5 @@ int main(void) { } } - ISR(USARTD0_RXC_vect){USART_RXComplete(&USART_data);} ISR(USARTD0_DRE_vect){USART_DataRegEmpty(&USART_data);}