from I2Sduplex import I2Sduplex
from dma import DMA
import time, uctypes, array
import micropython
#from machine import Pin
print("Initialising audio interface...")
i2s = I2Sduplex()
DMA.abort_all()
PIO0_BASE = 0x50200000
PIO0_BASE_TXF0 = PIO0_BASE + 0x10
PIO0_BASE_RXF0 = PIO0_BASE + 0x20
#buf = bytes(range(256))
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 = uctypes.addressof(txBuf0),
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 = uctypes.addressof(txBuf1),
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 = uctypes.addressof(rxBuf0),
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 = uctypes.addressof(rxBuf1),
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):
n = 0
while n < 64:
tx[n] = tx[n] + 128
n += 1
return
nextBuffer = 1
buffsDone = 0
while(buffsDone < 50):
if(nextBuffer == 0 and not dma[0].is_busy() and not dma[2].is_busy()):
#gp.high()
machine.mem32[dma[0].READ_ADDR] = uctypes.addressof(txBuf0)
machine.mem32[dma[2].WRITE_ADDR] = uctypes.addressof(rxBuf0)
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] = uctypes.addressof(txBuf1)
machine.mem32[dma[3].WRITE_ADDR] = uctypes.addressof(rxBuf1)
processBuffer(rxBuf1, txBuf1)
nextBuffer = 0
buffsDone += 1
#gp.low()
DMA.abort_all()
i2s.sm.active(0)