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

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


Участник
*

Группа: Участник
Сообщений: 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. могу чего-то не знать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
amost
сообщение Sep 5 2009, 14:05
Сообщение #2


Участник
*

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



Цитата(DpInRock @ Sep 4 2009, 14:51) *
Ну, существует масса извращенных способов последовательной связи.
Если имеем битовый поток, клоки, то разбиение на байты или еще какие единицы - дело программы.

К примеру, самый простой способ - на меге (мастер) дергать SS (либо оно дергается автоматически), а на тиньке - это вход прерывания, по которому быстренько сбрасывается счетчик бит в SPI (это по спадающему фронту). Ну а по нарастающему - программе сообщается, что байт готов к употреблению.

А у автора топика такая система отсутствует как класс. Он надеется исключительно на авось. И "авось" зачастую работает. На то она и "авось". Это кому какая степень надежности устраивает. Может кто-то любит микропроцессоры, программа которых максимально похожа на человеческий разум - работает по настроению.

да нет, я не надеюсь на авось. Вы красиво критикуете надежность моей системы -- хорошо. я не мудренный опытом разработчик, я просто любитель, который делает для себя полные глюков "поделки". с этой позиции я и читал ДШ, где в упор не увидел и слова о необходимости синхронизации каждого байта по линии SS и сброса счетчика бит SPI. поймите, вопрос о выборе типа последовательной связи не стоит, это можно обойти.

Цитата(_Pasha @ Sep 4 2009, 15:07) *
Добавлю критики smile.gif
И, к тому же, где входной индекс обнуляться будет?
Вообще-то это делается пресловутой очередью, поминаемой в форуме с завидным постоянством.

входной индекс обнуляется. об очереди я знаю. я привел часть кода, которую оставил после появления глюков. буфер не обнуляю только потому, что во время отладки передаю заранее известное кол-во символов, меньше длины приемного буфера слейва.

Цитата(Палыч @ Sep 4 2009, 17:01) *
Может я чего-то не доглядел в Вашей программе, но, имхо, у Вас проблемы со сбросом бита SPIF. При работе по прерываниям он сбрасывается автоматом при переходе по вектору. А вот, при работе по готовности - посмотрите внимательно в DS

этот вариант я тоже рассматривал. в ДШ написано, что SPIF сбрасывается автоматически при первом чтении SPSR, т.е. он сбрасывается еще при выполнении поллинга. хотя, наверное, стоит попробовать сбрасывать самому.

спасибо всем за ответы. тема и правда бестолковая. можна закрывать.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - SasaVitebsk   Цитата(amost @ Sep 5 2009, 17:05) с этой ...   Sep 7 2009, 11:24
- - DpInRock   Цитатас этой позиции я и читал ДШ, где в упор не у...   Sep 5 2009, 22:02


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:53
Рейтинг@Mail.ru


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