|
Связь mega8 -> t2313 по SPI, работать работает, но в чем же соль |
|
|
|
Sep 2 2009, 15:48
|

Участник

Группа: Участник
Сообщений: 32
Регистрация: 28-10-05
Из: Ukraine, Khmelnitsky
Пользователь №: 10 246

|
здравствуйте. пришлось связать два камня по SPI. передача данных в одну сторону Mega8 (master) --> tiny2313. инициализацию мастера и слейва сделал по ДШ. mega8: Код void SPIinit(void) { DDRB |= (1<<PIN_SPI_MOSI) | (1<<PIN_SPI_SCK) | (1<<PIN_SPI_SS); SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); } t2313: Код void USIinit(void) { DDRB = (1<<USI_PIN_DO); PORTB |= (1<<USI_PIN_DI) | (1<<USI_PIN_SCK); USICR = (1<<USIOIE) | (1<<USIWM0) | (1<<USICS1); } отправляю байт Код void SPI_send_byte(char data) { SPDR = data; while( !(SPSR & (1<<SPIF)) ) ; } принимаю на тиньке Код ISR (USI_OVERFLOW_vect) { USISR |= (1<<USIOIF);
usi_in_buf[gBuf_ind_in] = USIDR; gBuf_ind_in++; } после получения каждого нового символа передаю его слэйвом по UART. так вот, один байт таким способом я принять могу, но если посылается несколько байт -- получается каша. правильно принимается только последний символ из всего потока. ставлю после передачи каждого символа задержку -- Код SPI_send_byte('b'); _delay_loop_1(48); SPI_send_byte('a'); _delay_loop_1(48); SPI_send_byte('d'); _delay_loop_1(48); SPI_send_byte(' '); -- слэйв принимает нормально. да, если нужно то mega запущена на 16МГц, tiny2313 -- 8МГц. клок на SPI на мастере делится на 16. если делить на 128 то нормально принимает при значении задержки между символами приблизительно 3мкс (начинает принимать нормально при _delay_loop_1(15)). изначально, было две версии: 1. передача очередного байта начинается до завершения передачи предыдущего. думаю этот вариант исключается поллингом флага SPIF, и флага WCOL. (?) 2. тинька не успевает обрабатывать поток данных. этот вариант тоже вроде как исключил -- понизил частоту клока, сократил до минимума обработчик прерывания. пробовал даже после 4-5 принятых в ОЗУ символов запрещать прерывания на слэйве и спокойненько выдавать буфер в UART. теоретически, могу оставить задержки между символами. но хочется же знать в чем соль. хотя бы на чьей стороне? мастер/слэйв? да, мой первый проэкт именно на C. могу чего-то не знать.
|
|
|
|
|
 |
Ответов
|
Sep 5 2009, 14:05
|

Участник

Группа: Участник
Сообщений: 32
Регистрация: 28-10-05
Из: Ukraine, Khmelnitsky
Пользователь №: 10 246

