Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать SPI Slave устройство на атмега?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
inventor
проблема такая-на микропроцессоре не хватает свободных ножек, поэтому был сделан расширитель портов на атмега.
ну..чтобы чипселекты выставлять, проверять наличие всяких готовностей и прочего.
прикинул, что плодить навороченный протокол для SPI slave - это достаточно напряжная вешь.
очень навороченным его не сделать-нужно будет тогда снижать скорость обмена по SPI-d даташыте написано что SCLK не можето быть более половины тактовой частоты.
У меня тактовая частота атмеги 8 мегагерц, но и 4 мегагерца - это предел.
я начал писать на C для этого камня (на асме нельзя)
вот что получилось-хочу обращаться к этому камню со стороны основного процессора
так же как к обычному уись..
стройству.
я распределил какие типы команд я могу посылать DDRx PORTx и PINx соответственно протокол такой придумал-
первый байт это команда и к какому порту обращаюсь (PA PB PC итд) второй байт что туда нудно выставить.
то есть еслли m,s команда в атмеге выглядела бы так PORTA = 0x24
я бы паередавал эти два байта-код операции и запись...
то есть понятно что я имел ввиду
в устройстве slave на атмеге сделал прерывание "по окончанию записи байта мастером" - оно вроде так называется и в этом прерывании читаю то что там пришло в SPDR - так вроде SPI регистр называется.
но мне вот что непонятно-для SPI и чтение и запись это одно и тоже.
то есть если я в прерывании прочитал принятый байт - то я как бы уже автоматом должет передать в мастер dummy байт.
или я не прав?
как вот мне реализовать команду a = PINx
то есть чтение порта?
принял я команду и хочу в слеве передать ответ-как мне это правильно сделать?
прошу прощения, я не задавал бы вопрос, если бы у меня было настоящее устройство-я бы просто посидел с дебагером и разобрался-но у меня устройства пока нет, но код предварительный накидать надо.
спасибо!

_Артём_
Цитата(inventor @ Jul 16 2012, 20:46) *
даташыте написано что SCLK не можето быть более половины тактовой частоты.
У меня тактовая частота атмеги 8 мегагерц, но и 4 мегагерца - это предел.


В даташите говорится что частота spi не может быть больше половины тактовой в режиме мастера, для slave - 1/4 . Предел - 2 МГц.

Цитата
When the SPI is configured as Slave, the SPI is only guaranteed to work at fosc /4 or
lower.


Цитата(inventor @ Jul 16 2012, 20:46) *
SPI и чтение и запись это одно и тоже.
то есть если я в прерывании прочитал принятый байт - то я как бы уже автоматом должет передать в мастер dummy байт.
или я не прав?

Вы неправы. Чтение - просто чтение.
Передача байта мастером - это запись в SPDR.
Запись slave-ом в SPDR - это эагрузка байта в буфер который будет передан тогда когда мастер протактирует следующий байт.

Цитата(inventor @ Jul 16 2012, 20:46) *
как вот мне реализовать команду a = PINx
то есть чтение порта?
принял я команду и хочу в слеве передать ответ-как мне это правильно сделать?


А в чём тут проблема?

Код
unsigned char SpiState;
unsigned char NewSpiRxByte;
#pragma vector=SPI_STC_vect
__interrupt void SpiIsr()
{
switch (SpiState) {
case 0:// перепад на линии SS
    SpiState++;
    SPDR=PINA;// посылаем PINA в SPI
    break;
case 1:
    NewSpiRxByte=SPDR;// чтение команды
    SPDR=PINB; // посылаем PINB в SPI
    SpiState++;
    break;
case 2:// посылаем ещё что-нибудь
    break;

}
}

inventor
получается что SPDR=PINA
будет передано не в первом кейсе а в последующем
как бы с задержкой..я правильно понял?
_Артём_
Цитата(inventor @ Jul 16 2012, 21:20) *
получается что SPDR=PINA
будет передано не в первом кейсе а в последующем

Вы о моём коде? Кстати, я не написал, что это реализация slave.
Будет передано тогда когда мастер протактирует, то есть может быть и никогда.


Цитата(inventor @ Jul 16 2012, 21:20) *
как бы с задержкой..я правильно понял?

Ну вобщем да, задержка определяется мастером.

P.S.
Поправка. Правильней в моём примере так делать:
Код
SPDR=PINB; // посылаем PINB в SPI
NewSpiRxByte=SPDR;// чтение команды

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