from I2Sduplex import I2Sduplex
from dma import DMA
import time, uctypes, array
from machine import Pin
led = Pin('LED', Pin.OUT)
print("Initialising audio interface...")
i2s = I2Sduplex()
DMA.abort_all()
PIO0_BASE = 0x50200000
PIO0_BASE_TXF0 = PIO0_BASE + 0x10
PIO0_BASE_RXF0 = PIO0_BASE + 0x20
txBuf0 = bytearray(array.array('l', [x for x in range(64)]))
txBuf1 = bytearray(array.array('l', [x-64 for x in range(64)]))
rxBuf0 = bytearray(256)
rxBuf1 = bytearray(256)
tx0 = uctypes.addressof(txBuf0)
tx1 = uctypes.addressof(txBuf1)
rx0 = uctypes.addressof(rxBuf0)
rx1 = uctypes.addressof(rxBuf1)
dma = [DMA(0), DMA(1), DMA(2), DMA(3)]
dma[0].config(
read_addr = tx0,
write_addr = PIO0_BASE_TXF0,
trans_count = len( txBuf0 ) // 4,
read_inc = True,
write_inc = False,
data_size = DMA.SIZE_WORD,
treq_sel = DMA.DREQ_PIO0_TX0,
chain_to = 1
)
dma[1].config(
read_addr = tx1,
write_addr = PIO0_BASE_TXF0,
trans_count = len( txBuf1 ) // 4,
read_inc = True,
write_inc = False,
data_size = DMA.SIZE_WORD,
treq_sel = DMA.DREQ_PIO0_TX0,
chain_to = 0
)
dma[2].config(
read_addr = PIO0_BASE_RXF0,
write_addr = rx0,
trans_count = len( rxBuf0 ) // 4,
read_inc = False,
write_inc = True,
data_size = DMA.SIZE_WORD,
treq_sel = DMA.DREQ_PIO0_RX0,
chain_to = 3
)
dma[3].config(
read_addr = PIO0_BASE_RXF0,
write_addr = rx1,
trans_count = len( rxBuf1 ) // 4,
read_inc = False,
write_inc = True,
data_size = DMA.SIZE_WORD,
treq_sel = DMA.DREQ_PIO0_RX0,
chain_to = 2
)
i2s.sm.active(1)
dma[0].enable()
dma[1].enable_notrigger()
dma[2].enable()
dma[3].enable_notrigger()
@micropython.viper
def processBuffer(rx : ptr32, tx : ptr32) -> bool:
n = 0
ret = True
while n < 64:
ret = ret and tx[n]==rx[n]
tx[n] = tx[n] + 128
n += 1
return ret
nextBuffer = 1
buffsDone = 0
while(True):
if(nextBuffer == 0 and not dma[0].is_busy() and not dma[2].is_busy()):
#gp.high()
machine.mem32[dma[0].READ_ADDR] = tx0
machine.mem32[dma[2].WRITE_ADDR] = rx0
led.value(processBuffer(rxBuf0, txBuf0))
nextBuffer = 1
buffsDone += 1
#gp.low()
if(nextBuffer == 1 and not dma[1].is_busy() and not dma[3].is_busy()):
#gp.high()
machine.mem32[dma[1].READ_ADDR] = tx1
machine.mem32[dma[3].WRITE_ADDR] = rx1
led.value(processBuffer(rxBuf1, txBuf1))
nextBuffer = 0
buffsDone += 1
#gp.low()
DMA.abort_all()
i2s.sm.active(0)