@.CHARSET CP1251

@ GNU AS
.syntax unified
.cpu cortex-m4
.thumb
.fpu fpv4-sp-d16

.SECTION .asmcode

.INCLUDE  "/src/inc/rcc.inc"
.INCLUDE  "/src/inc/dma.inc"
.INCLUDE  "/src/inc/spi.inc"

@.DESC     name=DMA2_ST3_SPI_INIT type=proc
@ +----------------------------------------------------------------------+
@ |              Процедура инициализации DMA для SPI1_TX                 |
@ +----------------------------------------------------------------------+
@ | Процедура настройки DMA для передачи данных по SPI                   |
@ | указанного в следующих настройках:                                   |
@ |                                                                      |
@ | spi_interface = SPI1   имя используемого SPI                         |
@ |                                                                      |
@ +----------------------------------------------------------------------+
@ |                                                                      |
@ | Входные параметры - нет                                              |
@ |                                                                      |
@ | Выходные параметры - нет                                             |
@ |                                                                      |
@ +----------------------------------------------------------------------+
@ |                                                                      |
@ | до вызова DMA2_ST3_SPI_INIT нужно затактировать и настроить выбраный |
@ | для обмена SPI                                                       |
@ |                                                                      |
@ +----------------------------------------------------------------------+
@ | вызов DMA2_ST3_SPI_INIT изменяет регистры R1, R2                     |
@ +----------------------------------------------------------------------+
@.ENDDESC


.GLOBAL DMA2_ST3_SPI_INIT
DMA2_ST3_SPI_INIT:
                    MOV        R1, 1

                    @ включим DMA2
                    LDR        R2, = PERIPH_BB_BASE + ( RCC_BASE + RCC_AHB1ENR ) * 32
                    STR        R1, [ R2, RCC_AHB1ENR_DMA2EN_N * 4 ]

                    @ включим генерацию запроса на передачу от SPI
                    LDR        R2, = PERIPH_BB_BASE + ( SPI1_BASE + SPI_CR2 ) * 32
                    MOV        R3, 1
                    STR        R3, [ R2, SPI_CR2_TXDMAEN_N * 4 ]

                    @ настроим DMA2
                    LDR        R2, = DMA2

                    LDR        R3, = 3 << DMA_SxCR_CHSEL_N + DMA_SxCR_MINC + DMA_SxCR_DIR_MTP
                    STR        R3, [ R2, DMA_S3CR ]

                    LDR        R3, = SPI1+ SPI_DR
                    STR        R3, [ R2, DMA_S3PAR ]     @ укажем адрес регистра данных SPI

                    BX         LR


@.DESC     name=DMA2_ST3_SEND type=proc
@ +------------------------------------------------------------------------+
@ |                        Отправка буфера данных по SPI                   |
@ +------------------------------------------------------------------------+
@ | Входные параметры:                                                     |
@ |   R0 - адрес буфера памяти для отправки                                |
@ |   R1 - количество передаваемых байт                                    |
@ |                                                                        |
@ | Регистры не изменяются                                                 |
@ |                                                                        |
@ +------------------------------------------------------------------------+
@.ENDDESC

.GLOBAL DMA2_ST3_SEND
DMA2_ST3_SEND:
                    PUSH       { R2, R3 }

                    MOV        R3, 1

                    @ выключим DMA
                    LDR        R2, = PERIPH_BB_BASE + ( DMA2_BASE + DMA_S3CR ) * 32
                    MOV        R3, 0
                    STR        R3, [ R2, DMA_SxCR_EN_N * 4 ]

                    @ настроим DMA2
                    LDR        R2, = DMA2

                    MOV        R3, 0xFFFFFFFF            @ сброс флагов, если есть установленные то
                    STR        R3, [ R2, DMA_LIFCR ]     @ без этого dma работать не будет

                    STR        R0, [ R2, DMA_S3M0AR ]    @ адрес буфера
                    STR        R1, [ R2, DMA_S3NDTR ]    @ размер в байтах

                   @ включим DMA и передачу
                    MOV        R3, 1
                    LDR        R2, = PERIPH_BB_BASE + ( DMA2_BASE + DMA_S3CR ) * 32
                    STR        R3, [ R2, DMA_SxCR_EN_N * 4 ]

                    POP        { R2, R3 }
                    BX         LR

@.DESC     name=DMA2_ST3_WAIT type=proc
@ +------------------------------------------------------------------------+
@ |                   Ожидание отправки данных DMA                         |
@ +------------------------------------------------------------------------+
@ | Входные параметры - нет                                                |
@ |                                                                        |
@ | Выходные параметры - нет                                               |
@ |                                                                        |
@ | Регистры не изменяются                                                 |
@ |                                                                        |
@ +------------------------------------------------------------------------+
@.ENDDESC

.GLOBAL   DMA2_ST3_WAIT
DMA2_ST3_WAIT:
                    PUSH       { R0, R1 }
                    LDR        R0, = DMA2
dma_transer_wait:
                    LDR        R1, [ R0, DMA_LISR ]
                    TST        R1, DMA_LISR_TCIF3
                    BEQ        dma_transer_wait

                    POP        { R0, R1 }
                    BX         LR


