реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> 16-ти, 24-х, 32=битный SPI на атмега, Возможно ли?
inventor
сообщение Jul 31 2012, 21:57
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



атмеговский SPI всего 8 бит
очень хочется передавать за раз в два-три раза больше,
пробую в обработчике прерывания (слейва) читать
дата регистр типа
...
byte[0] = SPDR;
byte[1] = SPDR;
byte[3] = SPDR;
итд.

в мастере передаю эти 24 бита за одну посылку и одним CS -
то есть перед перечаей ставлю CS, после передачи всех 24 бит убираю.
получаю в сейве правильно все, но что то меня сомнения гложат что так неправильно делать.
кто подскажет насчет этого?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 1 2012, 07:24
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Наоборот, всё правильно.
ЦС как раз взводится ручками и в данном случае это ой как хорошо. sm.gif Сложнее было, если б управлялся "продвинутой" периферией

Сообщение отредактировал _Pasha - Aug 1 2012, 07:25
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 1 2012, 07:57
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (inventor @ Aug 1 2012, 00:57) *
но что то меня сомнения гложат что так неправильно делать.
Идея верная, еще полезно отловив неактивное состояние CS выключить/включить SPI чтобы восстановить синхронизацию если вдруг она сбилась из-за помехи.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 1 2012, 08:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(inventor @ Aug 1 2012, 01:57) *
пробую в обработчике прерывания (слейва) читать дата регистр типа
...
byte[0] = SPDR;
byte[1] = SPDR;
byte[3] = SPDR;
итд.
....кто подскажет насчет этого?

Вот-так и читаете, не проверяя: "а, были ли второй и третий байты приняты устройством ?"
Даже немного странно, что такое работает... Вероятно, скорость передачи - максимальная.
Да, и с флагом SPIF - непонятно... По приёму первого байта и переходу на обработчик прерывания он будет сброшен... А, по приходу второго и третьего байта - кто этот флаг сбросит?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 1 2012, 10:37
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

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

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

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

Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 1 2012, 16:55
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



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



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

Цитата
SPIF is cleared by hardware when executing the corresponding interrupt handling vector.
biggrin.gif
Он тои раза и входит в обработчик, я думаю что он сократил код


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 1 2012, 17:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Aug 1 2012, 19:55) *
biggrin.gif
Он тои раза и входит в обработчик, я думаю что он сократил код

Я так понял, что входит он в прерывание по spi именно один раз.
Если три раза, то чем вариант ТС отличается от стандарного?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 1 2012, 17:38
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Так всегда же можно посидеть в прерывании , если знаешь количество необходимых байт . Вошёл и сиди пока все не примешь, просто можно и так написать обработчик. Но конечно лучше позырить весь код обработчика


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 1 2012, 18:22
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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;
}

?
Так сойдёт наверное.
Go to the top of the page
 
+Quote Post
inventor
сообщение Aug 2 2012, 13:36
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



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

http://www.avrfreaks.net/index.php?name=PN...ic&t=123491
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 2 2012, 13:59
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(inventor @ Aug 2 2012, 16:36) *
но как я понял если первый байт принимается в прерывании то второй и третий нужно принять после проверки
ожидания готовности бита данных в буфере.


Может я ошибаюсь, но прерывание spi произойдет сначала от перехода в 0 линии SS. То есть читать ещё рано - данных нет, можно записать в spi байт для передачи и потом ждать приёма байта от master-а.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Aug 2 2012, 17:17
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



А зачем ждать В прерывании?
Если приём быстрый, на максимальной частоте, есть смысл вообще отказаться от прерываний. Как раз пока новый адрес ячейки вычислится, байт и уйдёт. А если медленно, то по указателю и побайтно.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 2 2012, 17:40
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

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

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

Там вычислятся нечему - адрес первого байта - константа, а дальше можно просто делать ST с постинкрементом.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Aug 2 2012, 18:23
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Ну, можно SS на INT завести sm.gif
Но вообще я говорил про мастера.

Чтобы сделать на ST на СИ, надо объявлять указатель. Иначе никакого инкремента не будет, будет каждый раз загрузка адреса.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 3 2012, 03:50
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
но прерывание spi произойдет сначала от перехода в 0 линии SS
Это правило для мастера. Если SS как вход и появляется лог.0 , то произойдёт прерывание. К мастеру кто-то хочет достучаться. Ну а обычно
Цитата
When a serial transfer is complete, the SPIF Flag is set.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 11:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016