drivers, nrf24: Nonblocking send now done by generator.
This commit is contained in:
parent
5deceb842d
commit
706955976c
@ -1,10 +1,4 @@
|
|||||||
"""NRF24L01 driver for Micro Python
|
"""NRF24L01 driver for Micro Python
|
||||||
|
|
||||||
Support for nonblocking send added. Minor fixes:
|
|
||||||
Timeout now uses pyb.elapsed_millis().
|
|
||||||
Channel numbers constrained to 125 as per datasheet.
|
|
||||||
Status register read with reg_read() - reg_read_ret_status() removed.
|
|
||||||
Default speed 250K for improved range/error rate.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import pyb
|
import pyb
|
||||||
@ -145,7 +139,7 @@ class NRF24L01:
|
|||||||
self.reg_write(CONFIG, config)
|
self.reg_write(CONFIG, config)
|
||||||
|
|
||||||
def set_channel(self, channel):
|
def set_channel(self, channel):
|
||||||
self.reg_write(RF_CH, min(channel, 125)) # Changed from 127
|
self.reg_write(RF_CH, min(channel, 125))
|
||||||
|
|
||||||
# address should be a bytes object 5 bytes long
|
# address should be a bytes object 5 bytes long
|
||||||
def open_tx_pipe(self, address):
|
def open_tx_pipe(self, address):
|
||||||
@ -207,44 +201,38 @@ class NRF24L01:
|
|||||||
start = pyb.millis()
|
start = pyb.millis()
|
||||||
result = None
|
result = None
|
||||||
while result is None and (pyb.elapsed_millis(start) < timeout):
|
while result is None and (pyb.elapsed_millis(start) < timeout):
|
||||||
result = send_nonblock() # 1 == success 2 == fail
|
result = next(send_nonblock) # 1 == success 2 == fail
|
||||||
if result == 2:
|
if result == 2:
|
||||||
raise OSError("send failed")
|
raise OSError("send failed")
|
||||||
|
|
||||||
def send_nonblocking(self, buf):
|
def send_nonblocking(self, buf):
|
||||||
'''
|
'''
|
||||||
Support for nonblocking transmission. Returns a function instance.
|
Support for nonblocking transmission. Returns a generator instance.
|
||||||
The first call to a function instance sends the data and returns None.
|
First use sends the data and returns None. Subsequently tests TX status
|
||||||
Subsequent calls test TX status returning not ready None, ready 1, error 2.
|
returning not ready None, ready 1, error 2.
|
||||||
'''
|
'''
|
||||||
init = True
|
# power up
|
||||||
def make_snb():
|
self.reg_write(CONFIG, (self.reg_read(CONFIG) | PWR_UP) & ~PRIM_RX)
|
||||||
nonlocal init
|
pyb.udelay(150)
|
||||||
if init:
|
|
||||||
# power up
|
|
||||||
self.reg_write(CONFIG, (self.reg_read(CONFIG) | PWR_UP) & ~PRIM_RX)
|
|
||||||
pyb.udelay(150)
|
|
||||||
|
|
||||||
# send the data
|
# send the data
|
||||||
self.cs.low()
|
self.cs.low()
|
||||||
self.spi.send(W_TX_PAYLOAD)
|
self.spi.send(W_TX_PAYLOAD)
|
||||||
self.spi.send(buf)
|
self.spi.send(buf)
|
||||||
if len(buf) < self.payload_size:
|
if len(buf) < self.payload_size:
|
||||||
self.spi.send(b'\x00' * (self.payload_size - len(buf))) # pad out data
|
self.spi.send(b'\x00' * (self.payload_size - len(buf))) # pad out data
|
||||||
self.cs.high()
|
self.cs.high()
|
||||||
|
|
||||||
# enable the chip so it can send the data
|
# enable the chip so it can send the data
|
||||||
self.ce.high()
|
self.ce.high()
|
||||||
pyb.udelay(15) # needs to be >10us
|
pyb.udelay(15) # needs to be >10us
|
||||||
self.ce.low()
|
self.ce.low()
|
||||||
init = False
|
yield None # Not ready
|
||||||
return None # Not ready
|
|
||||||
|
|
||||||
if not (self.reg_read(STATUS) & (TX_DS | MAX_RT)):
|
while not (self.reg_read(STATUS) & (TX_DS | MAX_RT)):
|
||||||
return None # Not ready
|
yield None # Not ready
|
||||||
# Either ready or failed: get and clear status flags, power down
|
# Either ready or failed: get and clear status flags, power down
|
||||||
status = self.reg_write(STATUS, RX_DR | TX_DS | MAX_RT)
|
status = self.reg_write(STATUS, RX_DR | TX_DS | MAX_RT)
|
||||||
self.reg_write(CONFIG, self.reg_read(CONFIG) & ~PWR_UP)
|
self.reg_write(CONFIG, self.reg_read(CONFIG) & ~PWR_UP)
|
||||||
return 1 if status & TX_DS else 2
|
yield 1 if status & TX_DS else 2
|
||||||
return make_snb
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user