Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 16-ти, 24-х, 32=битный SPI на атмега
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
inventor
атмеговский SPI всего 8 бит
очень хочется передавать за раз в два-три раза больше,
пробую в обработчике прерывания (слейва) читать
дата регистр типа
...
byte[0] = SPDR;
byte[1] = SPDR;
byte[3] = SPDR;
итд.

в мастере передаю эти 24 бита за одну посылку и одним CS -
то есть перед перечаей ставлю CS, после передачи всех 24 бит убираю.
получаю в сейве правильно все, но что то меня сомнения гложат что так неправильно делать.
кто подскажет насчет этого?
_Pasha
Наоборот, всё правильно.
ЦС как раз взводится ручками и в данном случае это ой как хорошо. sm.gif Сложнее было, если б управлялся "продвинутой" периферией
Сергей Борщ
QUOTE (inventor @ Aug 1 2012, 00:57) *
но что то меня сомнения гложат что так неправильно делать.
Идея верная, еще полезно отловив неактивное состояние CS выключить/включить SPI чтобы восстановить синхронизацию если вдруг она сбилась из-за помехи.
Палыч
Цитата(inventor @ Aug 1 2012, 01:57) *
пробую в обработчике прерывания (слейва) читать дата регистр типа
...
byte[0] = SPDR;
byte[1] = SPDR;
byte[3] = SPDR;
итд.
....кто подскажет насчет этого?

Вот-так и читаете, не проверяя: "а, были ли второй и третий байты приняты устройством ?"
Даже немного странно, что такое работает... Вероятно, скорость передачи - максимальная.
Да, и с флагом SPIF - непонятно... По приёму первого байта и переходу на обработчик прерывания он будет сброшен... А, по приходу второго и третьего байта - кто этот флаг сбросит?
_Артём_
Цитата(Палыч @ Aug 1 2012, 11:51) *
Вот-так и читаете, не проверяя: "а, были ли второй и третий байты приняты устройством ?"
Даже немного странно, что такое работает...

Согласен, что как-то странно это выглядит.

Цитата(Палыч @ Aug 1 2012, 11:51) *
Да, и с флагом SPIF - непонятно... По приёму первого байта и переходу на обработчик прерывания он будет сброшен... А, по приходу второго и третьего байта - кто этот флаг сбросит?

Никто не сбросит.

ILYAUL
Цитата
_Артём_Никто не сбросит.



Цитата
inventor пробую в обработчике прерывания .......получаю в сейве правильно все

Цитата
SPIF is cleared by hardware when executing the corresponding interrupt handling vector.
biggrin.gif
Он тои раза и входит в обработчик, я думаю что он сократил код
_Артём_
Цитата(ILYAUL @ Aug 1 2012, 19:55) *
biggrin.gif
Он тои раза и входит в обработчик, я думаю что он сократил код

Я так понял, что входит он в прерывание по spi именно один раз.
Если три раза, то чем вариант ТС отличается от стандарного?
ILYAUL
Так всегда же можно посидеть в прерывании , если знаешь количество необходимых байт . Вошёл и сиди пока все не примешь, просто можно и так написать обработчик. Но конечно лучше позырить весь код обработчика
_Артём_
Цитата(ILYAUL @ Aug 1 2012, 20:38) *
Так всегда же можно посидеть в прерывании , если знаешь количество необходимых байт . Вошёл и сиди пока все не примешь, просто можно и так написать обработчик.

Типа такого:
Код
unsigned char byte_conter=0;
while (byte_conter<SPI_BYTE_QTY) {
    while ((SPSR&(1<<SPIF))==0)
    ;
    spi_rx_buffer[byte_conter++]=SPDR;
}

?
Так сойдёт наверное.
inventor
на avr freaks задал такой же вопрос-несколько противоречивых мнений.
но как я понял если первый байт принимается в прерывании то второй и третий нужно принять после проверки
ожидания готовности бита данных в буфере.
как то так.
но я не стал испытывать судьбу и просто написал State mashine для приема
трех байт в обработчике прерывания.

http://www.avrfreaks.net/index.php?name=PN...ic&t=123491
_Артём_
Цитата(inventor @ Aug 2 2012, 16:36) *
но как я понял если первый байт принимается в прерывании то второй и третий нужно принять после проверки
ожидания готовности бита данных в буфере.


Может я ошибаюсь, но прерывание spi произойдет сначала от перехода в 0 линии SS. То есть читать ещё рано - данных нет, можно записать в spi байт для передачи и потом ждать приёма байта от master-а.
Dikoy
А зачем ждать В прерывании?
Если приём быстрый, на максимальной частоте, есть смысл вообще отказаться от прерываний. Как раз пока новый адрес ячейки вычислится, байт и уйдёт. А если медленно, то по указателю и побайтно.
_Артём_
Цитата(Dikoy @ Aug 2 2012, 20:17) *
Если приём быстрый, на максимальной частоте, есть смысл вообще отказаться от прерываний.

А на изменение SS как успеть отреагировать?

Цитата(Dikoy @ Aug 2 2012, 20:17) *
Как раз пока новый адрес ячейки вычислится, байт и уйдёт.

Там вычислятся нечему - адрес первого байта - константа, а дальше можно просто делать ST с постинкрементом.
Dikoy
Ну, можно SS на INT завести sm.gif
Но вообще я говорил про мастера.

Чтобы сделать на ST на СИ, надо объявлять указатель. Иначе никакого инкремента не будет, будет каждый раз загрузка адреса.
ILYAUL
Цитата
но прерывание spi произойдет сначала от перехода в 0 линии SS
Это правило для мастера. Если SS как вход и появляется лог.0 , то произойдёт прерывание. К мастеру кто-то хочет достучаться. Ну а обычно
Цитата
When a serial transfer is complete, the SPIF Flag is set.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.