Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR+SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
gm1957
Люди добрые! Подскажите! То ли в AVRStudio глюк, то ли я заработался.
В AVRStudio v4.10 запускаю такую вещь:
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc"
.def temp=r16
.CSEG
.org 0
rjmp RESET
nop
.
.
rjmp SPI;
.
.
nop
;****** обработка RESET ******************
RESET:
cli ;запрещение прерываний
ldi temp,low(RAMEND) ;инициализация стека
out SPL,temp ; --"--
ldi temp,(1<<PB0)+(1<<PB3)+(1<<PB5) ;определение линий
;порта B как выходных
out DDRB,temp ;PB0 - линия CS внешнего
;ЦАП с интерфейсом SPI, PB3 - ;линия MOSI, PB5 - линия SCK
ldi temp,1<<PB0 ;установка PB0 - запрет выбора
out PORTB,temp ;внешнего ЦАП
ldi temp,(1<<SPIE)+(1<<SPE)+(1<<MSTR) ;SPIE - разрешение
;прерывания SPI, SPE - ;разешение работы SPI
;MSTR - определение AVR
;как мастера
out SPCR,temp ;инициализация SPI
sei ;разрешение прерываний
ldi XH,high(0xffff) ;подготовка данных для
ldi XL,low0xffff) ;загрузки по SPI
cbi PORTB,PB0 ;сброс PB0 -разрешение
;работы внешнего ЦАП
out SPDR,XH ;передача данных
out SPDR,XL ;по SPI
sbi PORTB,PB0
reti
;****** обработка IRQ *********************
SPI: reti

при пошаговой отладке сразу же после разрешения прерываний (командой sei) вызывается обработка SPI, хотя, насколько я знаю, обработка SPI вызывается ПОСЛЕ ПЕРЕДАЧИ ДАННЫХ, а, в свою очередь, передача данных начинается только ПОСЛЕ ЗАГРУЗКИ РЕГИСТРА SPDR, которая у меня производится после общего разрешения прерываний!
Где затык?
yung
datasheet на Atmega8:

If SS is configured as an input, it must be held high to ensure Master SPI operation. If
the SS pin is driven low by peripheral circuitry when the SPI is configured as a Master
with the SS pin defined as an input, the SPI system interprets this as another Master
selecting the SPI as a Slave and starting to send data to it.

Чтобы не было проблем, сконфигурируй PB2 на выход , и все ОК. Проверил на AVR-Studio 4.10, сработало.
gm1957
спасибо! все заработало
KRS
Цитата(gm1957 @ Jun 2 2005, 06:19)
cbi PORTB,PB0                                                  ;сброс PB0 -разрешение
                                                                        ;работы внешнего ЦАП
out SPDR,XH                                                    ;передача данных
out SPDR,XL                                                    ;по SPI
sbi PORTB,PB0


Так нельзя данные по SPI посылать, надо по одному байту и ждать когда он отправится,
и еще чип селект обычно всетки после полной отправки второго байта убирать.
gm1957
Цитата(KRS @ Jun 2 2005, 16:41)
Цитата(gm1957 @ Jun 2 2005, 06:19)
cbi PORTB,PB0                                                  ;сброс PB0 -разрешение
                                                                        ;работы внешнего ЦАП
out SPDR,XH                                                     ;передача данных
out SPDR,XL                                                     ;по SPI
sbi PORTB,PB0


Так нельзя данные по SPI посылать, надо по одному байту и ждать когда он отправится,
и еще чип селект обычно всетки после полной отправки второго байта убирать.
*



подскажите, как лучше организовать ожидание отправки?
а байты я ведь и так по одному отправляю, и в PB0 записываю единицу
gm1957
Цитата(KRS @ Jun 2 2005, 16:41)
Цитата(gm1957 @ Jun 2 2005, 06:19)
cbi PORTB,PB0                                                  ;сброс PB0 -разрешение
                                                                        ;работы внешнего ЦАП
out SPDR,XH                                                     ;передача данных
out SPDR,XL                                                     ;по SPI
sbi PORTB,PB0


Так нельзя данные по SPI посылать, надо по одному байту и ждать когда он отправится,
и еще чип селект обычно всетки после полной отправки второго байта убирать.
*



с ожиданиями разобрался,
спасибо
yung
А мне вот что еще интересно. Я ни разу такого не встречал - reti после основного блока. Это косяк или умышленно делается?
KRS
По поводу ожидания
по SPI обычно передача идет быстро, поэтому прерывания лучше не использовать т.к. вход выход из прерывания будет сравним со сременем передачи, лучше просто ждать (сканировать бит) примерно так

WaitSpi:
sbis SPSR, SPIF
rjmp WaitSpi

и соотвественно не разрешать прерывания от SPI
тогда запись в АЦП будет примерно так выглядеть

cbi PORTB,PB0

ldi r16, HIGH(xxxx)
out SPDR, r16

;сюда можно вставить обраотку или подготовку данных все равно ждать окончания пересылки

ldi r16, LOW(xxxxx)

WaitSpi:
sbis SPSR, SPIF
rjmp WaitSpi

out SPDR, r16

WaitSpi1:
sbis SPSR, SPIF
rjmp WaitSpi1

sbi PORTB,PB0
gm1957
большое спасибо за помощь!
gm1957
Цитата(yung @ Jun 2 2005, 18:37)
А мне вот что еще интересно. Я ни разу такого не встречал - reti после основного блока. Это косяк или умышленно делается?
*


это я просто показал завершение
в реальности конечно не так
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.