Skip to content
Snippets Groups Projects
Commit 022a0eaa authored by Sam Calisch's avatar Sam Calisch
Browse files

ring is working at 550us round trip

parent 55897f8f
Branches
No related tags found
No related merge requests found
...@@ -60,12 +60,12 @@ const uint8_t RX_DR = 1<<6; //rx data ready interrupt ...@@ -60,12 +60,12 @@ const uint8_t RX_DR = 1<<6; //rx data ready interrupt
uint8_t read_register(uint8_t reg){ uint8_t read_register(uint8_t reg){
PORTC.OUTCLR = SS_BM; //SS low 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 = R_REGISTER | reg; while(!(SPIC.STATUS & SPI_IF_bm)) {};
SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {};
uint8_t temp = SPIC.DATA; uint8_t temp = SPIC.DATA;
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_ms(1); //give time after ss high _delay_us(1); //give time after ss high
return temp; return temp;
} }
...@@ -76,41 +76,24 @@ USART_data_t USART_data; ...@@ -76,41 +76,24 @@ USART_data_t USART_data;
uint8_t token = 0; //token to pass uint8_t token = 0; //token to pass
uint8_t tempval = 0; uint8_t tempval = 0;
void check_registers(){ void check_registers(uint8_t id){
//debug only
//enter standby so we can write to configuration register. //enter standby so we can write to configuration register.
PORTC.OUTCLR = CE_BM; PORTC.OUTCLR = CE_BM;
_delay_us(10); _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);
PORTC.OUTCLR = SS_BM; //SS low PORTC.OUTCLR = SS_BM; //SS low
_delay_us(10); _delay_us(10);
SPIC.DATA = R_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {}; 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 SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; //read
uint8_t config = SPIC.DATA; uint8_t config = SPIC.DATA;
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_us(10); _delay_us(10);
PORTC.OUTCLR = SS_BM; //SS low usart_send_byte(&USART_data,id);
_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,status); usart_send_byte(&USART_data,status);
usart_send_byte(&USART_data,config); 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,token);
usart_send_byte(&USART_data,10); usart_send_byte(&USART_data,10);
...@@ -163,7 +146,7 @@ void check_registers(){ ...@@ -163,7 +146,7 @@ void check_registers(){
void rx_from_standby(){ void rx_from_standby(){
//enter standby so we can write to configuration register. //enter standby so we can write to configuration register.
PORTC.OUTCLR = CE_BM; PORTC.OUTCLR = CE_BM;
_delay_us(10); _delay_us(10); //should be 10?
//enter RX mode: set PRIM_RX = 1 //enter RX mode: set PRIM_RX = 1
tempval = read_register(CONFIG); tempval = read_register(CONFIG);
...@@ -171,11 +154,11 @@ void rx_from_standby(){ ...@@ -171,11 +154,11 @@ void rx_from_standby(){
SPIC.DATA = W_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = W_REGISTER | CONFIG; while(!(SPIC.STATUS & SPI_IF_bm)) {};
SPIC.DATA = tempval | PRIM_RX; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = tempval | PRIM_RX; while(!(SPIC.STATUS & SPI_IF_bm)) {};
PORTC.OUTSET = SS_BM; //SS high 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 //set CE for at least 10 us
PORTC.OUTSET = CE_BM; PORTC.OUTSET = CE_BM;
_delay_us(10); _delay_us(10); //should be 10?
//wait for pll to settle //wait for pll to settle
_delay_us(130); _delay_us(130);
...@@ -208,7 +191,7 @@ void setup(){ ...@@ -208,7 +191,7 @@ void setup(){
PORTC.PIN2CTRL = PORT_OPC_PULLUP_gc; //pull-up on IRQ PORTC.PIN2CTRL = PORT_OPC_PULLUP_gc; //pull-up on IRQ
PORTC.DIRSET = CE_BM; //set up CE pin on PC0 PORTC.DIRSET = CE_BM; //set up CE pin on PC0
//set up spic.ctrl //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. */ (0 ? SPI_CLK2X_bm : 0) | /* SPI Clock double. */
SPI_ENABLE_bm | /* Enable SPI module. */ SPI_ENABLE_bm | /* Enable SPI module. */
SPI_MASTER_bm | /* SPI master. */ SPI_MASTER_bm | /* SPI master. */
...@@ -255,6 +238,13 @@ void setup(){ ...@@ -255,6 +238,13 @@ void setup(){
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_ms(1); //give time to start up _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 //flush tx
PORTC.OUTCLR = SS_BM; //SS low PORTC.OUTCLR = SS_BM; //SS low
SPIC.DATA = FLUSH_TX; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = FLUSH_TX; while(!(SPIC.STATUS & SPI_IF_bm)) {};
...@@ -287,13 +277,11 @@ void setup(){ ...@@ -287,13 +277,11 @@ void setup(){
sei(); sei();
rx_from_standby(); rx_from_standby();
} }
// NOTE: we can't do SPIC.DATA &= or |= thing because SPIC.DATA will hold STATUS!!! // NOTE: we can't do SPIC.DATA &= or |= thing because SPIC.DATA will hold STATUS!!!
void send_token(){ void send_token(){
//transition from RX to standby1 (CE=0) //transition from RX to standby1 (CE=0)
PORTC.OUTCLR = CE_BM; PORTC.OUTCLR = CE_BM;
...@@ -301,57 +289,50 @@ void send_token(){ ...@@ -301,57 +289,50 @@ void send_token(){
//put token in tx fifo //put token in tx fifo
PORTC.OUTCLR = SS_BM; //SS low 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 = W_TX_PAYLOAD; while(!(SPIC.STATUS & SPI_IF_bm)) {};
SPIC.DATA = token; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = token; while(!(SPIC.STATUS & SPI_IF_bm)) {};
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_ms(1); _delay_us(1);
check_registers();
tempval = read_register(CONFIG); tempval = read_register(CONFIG);
PORTC.OUTCLR = SS_BM; //SS low 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 = 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 SPIC.DATA = tempval & (~PRIM_RX); while(!(SPIC.STATUS & SPI_IF_bm)) {}; //make sure PRIM_RX is low
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_ms(1); _delay_us(1);
check_registers();
//pulse CE for at least 10 us //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 //wait for pll to settle
_delay_us(130); _delay_us(130);
//wait until transmit complete //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 ){} 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. //clear IRQ -- need to be in standby.
tempval = read_register(STATUS); tempval = read_register(STATUS);
PORTC.OUTCLR = SS_BM; //SS low 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 = W_REGISTER | STATUS; while(!(SPIC.STATUS & SPI_IF_bm)) {};
SPIC.DATA = tempval | TX_DS; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = tempval | TX_DS; while(!(SPIC.STATUS & SPI_IF_bm)) {};
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_ms(1); _delay_us(1);
rx_from_standby(); //return to RX mode rx_from_standby(); //return to RX mode
} }
void read_token(){ void read_token(){
check_registers();
//get token from rx fifo //get token from rx fifo
PORTC.OUTCLR = SS_BM; //SS low 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 = R_RX_PAYLOAD; while(!(SPIC.STATUS & SPI_IF_bm)) {};
SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {};
token = SPIC.DATA; token = SPIC.DATA;
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_ms(1); _delay_us(1);
//transition from RX to standby1 (CE=0) //transition from RX to standby1 (CE=0)
PORTC.OUTCLR = CE_BM; PORTC.OUTCLR = CE_BM;
...@@ -360,13 +341,12 @@ void read_token(){ ...@@ -360,13 +341,12 @@ void read_token(){
//clear IRQ //clear IRQ
tempval = read_register(STATUS); tempval = read_register(STATUS);
PORTC.OUTCLR = SS_BM; //SS low 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 = W_REGISTER | STATUS; while(!(SPIC.STATUS & SPI_IF_bm)) {};
SPIC.DATA = tempval | RX_DR; while(!(SPIC.STATUS & SPI_IF_bm)) {}; SPIC.DATA = tempval | RX_DR; while(!(SPIC.STATUS & SPI_IF_bm)) {};
PORTC.OUTSET = SS_BM; //SS high PORTC.OUTSET = SS_BM; //SS high
_delay_ms(1); _delay_us(1);
usart_send_byte(&USART_data,255); usart_send_byte(&USART_data,10); //for debug on usart //check_registers(66);
check_registers();
} }
int main(void) { int main(void) {
...@@ -374,22 +354,18 @@ int main(void) { ...@@ -374,22 +354,18 @@ int main(void) {
while(1){ while(1){
//should be in rx mode here. //should be in rx mode here.
if ( !(PORTC.IN & IRQ_BM)){ if ( !(PORTC.IN & IRQ_BM)){
usart_send_byte(&USART_data,70); usart_send_byte(&USART_data,10);
read_token(); //in standby read_token(); //in standby
token = 1-token; //transform token token = 1-token; //transform token
send_token(); //in rx //check_registers(65);
usart_send_byte(&USART_data,66); usart_send_byte(&USART_data,10); //for debug on usart send_token();
} }
//when we get signal from usart, send a token on nrf //when we get signal from usart, send a token on nrf
if (USART_RXBufferData_Available(&USART_data)) { 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. USART_RXBuffer_GetByte(&USART_data); //clear usart buffer so we only fire once.
check_registers(); send_token();
send_token(); //in rx //check_registers(64);
usart_send_byte(&USART_data,65); usart_send_byte(&USART_data,10); //for debug on usart
} }
_delay_ms(1000); //_delay_ms(10);
} }
} }
......
...@@ -4,11 +4,12 @@ serial_ports = ["/dev/tty.usbserial-FTFMIM12", "/dev/tty.usbserial-FT9L39VL"] ...@@ -4,11 +4,12 @@ serial_ports = ["/dev/tty.usbserial-FTFMIM12", "/dev/tty.usbserial-FT9L39VL"]
ser = serial.Serial(serial_ports[int(sys.argv[1])], 230400) ser = serial.Serial(serial_ports[int(sys.argv[1])], 230400)
print "connecting" print "connecting"
labels = ['status','config','en_aa','setup_retr','token'] labels = ['id','status','config','token']
print "writing to usart"
ser.write([0])
'''
while True: while True:
try: try:
print "writing to usart"
ser.write([0])
bytes = map(ord,ser.readline().strip('\n')) bytes = map(ord,ser.readline().strip('\n'))
#print "read: ",bytes #print "read: ",bytes
print bytes print bytes
...@@ -19,5 +20,6 @@ while True: ...@@ -19,5 +20,6 @@ while True:
# print bytes[len(labels):] # print bytes[len(labels):]
except(KeyboardInterrupt): except(KeyboardInterrupt):
break break
'''
print "Quitting" print "Quitting"
ser.close() ser.close()
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment