@.CHARSET CP1251

@ GNU AS
.syntax unified
.cpu cortex-m3
.thumb

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

.SECTION .asmcode

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

@.ITEM SPI_LIST
.EQU  SPI1               , PERIPH_BASE + SPI1_BASE  @ SPI 1
.EQU  SPI2               , PERIPH_BASE + SPI2_BASE  @ SPI 2
@.end

@.CONFIG spi_interface=SPI_LIST

.if spi_interface==SPI1
   .equ spi_base, SPI1_BASE
.else
   .equ spi_base, SPI2_BASE
.endif

.GLOBAL DMA1_CH3_SPI_INIT
DMA1_CH3_SPI_INIT:       @ инициализация DMA1 для передачи данных через SPI1
                    MOV        R1, 1

                    @ включим DMA1
                    LDR        R2, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_AHBENR ) * 32
                    STR        R1, [ R2, RCC_AHBENR_DMA1EN_N * 4 ]

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

                    @ настроим DMA1
                    LDR        R2, = DMA1
                    LDR        R1, = DMA_CCR_MINC + DMA_CCR_PSIZE_8B + DMA_CCR_MSIZE_8B + DMA_CCR_DIR
                    STR        R1, [ R2, DMA_CCR3 ]

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

                    BX         LR

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

.GLOBAL DMA1_CH3_SEND
DMA1_CH3_SEND:
                    PUSH       { R2, R3 }
                    @ выключим DMA
                    MOV        R3, 0
                    LDR        R2, = PERIPH_BASE + PERIPH_BB_BASE + ( DMA1_BASE + DMA_CCR3 ) * 32
                    STR        R3, [ R2, DMA_CCR_EN_N * 4 ]

                    @ настроим параметры буфера для отправки
                    LDR        R2, = DMA1
                    STR        R0, [ R2, DMA_CMAR3 ]     @ адрес буфера
                    STR        R1, [ R2, DMA_CNDTR3 ]    @ размер в байтах

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

                    POP        { R2, R3 }
                    BX         LR

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

.GLOBAL   DMA1_CH3_WAIT
DMA1_CH3_WAIT:
                    PUSH       { R0, R1 }
                    LDR        R0, = DMA1
dma_transer_wait:
                    LDR        R1, [ R0, DMA_ISR ]
                    TST        R1, DMA_ISR_TCIF3
                    BEQ        dma_transer_wait

                    POP        { R0, R1 }
                    BX         LR



