Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
R
ring
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pub
ring
Commits
022a0eaa
Commit
022a0eaa
authored
7 years ago
by
Sam Calisch
Browse files
Options
Downloads
Patches
Plain Diff
ring is working at 550us round trip
parent
55897f8f
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
radio/nrf24L01/nrf-ftdi-ring.c
+35
-59
35 additions, 59 deletions
radio/nrf24L01/nrf-ftdi-ring.c
radio/nrf24L01/serial-monitor.py
+5
-3
5 additions, 3 deletions
radio/nrf24L01/serial-monitor.py
with
40 additions
and
62 deletions
radio/nrf24L01/nrf-ftdi-ring.c
+
35
−
59
View file @
022a0eaa
...
@@ -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_
m
s
(
1
);
//give time after ss low
_delay_
u
s
(
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_
m
s
(
1
);
//give time after ss high
_delay_
u
s
(
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_
m
s
(
1
);
//give time to start up
_delay_
u
s
(
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_DIV
128
_gc
|
/* SPI prescaler. */
SPIC
.
CTRL
=
SPI_PRESCALER_DIV
4
_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_
m
s
(
1
);
_delay_
u
s
(
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_
m
s
(
1
);
_delay_
u
s
(
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
(
1
5
);
PORTC
.
OUTCLR
=
CE_BM
;
PORTC
.
OUTSET
=
CE_BM
;
_delay_us
(
1
0
);
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_
m
s
(
1
);
_delay_
u
s
(
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_
m
s
(
1
);
_delay_
u
s
(
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_
m
s
(
1
);
_delay_
u
s
(
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_
m
s
(
1
);
_delay_
u
s
(
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_
m
s
(
1
);
_delay_
u
s
(
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
(
10
00
);
//
_delay_ms(10);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
radio/nrf24L01/serial-monitor.py
+
5
−
3
View file @
022a0eaa
...
@@ -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
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment