Добавляем spi

Уже пощупаны rtc, timer25, adc, dma, usart. Теперь потестим spi. Поскольку новая тестовая плата еще не готова, попробуем применить плату №0 с минимумом подключений. Итак, схема теста следующая: terminal PC -> usart1 stm32 -> DMA1 ch.5 stm32 -> spi1 stm32 -> 74HC164(8 leds) -> spi1 stm32 -> DMA ch.2 stm32 -> usart1 stm32 -> terminal PC. Да, прицепим к spi1 регистр, нагруженный светодиодами (не забываем — не более 4 мА на вывод). С выхода Q7 74164 принимаем данные обратно на spi.
Теперь, вводя символы в терминале, будем наблюдать двоичный код введенного символа на светодиодах, а в терминал возвращается предыдущий введенный символ.
Схема соединений:
;pin3 COM -> pin8 MAX232(R2in)
;pim9 MAX232(R2out) -> PA10 stm32(usart1 RX)
;PA7 stm32(SPI1_MOSI) -> pins1+2 74164(Dsa+Dsb)
;PA5 stm32(SPI1_SCK) -> pin8 74164(Cp)
;pin9 74164(/MR) -> Vcc
;pins3-6,10-13 74164 -> 8 leds +res5,1k -> GND
;pin13 74164(Q7) -> PA6 stm32(SPI1_MISO)
;PA9 stm32(usart1 TX) -> pin10 MAX232(T2in)
;pin7 MAX232(T2out) -> pin2 COM
Тестовая программа:

  	AREA |header code|,CODE,READONLY
	ENTRY
	EXPORT __main
__main
	movs r10,#0
	movs r11,#1

;rcc config----------------------------
;set sysclk=8MHz
;--------------------------------------
	setbit rcc, rcc_cr, hse_bit		;hse on
hse_not_ready
	getbit rcc,	rcc_cr, hserdy_bit	;hse ready ?
	beq hse_not_ready
;hse ready
	setbits rcc, rcc_cfgr, sw_lbs, sw_width, sw_hse	;selected hse as system clock

	setbit 	rcc, rcc_apb2enr, iopa_bit	;porta clock enabled
	setbit 	rcc, rcc_apb2enr, afio_bit	;alternate function io clock enabled
	setbit 	rcc, rcc_apb2enr, usart1_bit	;usart1 clock enabled
	setbit  rcc, rcc_ahbenr, dma1_bit	;dma1 clock enabled
	setbit 	rcc, rcc_apb2enr, spi1_bit	;spi1 clock enabled
;end rcc comfig------------------------

;gpio config---------------------------
	ldr r0,=gpioa
	ldr r1,[r0,#pcrh]	;read pins8-15 config
	movs r2,#cnf2m2		;двухтактный выход альтернативный 2MHz
	bfi r1,r2,#cnfpin9,#4	;pina9 - usart1 TX
	str r1,[r0,#pcrh]	;write pins8-15 config
;PA10 usart1 RX	вход в третьем состоянии (состояние после сброса)
	ldr r1,[r0,#pcrl]	;read pins0-7 config
	movs r2,#cnf2m1		;двухтактный выход альтернативный 10MHz
	bfi r1,r2,#cnfpin5,#4	;pina5 - spi1 SCK
	bfi r1,r2,#cnfpin7,#4	;pina7 - spi1 MOSI
	str r1,[r0,#pcrl]	;write pins0-7 config
;PA4(SPI1_NSS), PA6(SPI1_MISO) - вход в третьем состоянии (состояние после сброса)
;end gpio config-----------------------

;usart1 config-------------------------
;9600 baud, 1 Start Bit, 8 Data Bits, 1.0 Stop Bits, No Parity
;--------------------------------------
	setbit usart1, usart_cr1, usart_cr1_te_bit ;transmitter enable
	setbit usart1, usart_cr1, usart_cr1_re_bit ;receiver enable
;div=fck/(baud*16)=8M/(9600*16)=52,083 (div_mantissa=52, div_fraction=16*0,083=1)
;usart_gtpr <- (52<<4) + 1 = 833
	ldr r0,=usart1
	savecw 833, usart_brr
	setbit usart1, usart_cr3, usart_cr3_dmar_bit ;DMA enable receiver
	setbit usart1, usart_cr1, usart_cr1_ue_bit   ;usart enable
;end usart1 config---------------------

;DMA config----------------------------
	ldr r0,=dma1
	savecw usart1 +usart_dr, dma_cmar5	;usart_dr ->
	savecw spi1 +spi_dr, dma_cpar5	;spi_dr <-
	savec 1, dma_cndtr5		;1 bytes transfered

	setbits dma1, dma_ccr5, dma_ccr_pl_lbs, dma_ccr_pl_width, dma_ccr_pl_lo	;channel priority level- low
	setbits dma1, dma_ccr5, dma_ccr_msize_lbs, dma_ccr_msize_width, dma_ccr_msize_8	;memory size - 8 bits
	setbits dma1, dma_ccr5, dma_ccr_psize_lbs, dma_ccr_psize_width, dma_ccr_psize_8	;peripheral size - 8 bits
	resbit dma1, dma_ccr5, dma_ccr_minc_bit	;memory increment mode disabled
	resbit dma1, dma_ccr5, dma_ccr_pinc_bit	;peripheral increment mode disabled
	setbit dma1, dma_ccr5, dma_ccr_circ_bit	;circular mode enabled
	setbit dma1, dma_ccr5, dma_ccr_dir_bit	;read from memory
	setbit dma1, dma_ccr5, dma_ccr_en_bit	;channel enabled
;------------------		
	ldr r0,=dma1
	savecw spi1 +spi_dr, dma_cmar2	;spi_dr ->
	savecw usart1 +usart_dr, dma_cpar2	;usart_dr <-
	savec 1, dma_cndtr2		;1 bytes transfered

	setbits dma1, dma_ccr2, dma_ccr_pl_lbs, dma_ccr_pl_width, dma_ccr_pl_lo	;channel priority level- low
	setbits dma1, dma_ccr2, dma_ccr_msize_lbs, dma_ccr_msize_width, dma_ccr_msize_8	;memory size - 8 bits
	setbits dma1, dma_ccr2, dma_ccr_psize_lbs, dma_ccr_psize_width, dma_ccr_psize_8	;peripheral size - 8 bits
	resbit dma1, dma_ccr2, dma_ccr_minc_bit	;memory increment mode disabled
	resbit dma1, dma_ccr2, dma_ccr_pinc_bit	;peripheral increment mode disabled
	setbit dma1, dma_ccr2, dma_ccr_circ_bit	;circular mode enabled
	setbit dma1, dma_ccr2, dma_ccr_dir_bit	;read from memory
	setbit dma1, dma_ccr2, dma_ccr_en_bit	;channel enabled						 
;end DMA config------------------------

;SPI config----------------------------
	setbits spi1, spi_cr1, spi_cr1_br_lbs, spi_cr1_br_width, spi_cr1_br_2 ;baud rate control (Fpclk/2)
	resbit spi1, spi_cr1, spi_cr1_cpol_bit
	resbit spi1, spi_cr1, spi_cr1_cpha_bit		;cpha=0,cpol=0 _/ (фронт положит импульса) for 74hc164
	resbit spi1, spi_cr1, spi_cr1_dff_bit		;8-bit data frame format
	resbit spi1, spi_cr1, spi_cr1_lsbfirst_bit	;msb transmitted first
	setbit spi1, spi_cr1, spi_cr1_mstr_bit		;master configuration
	setbit spi1, spi_cr2, spi_cr2_rxdmaen_bit	;rx buffer DMA enabled
	setbit spi1, spi_cr1, spi_cr1_spe_bit		;peripheral enabled						
;end SPI config------------------------

m1	b m1
        END

Видим, что для нашей задачи почти не пришлось конфигурировать spi (сбрасывать биты не обязательно — состояние после старта, так же как и делитель частоты со старта Fpclk/2).
Опять радует то, что на всю цепочку не тратиться процессорное время. Пока все.
  • +1
  • 21 мая 2011, 00:20
  • psv

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.