drivers, nrf24: Nonblocking send now done by generator.

This commit is contained in:
adminpete 2014-11-16 11:27:44 +00:00 committed by Damien George
parent 5deceb842d
commit 706955976c

View File

@ -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