diff --git a/radio/nrf24L01/nrf-ftdi-ring.c b/radio/nrf24L01/nrf-ftdi-ring.c index f484375091d54571fd164ea1cac7e858dd1ed293..6e5f3e7966baa6a661af03b839d84a4d1df938fb 100644 --- a/radio/nrf24L01/nrf-ftdi-ring.c +++ b/radio/nrf24L01/nrf-ftdi-ring.c @@ -60,12 +60,12 @@ const uint8_t RX_DR = 1<<6; //rx data ready interrupt uint8_t read_register(uint8_t reg){ PORTC.OUTCLR = SS_BM; //SS low - _delay_ms(1); //give time after ss low + _delay_us(1); //give time after ss low SPIC.DATA = R_REGISTER | reg; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; uint8_t temp = SPIC.DATA; PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); //give time after ss high + _delay_us(1); //give time after ss high return temp; } @@ -76,41 +76,24 @@ USART_data_t USART_data; uint8_t token = 0; //token to pass uint8_t tempval = 0; -void check_registers(){ +void check_registers(uint8_t id){ + //debug only //enter standby so we can write to configuration register. PORTC.OUTCLR = CE_BM; - _delay_us(10); - - //read registers for debug - PORTC.OUTCLR = SS_BM; //SS low - _delay_us(10); - SPIC.DATA = R_REGISTER | EN_AA; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - uint8_t status = SPIC.DATA; - SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; //read - uint8_t en_aa = SPIC.DATA; - PORTC.OUTSET = SS_BM; //SS high - _delay_us(10); + _delay_us(10); PORTC.OUTCLR = SS_BM; //SS low _delay_us(10); SPIC.DATA = R_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {}; + uint8_t status = SPIC.DATA; SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; //read uint8_t config = SPIC.DATA; PORTC.OUTSET = SS_BM; //SS high _delay_us(10); - PORTC.OUTCLR = SS_BM; //SS low - _delay_us(10); - SPIC.DATA = R_REGISTER | SETUP_RETR; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; //read - uint8_t setup_retr = SPIC.DATA; - PORTC.OUTSET = SS_BM; //SS high - _delay_us(10); - + usart_send_byte(&USART_data,id); usart_send_byte(&USART_data,status); usart_send_byte(&USART_data,config); - usart_send_byte(&USART_data,en_aa); - usart_send_byte(&USART_data,setup_retr); usart_send_byte(&USART_data,token); usart_send_byte(&USART_data,10); @@ -163,7 +146,7 @@ void check_registers(){ void rx_from_standby(){ //enter standby so we can write to configuration register. PORTC.OUTCLR = CE_BM; - _delay_us(10); + _delay_us(10); //should be 10? //enter RX mode: set PRIM_RX = 1 tempval = read_register(CONFIG); @@ -171,11 +154,11 @@ void rx_from_standby(){ 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_ms(1); //give time to start up + _delay_us(1); //give time to start up //set CE for at least 10 us PORTC.OUTSET = CE_BM; - _delay_us(10); + _delay_us(10); //should be 10? //wait for pll to settle _delay_us(130); @@ -208,7 +191,7 @@ void setup(){ PORTC.PIN2CTRL = PORT_OPC_PULLUP_gc; //pull-up on IRQ PORTC.DIRSET = CE_BM; //set up CE pin on PC0 //set up spic.ctrl - SPIC.CTRL = SPI_PRESCALER_DIV128_gc | /* SPI prescaler. */ + SPIC.CTRL = SPI_PRESCALER_DIV4_gc | /* SPI prescaler. */ (0 ? SPI_CLK2X_bm : 0) | /* SPI Clock double. */ SPI_ENABLE_bm | /* Enable SPI module. */ SPI_MASTER_bm | /* SPI master. */ @@ -255,6 +238,13 @@ void setup(){ PORTC.OUTSET = SS_BM; //SS high _delay_ms(1); //give time to start up + //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 + //flush tx PORTC.OUTCLR = SS_BM; //SS low SPIC.DATA = FLUSH_TX; while(!(SPIC.STATUS & SPI_IF_bm)) {}; @@ -287,13 +277,11 @@ void setup(){ 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; @@ -301,57 +289,50 @@ void send_token(){ //put token in tx fifo PORTC.OUTCLR = SS_BM; //SS low - _delay_ms(1); + _delay_us(1); SPIC.DATA = W_TX_PAYLOAD; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = token; while(!(SPIC.STATUS & SPI_IF_bm)) {}; PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); - - check_registers(); + _delay_us(1); tempval = read_register(CONFIG); PORTC.OUTCLR = SS_BM; //SS low - _delay_ms(1); + _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_ms(1); - - check_registers(); + _delay_us(1); //pulse CE for at least 10 us - PORTC.OUTSET = CE_BM; _delay_us(15); PORTC.OUTCLR = CE_BM; + PORTC.OUTSET = CE_BM; _delay_us(10); PORTC.OUTCLR = CE_BM; //wait for pll to settle _delay_us(130); //wait until transmit complete - usart_send_byte(&USART_data,68); usart_send_byte(&USART_data,10); //for debug on usart while( PORTC.IN & IRQ_BM ){} - usart_send_byte(&USART_data,69); usart_send_byte(&USART_data,10); //for debug on usart //clear IRQ -- need to be in standby. tempval = read_register(STATUS); PORTC.OUTCLR = SS_BM; //SS low - _delay_ms(1); + _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_ms(1); + _delay_us(1); rx_from_standby(); //return to RX mode } void read_token(){ - check_registers(); //get token from rx fifo PORTC.OUTCLR = SS_BM; //SS low - _delay_ms(1); + _delay_us(1); SPIC.DATA = R_RX_PAYLOAD; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; token = SPIC.DATA; PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); + _delay_us(1); //transition from RX to standby1 (CE=0) PORTC.OUTCLR = CE_BM; @@ -360,13 +341,12 @@ void read_token(){ //clear IRQ tempval = read_register(STATUS); PORTC.OUTCLR = SS_BM; //SS low - _delay_ms(1); + _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_ms(1); - usart_send_byte(&USART_data,255); usart_send_byte(&USART_data,10); //for debug on usart - check_registers(); + _delay_us(1); + //check_registers(66); } int main(void) { @@ -374,22 +354,18 @@ int main(void) { while(1){ //should be in rx mode here. if ( !(PORTC.IN & IRQ_BM)){ - usart_send_byte(&USART_data,70); usart_send_byte(&USART_data,10); read_token(); //in standby token = 1-token; //transform token - send_token(); //in rx - usart_send_byte(&USART_data,66); usart_send_byte(&USART_data,10); //for debug on usart + //check_registers(65); + send_token(); } - //when we get signal from usart, send a token on nrf if (USART_RXBufferData_Available(&USART_data)) { - usart_send_byte(&USART_data,64); usart_send_byte(&USART_data,10); //for debug on usart USART_RXBuffer_GetByte(&USART_data); //clear usart buffer so we only fire once. - check_registers(); - send_token(); //in rx - usart_send_byte(&USART_data,65); usart_send_byte(&USART_data,10); //for debug on usart + send_token(); + //check_registers(64); } - _delay_ms(1000); + //_delay_ms(10); } } diff --git a/radio/nrf24L01/serial-monitor.py b/radio/nrf24L01/serial-monitor.py index 54bfb554915a54b599bf57f836cd6a9ab04e678e..bcb10d38ead3ea59f9c86f4fc75eb184c50a04bf 100644 --- a/radio/nrf24L01/serial-monitor.py +++ b/radio/nrf24L01/serial-monitor.py @@ -4,11 +4,12 @@ serial_ports = ["/dev/tty.usbserial-FTFMIM12", "/dev/tty.usbserial-FT9L39VL"] ser = serial.Serial(serial_ports[int(sys.argv[1])], 230400) print "connecting" -labels = ['status','config','en_aa','setup_retr','token'] +labels = ['id','status','config','token'] +print "writing to usart" +ser.write([0]) +''' while True: try: - print "writing to usart" - ser.write([0]) bytes = map(ord,ser.readline().strip('\n')) #print "read: ",bytes print bytes @@ -19,5 +20,6 @@ while True: # print bytes[len(labels):] except(KeyboardInterrupt): break +''' print "Quitting" ser.close() \ No newline at end of file