roboforum.ru

Технический форум по робототехнике.

ATmega48+SPI EEPROM

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

ATmega48+SPI EEPROM

Сообщение Cosworth » 19 июн 2010, 16:03

Доброго времени суток, форумчане! Возникла необходимость подключать внешнюю ПЗУ 25хх, которая работает через SPI. В процессе изучения столкнулся с проблемой - данные от МК уходят нормально, а память по запросу, не зависимо от адреса, возвращает 0xFF, хотя файл прошивки заполнен. Передача начинается по нажатию кнопки вот код:
Код: Выделить всёРазвернуть
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"

.def   tmp=R16

.cseg
.org   0x0000
   rjmp   Init

.org   PCI1addr
   rjmp   RcvInit

Init:
   ldi      tmp,(1<<PCINT8)
   sts      PCMSK1,tmp
   ldi      tmp,(1<<PCIE1)      ;External interrupt presetting
   sts      PCICR,tmp
   clr      tmp   
   out      DDRC,tmp
   
   ser      tmp
   out      DDRD,tmp      ;PortD for input data dispatching

   ldi      tmp,0b00101100      ;MOSI,SS,SCK-out, MISO-in
   out      DDRB,tmp
   ldi      tmp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)
   out      SPCR,tmp
   sei

Start:
   nop
   nop
   rjmp   Start

RcvInit:
   ldi      tmp,3            ;READ instruction
   out      SPDR,tmp
SendAddr:
   in      tmp,SPSR
   sbrs      tmp,SPIF
   rjmp      SendAddr         ;Waiting for previous transfer complete
   in      tmp,SPDR
   ldi      tmp,0x01         ;Read from 0x01
   out      SPDR,tmp
RcvData:
   in      tmp,SPSR
   sbrs      tmp,SPIF         ;Waiting for previous transfer complete
   rjmp      RcvData
   in      tmp,SPDR
   out      PORTD,tmp         ;Out PortD
   reti

Почему может не работать?
На всякий случай приложу проект целиком.
Вложения
Prog.zip
EEPROM mem.bin + Proteus test.dsn + AVR Studio test.aps
(34.43 КиБ) Скачиваний: 0
Cosworth
 
Сообщения: 9
Зарегистрирован: 02 июн 2010, 19:55

Re: ATmega48+SPI EEPROM

Сообщение Michael_K » 19 июн 2010, 16:39

вы бы хоть почитали и разобрались, как работает SPI...
Ну вообще же ерунда написана.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: ATmega48+SPI EEPROM

Сообщение Cosworth » 19 июн 2010, 17:42

Michael_K писал(а):вы бы хоть почитали и разобрались, как работает SPI...
Ну вообще же ерунда написана.

Правильно ли я понимаю суть: в ведомом и в ведущем устройстве стоят сдвиговые регистры. При передаче на каждый такт эти регистры обмениваются битом, сдвигаясь влево/вправо (в зависимости от режима). Если я пошлю байт с адресом в память, то данные с этого адреса прийдут только во время следующей посылки? Поправьте если я не прав.
Cosworth
 
Сообщения: 9
Зарегистрирован: 02 июн 2010, 19:55

Re: ATmega48+SPI EEPROM

Сообщение Duhas » 19 июн 2010, 17:46

смысл верный...

вообще это все описывается вроде в ДШ на ИМС
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: ATmega48+SPI EEPROM

Сообщение Cosworth » 19 июн 2010, 18:12

Пробую такой алгоритм: Отправить код операции -> Дождаться конца, считать SPDR -> Отправить адрес -> Дождаться конца, считать SPDR -> Отправить заглушку -> Считать ответ ПЗУ -> Вывести в порт. Все равно ерунда. Может я что-то настраиваю неправильно?
Код: Выделить всёРазвернуть
   ldi      tmp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)
   out      SPCR,tmp
   ldi      tmp,0b00101100
   out      DDRB,tmp

Такой вопрос, если я ставлю MSTR=1, то на чип селекте постоянно 0. Почему во время простоя SPI МК не подтягивает его сам?
Cosworth
 
Сообщения: 9
Зарегистрирован: 02 июн 2010, 19:55

Re: ATmega48+SPI EEPROM

Сообщение Duhas » 19 июн 2010, 18:26

Мк не обязан трогать чип селект.. пин SS он для выбора МК как слейва... чип селект уж сами как нить дергайте )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: ATmega48+SPI EEPROM

Сообщение Michael_K » 19 июн 2010, 18:42

SS на мастере должен быть настроен как выход или подтянут кверху снаружи
(иначе ваш мастер в режим слейва самопроизвольно будет падать).
ногой, которая идет на CS слейва вы должны управлять из своей программы.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: ATmega48+SPI EEPROM

Сообщение Cosworth » 19 июн 2010, 19:52

Michael_K писал(а):SS на мастере должен быть настроен как выход или подтянут кверху снаружи
(иначе ваш мастер в режим слейва самопроизвольно будет падать).
ногой, которая идет на CS слейва вы должны управлять из своей программы.

Спасибо. Похоже все работает, тоесть перед каждой операцией скидываю SS в 0:
Код: Выделить всёРазвернуть
   cbi      PORTB,2
   ldi      tmp,0x03 ;код операции чтения
   rcall   Snd
   ldi      tmp,0x00 ;адрес 1
   rcall   Snd
   ldi      tmp,0x01 ;адрес 2
   rcall   Snd
   ldi      tmp,0x02 ;адрес 3
   rcall   Snd
   sbi      PORTB,2

А не работало, потому что протеус как всегда глючит. Перед запуском указываю в настройках ПЗУ файл прошивки, а если во время симуляции открыть инспектор, то там одни FF. Кто-нибудь знает как пофиксить?
--
Сам себе отвечу Debug->Reset presistent model data
Cosworth
 
Сообщения: 9
Зарегистрирован: 02 июн 2010, 19:55


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 30