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

 
 
 
Reply to this topicStart new topic
> Аппаратный SPI slave atMega8
_Anatoliy
сообщение Aug 4 2018, 07:39
Сообщение #1


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Коллеги, что то я в трёх соснах запутался - нигде в доках не нашёл как слейв должен реагировать на команду чтения(раньше в этом режиме не доводилось работать).
Я по приёму первого байта (команды) сразу записываю в SPDR байт для отправки, а на выходе MISO при записи следующего байта выползает первый байт сообщения(мой код команды).
Код
        data = getchar();
        BufferCom[index_buf_spi++] = data;
        if (index_buf_spi == 1) {
            switch(data)
                {
                case 0x55:
                    length_command = 7;
                    command = data;
                    SPDR = level_db;
                    crc8 = data;
                    break;    
                case 0xaa:
            ....................

Помогите хорошим советом,плз.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 4 2018, 12:26
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(_Anatoliy @ Aug 4 2018, 10:39) *
Я по приёму первого байта (команды) сразу записываю в SPDR байт для отправки, а на выходе MISO при записи следующего байта выползает первый байт сообщения(мой код команды).


Все правильно: при записи в мастером в SPDR значения для посылки слейву, запускается механизм обмена и в результате которого из слейва передается записанное в SPDR ранее. По приему слейвом первого байта, в Вашем случае команды, первый байт из слейва уже пришел к мастеру - для передачи записанного байта для отправки нужна инициация обмена со стороны мастера.
Тут два пути: записывать в SPDR байт для отправки заранее, либо со стороны мастера инициировать обмены пока не прийдет ожидаемый пакет.

Имхо, лучше организовать обмен в стандартном режиме: маркер начала, длина данных, данные, контрольная сумма.
Тогда у Вас отпадает необходимость в синхронизации запросов/ответов слейва.
Мастер, отослав командный пакет, может некоторое время гнать незначащие байты, в надежде получить ответ.




Сообщение отредактировал aiwa - Aug 4 2018, 12:34
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Aug 4 2018, 13:49
Сообщение #3


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(aiwa @ Aug 4 2018, 15:26) *
Тут два пути: записывать в SPDR байт для отправки заранее, либо со стороны мастера инициировать обмены пока не прийдет ожидаемый пакет.

1). Вот тут и непонятки. Хорошо если команда чтения всего одна,как в моём случае.Заранее ясно что отправлять. А если их несколько? И для каждой команды нужно отправлять свои данные. Ведь до получения команды нельзя угадать какие данные нужно отправить.
2). Либо я чего-то не понял, либо совет от лукавого - я такие методы не приемлю.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 4 2018, 16:15
Сообщение #4


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



В описании некоторых устройств (и даже не микропроцессорных - а разнообразные индикаторы) - встречается требование на dummy byte перед чтением данных - как раз случай, когда на интерпретацию команды требуется не полтакта. Так что нормально.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 4 2018, 16:30
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(_Anatoliy @ Aug 4 2018, 16:49) *
2). Либо я чего-то не понял, либо совет от лукавого - я такие методы не приемлю.


Ничего от лукавого: на плате 162 мега была соединена по spi с основным контроллером и служила расширителем ком-портов.
И по такому алгоритму прогонялись буфера нескольких протоколов.

Грубо говоря, со стороны мастера spi можете представлять usart-ом, с оговоркой что для получения байта от RX нужно что-то загнать в TX:
если у Вас есть что отослать - отсылайте посылку, если нечего - шлите 0xFF, с целью анализа полученого от слейва.

1. Отсылаете буфер команды.
2. Шлете некоторое количество 0xFF для получения от слейва маркера начала.
3. При получении во время 1. или 2. маркера начала засылаете 0xFF пока не вытащите от слейва весь буфер,
если маркера не было. останавливаете обмен до следующей необходимости.

Да и еще одно предостережение - при значительной разнице в частотах мастера и слейва, нужно предусмотреть эту разницу, мне пришлось между буфером и SPDR использовать регистр.

Сообщение отредактировал aiwa - Aug 4 2018, 16:35
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Aug 4 2018, 16:48
Сообщение #6


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(Genadi Zawidowski @ Aug 4 2018, 19:15) *
В описании некоторых устройств (и даже не микропроцессорных - а разнообразные индикаторы) - встречается требование на dummy byte перед чтением данных - как раз случай, когда на интерпретацию команды требуется не полтакта. Так что нормально.

Согласен, я тоже к такому выводу пришёл самостоятельно. А в качестве dummy проще всего применять первый байт принятого сообщения, в моём случае код команды.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Aug 4 2018, 18:13
Сообщение #7


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(aiwa @ Aug 4 2018, 19:30) *
Ничего от лукавого: на плате 162 мега была соединена по spi с основным контроллером и служила расширителем ком-портов.
И по такому алгоритму прогонялись буфера нескольких протоколов.

Грубо говоря, со стороны мастера spi можете представлять usart-ом, с оговоркой что для получения байта от RX нужно что-то загнать в TX:
если у Вас есть что отослать - отсылайте посылку, если нечего - шлите 0xFF, с целью анализа полученого от слейва.

1. Отсылаете буфер команды.
2. Шлете некоторое количество 0xFF для получения от слейва маркера начала.
3. При получении во время 1. или 2. маркера начала засылаете 0xFF пока не вытащите от слейва весь буфер,
если маркера не было. останавливаете обмен до следующей необходимости.

Да и еще одно предостережение - при значительной разнице в частотах мастера и слейва, нужно предусмотреть эту разницу, мне пришлось между буфером и SPDR использовать регистр.

Не, что то я не въехал... А зачем тут маркер? И куда он может исчезнуть?
У меня протокол простейший, это видно из рисунка. Команда возвращается в качестве dummy.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 4 2018, 19:24
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(_Anatoliy @ Aug 4 2018, 21:13) *
Не, что то я не въехал... А зачем тут маркер? И куда он может исчезнуть?

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

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th April 2024 - 09:08
Рейтинг@Mail.ru


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