from machine import Pin from rp2 import PIO, StateMachine, asm_pio from time import sleep import array import uctypes from uctypes import BF_POS, BF_LEN, UINT32, BFUINT32, struct PIO0_BASE = 0x50200000 PIO1_BASE = 0x50300000 DMA_BASE = 0x50000000 DMA_CHAN_WIDTH = 0x40 DMA_CHAN_COUNT = 12 DMA_SIZE_BYTE = 0x0 DMA_SIZE_HALFWORD = 0x1 DMA_SIZE_WORD = 0x2 # DMA: RP2040 datasheet 2.5.7 DMA_CTRL_TRIG_FIELDS = { "AHB_ERROR": 31<= 0 and sm_num < 4): self.dma_chan.WRITE_ADDR_REG = PIO0_BASE + 0x10 + sm_num *4 self.dma_chan.CTRL_TRIG.TREQ_SEL = sm_num elif (sm_num < 8): self.dma_chan.WRITE_ADDR_REG = PIO1_BASE + 0x10 + (sm_num-4) *4 self.dma_chan.CTRL_TRIG.TREQ_SEL = sm_num + 4 if (block_size == 8): self.dma_chan.CTRL_TRIG.DATA_SIZE = DMA_SIZE_BYTE if (block_size == 16): self.dma_chan.CTRL_TRIG.DATA_SIZE = DMA_SIZE_HALFWORD if (block_size == 32): self.dma_chan.CTRL_TRIG.DATA_SIZE = DMA_SIZE_WORD self.dma_chan.TRANS_COUNT_REG = transfer_count #Do I just always want these? self.dma_chan.CTRL_TRIG.INCR_WRITE = 0 self.dma_chan.CTRL_TRIG.INCR_READ = 1 def start_transfer(self, buffer): self.dma_chan.READ_ADDR_REG = uctypes.addressof(buffer) self.dma_chan.CTRL_TRIG.EN = 1 def transfer_count(self): return self.dma_chan.TRANS_COUNT_REG def busy(self): if self.dma_chan.CTRL_TRIG.DATA_SIZE == 1: return True else: return False