@@ -23,7 +23,7 @@ def enable(self):
2323 def transfer_direction (self ):
2424 return self .CR & DMA_SxCR .DIR
2525
26- def transfer_size (self ):
26+ def transfer_peripheral_size (self ):
2727 PSIZE = self .CR & DMA_SxCR .PSIZE
2828 if PSIZE == DMA .PDATAALIGN_BYTE :
2929 return 1
@@ -32,22 +32,35 @@ def transfer_size(self):
3232 if PSIZE == DMA .PDATAALIGN_WORD :
3333 return 4
3434
35+ def transfer_memory_size (self ):
36+ MSIZE = self .CR & DMA_SxCR .MSIZE
37+ if MSIZE == DMA .MDATAALIGN_BYTE :
38+ return 1
39+ if MSIZE == DMA .MDATAALIGN_HALFWORD :
40+ return 2
41+ if MSIZE == DMA .MDATAALIGN_WORD :
42+ return 4
43+
3544 def step (self , mem ):
3645 if self .NDTR == 0 :
3746 return
3847
39- dir_flag = self .transfer_direction () == DMA .MEMORY_TO_PERIPH
48+ dir_flag = self .transfer_direction () == DMA .MEMORY_TO_PERIPH
49+
50+ psize = self .transfer_peripheral_size ()
51+ msize = self .transfer_memory_size ()
4052
41- size = self .transfer_size ()
4253 src , dst = (self .M0AR , self .PAR ) if dir_flag else (self .PAR , self .M0AR )
54+ src_size , dst_size = (msize , psize ) if dir_flag else (psize , msize )
55+
56+ data = bytes (mem .read (src , src_size )).ljust (dst_size )[:dst_size ]
57+ mem .write (dst , data )
4358
44- mem .write (dst , bytes (mem .read (src , size )))
45-
4659 self .NDTR -= 1
4760 if self .CR & DMA_SxCR .MINC :
48- self .M0AR += size
61+ self .M0AR += msize
4962 if self .CR & DMA_SxCR .PINC :
50- self .PAR += size
63+ self .PAR += psize
5164
5265 if self .NDTR == 0 :
5366 self .CR &= ~ DMA_SxCR .EN
0 commit comments