|
Цитата(DpInRock @ Sep 4 2009, 14:51)  Ну, существует масса извращенных способов последовательной связи. Если имеем битовый поток, клоки, то разбиение на байты или еще какие единицы - дело программы.
К примеру, самый простой способ - на меге (мастер) дергать SS (либо оно дергается автоматически), а на тиньке - это вход прерывания, по которому быстренько сбрасывается счетчик бит в SPI (это по спадающему фронту). Ну а по нарастающему - программе сообщается, что байт готов к употреблению.
А у автора топика такая система отсутствует как класс. Он надеется исключительно на авось. И "авось" зачастую работает. На то она и "авось". Это кому какая степень надежности устраивает. Может кто-то любит микропроцессоры, программа которых максимально похожа на человеческий разум - работает по настроению. да нет, я не надеюсь на авось. Вы красиво критикуете надежность моей системы -- хорошо. я не мудренный опытом разработчик, я просто любитель, который делает для себя полные глюков "поделки". с этой позиции я и читал ДШ, где в упор не увидел и слова о необходимости синхронизации каждого байта по линии SS и сброса счетчика бит SPI. поймите, вопрос о выборе типа последовательной связи не стоит, это можно обойти. Цитата(_Pasha @ Sep 4 2009, 15:07)  Добавлю критики  И, к тому же, где входной индекс обнуляться будет? Вообще-то это делается пресловутой очередью, поминаемой в форуме с завидным постоянством. входной индекс обнуляется. об очереди я знаю. я привел часть кода, которую оставил после появления глюков. буфер не обнуляю только потому, что во время отладки передаю заранее известное кол-во символов, меньше длины приемного буфера слейва. Цитата(Палыч @ Sep 4 2009, 17:01)  Может я чего-то не доглядел в Вашей программе, но, имхо, у Вас проблемы со сбросом бита SPIF. При работе по прерываниям он сбрасывается автоматом при переходе по вектору. А вот, при работе по готовности - посмотрите внимательно в DS этот вариант я тоже рассматривал. в ДШ написано, что SPIF сбрасывается автоматически при первом чтении SPSR, т.е. он сбрасывается еще при выполнении поллинга. хотя, наверное, стоит попробовать сбрасывать самому. спасибо всем за ответы. тема и правда бестолковая. можна закрывать.
|
|
|
|
|
Sep 7 2009, 11:24
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(amost @ Sep 5 2009, 17:05)  с этой позиции я и читал ДШ, где в упор не увидел и слова о необходимости синхронизации каждого байта по линии SS и сброса счетчика бит SPI. Открываем любой даташит. Я открыл, к примеру, даташит на atmega88. На странице 153 перед рисунком 67 читаем: Код After each data packet, the Master will synchronize the Slave by pulling high the Slave Select, SS, line. О синхронизации каждого байта речи не идёт. Но если у вас нет более высокого уровня (деление на пакеты и контроль целостности), то как вы узнаете о том, что синхронизация сбилась? В этом случае проще осуществлять побайтную синхронизацию. Из рисунка видно, что сам SPI одно из самых примитивных переферийных устройств. По сути, сдвиговый регистр. Совершенно очевидно, что при сбое по линии SCK (например проскочил помеховый дополнительный импульс по SCK), будет искажатся вся последующая информация. Из опыта применения сообщаю вам, что это действительно так и есть. При работе без сигнала SS приходится городить спец процедуру ресинхронизации между пакетами данных. Либо, как, по видимому применял DpInRock, использовать битстаффинг и выделять информацию прямо из битового потока.
|
|
|
|
Сообщений в этой теме
amost Связь mega8 -> t2313 по SPI Sep 2 2009, 15:48 DpInRock При таком многословии надо бы соблюдать правила яз... Sep 2 2009, 19:26 amost а откуда ему взяться, этому лишнему клоку? там же ... Sep 3 2009, 04:16 _Pasha Цитата(amost @ Sep 2 2009, 18:48) после п... Sep 3 2009, 05:59 amost Цитата(_Pasha @ Sep 3 2009, 08:59) Привед... Sep 3 2009, 20:28 DpInRock Цитатаа откуда ему взяться
Вариантов - очень много... Sep 3 2009, 08:15 SasaVitebsk Я что-то не увидел из текста - а вы SS-ом дёргаете... Sep 3 2009, 10:56 DpInRock У 2313 нет никакого SS. Просто тупой сдвиговый рег... Sep 3 2009, 11:26 SasaVitebsk Цитата(DpInRock @ Sep 3 2009, 14:26) У 23... Sep 4 2009, 08:35  _Pasha Цитата(SasaVitebsk @ Sep 4 2009, 11:35) П... Sep 4 2009, 10:56 DpInRock Ну, существует масса извращенных способов последов... Sep 4 2009, 11:51 _Pasha Цитата(DpInRock @ Sep 4 2009, 14:51) А у ... Sep 4 2009, 12:07 SasaVitebsk Если честно, то настораживает то, что у автора топ... Sep 4 2009, 13:29 DpInRock ЦитатаЕсли честно, то настораживает то, что у авто... Sep 4 2009, 13:36 _Pasha Цитата(DpInRock @ Sep 4 2009, 16:36) А во... Sep 4 2009, 13:54 Палыч Цитата(amost @ Sep 2 2009, 18:48) ...так ... Sep 4 2009, 14:01 DpInRock Цитатас этой позиции я и читал ДШ, где в упор не у... Sep 5 2009, 22:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|