Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием по SPI в слейве
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
paskal
Здравствуйте! Нужно подключиться к 89S8253 через SPI. Контроллер в slave режиме. Но не хватает проводов чтобы задействовать все 4 линии, есть только 3. Если я пожертвую сигналом SS, получится организовать прием используя только MOSI,MISO,SCK? Прерывания по приему байта будут возникать?
Палыч
Цитата(paskal @ Jan 24 2012, 19:08) *
Если я пожертвую сигналом SS, получится организовать прием используя только MOSI,MISO,SCK? Прерывания по приему байта будут возникать?

Вспомните, что SS - Slave Select. Как это Вы этим сигналом "пожертвуете" в слейве?
demiurg_spb
Цитата(Палыч @ Jan 24 2012, 20:55) *
Вспомните, что SS - Slave Select. Как это Вы этим сигналом "пожертвуете" в слейве?
А разве программно нельзя настроиться на режим слейв?
Если у ТС всего пара устройств (мастер и слейв) то синхронизацию посылок можно сделать любым другим способом на уровне протокола без использования CS вовсе.
Палыч
Цитата(demiurg_spb @ Jan 24 2012, 22:58) *
А разве программно нельзя настроиться на режим слейв?

Именно на режим слейв ТС и хочет настроить. Но в слейве сигналом SS как раз включается/отключается SPI. Можно на эту ногу повесить низкий уровень - устройство будет выбрано (включено) всегда, но высвободить эту ногу под другие цели не удастся.
paskal
Цитата(Палыч @ Jan 24 2012, 22:06) *
Но в слейве сигналом SS как раз включается/отключается SPI. Можно на эту ногу повесить низкий уровень - устройство будет выбрано (включено) всегда, но высвободить эту ногу под другие цели не удастся.

Если нога будет занята - не беда. У меня не хватает провода, а не ножки. Но если я повешу вход SS на 0, то будет ли работать SPI? Ведь по циклограмме в даташите от передергивается.
_Артём_
Цитата(paskal @ Jan 24 2012, 21:24) *
Если нога будет занята - не беда. У меня не хватает провода, а не ножки. Но если я повешу вход SS на 0, то будет ли работать SPI? Ведь по циклограмме в даташите от передергивается.

Не буду утверждать, что в 89S8253 spi работает аналогично авр. Но если также, то SS можно заземлить и тогда авр сразу после разрешения spi переходит slave-mode и остаётся там, пока SS=0 и spi разрешён, то есть перепад не нужен.
Палыч
Цитата(paskal @ Jan 24 2012, 23:24) *
если я повешу вход SS на 0, то будет ли работать SPI?

Работать будет. Но, если между мастером и слейвом по какой-то причине произайдет рассинхронизация (например, из-за помехи на SCK), то без сигнала SS синхронизировать их будет крайне затруднительно.
paskal
Цитата(_Артём_ @ Jan 25 2012, 00:23) *
Не буду утверждать, что в 89S8253 spi работает аналогично авр. Но если также, то SS можно заземлить и тогда авр сразу после разрешения spi переходит slave-mode и остаётся там, пока SS=0 и spi разрешён, то есть перепад не нужен.

Интересно, а вы по прерываниям работали?
А то у меня не получается. Экспериментирую как раз с мегой128. В цикле периодически шлю байт. Так вот, если SS после каждой посылки дергать, то по приему возникает прерывание, а в буфере приемника лежит нужный байт. Но если SS оставлять в 0 постоянно, прерывания не возникают. Как будто по перепаду SS происходит какая то начальная установка чего то там вызывающего прерывание.
_Артём_
Цитата(paskal @ Jan 25 2012, 19:29) *
Интересно, а вы по прерываниям работали?
А то у меня не получается. Экспериментирую как раз с мегой128. В цикле периодически шлю байт. Так вот, если SS после каждой посылки дергать, то по приему возникает прерывание, а в буфере приемника лежит нужный байт. Но если SS оставлять в 0 постоянно, прерывания не возникают. Как будто по перепаду SS происходит какая то начальная установка чего то там вызывающего прерывание.

Я не то чтобы работал:
Использовал всегда только режим spi-master (m128). Однажды вылез такой баг:
на SS не было подтяжки к +,
1)программа bootloader-а включила SS на вход и передала упревление на вектор сброса
2) основная программа инициализировала SPI (SPCR=0x50 - master-mode)
3) так как SS оказался равен 0 spi перешёл в режим slave (что программой не предусматривалось)
4) программа зависла

Цитата(paskal @ Jan 25 2012, 19:29) *
Так вот, если SS после каждой посылки дергать, то по приему возникает прерывание, а в буфере приемника лежит нужный байт.

по доке прерывание (или SPIF=1) возникает при переходе из master в slave и при окончании передач. Что-то не так в программе (master не шлёт данные?).

Цитата(paskal @ Jan 25 2012, 19:29) *
Но если SS оставлять в 0 постоянно, прерывания не возникают.

Значит master не передал данные.
Для spi-slave SPDR=<any_byte> не означает что передача началась.

Цитата(paskal @ Jan 25 2012, 19:29) *
Как будто по перепаду SS происходит какая то начальная установка чего то там вызывающего прерывание.


переход в режим и сброс счётчика бит происходит.
paskal
Цитата(_Артём_ @ Jan 25 2012, 21:43) *
по доке прерывание (или SPIF=1) возникает при переходе из master в slave и при окончании передач. Что-то не так в программе (master не шлёт данные?).

Значит master не передал данные.

Данные передаются, мастер выдает 8 тактов на SCLK, это я проверил осциллографом. Более того, у меня идет нормально обмен когда я даю импульс от мастера на SS в конце передачи байта. Но стоит убрать 2 команды на дерганье SS-ом, и прерывания замолкают.


Цитата(_Артём_ @ Jan 25 2012, 21:43) *
переход в режим и сброс счётчика бит происходит.

Что то похоже на это. А нельзя ли этот счетчик сбросить не через импульс на SS, а как нибудь программным способом?
_Артём_
Цитата(paskal @ Jan 25 2012, 21:05) *
Данные передаются, мастер выдает 8 тактов на SCLK, это я проверил осциллографом. Более того, у меня идет нормально обмен когда я даю импульс от мастера на SS в конце передачи байта. Но стоит убрать 2 команды на дерганье SS-ом, и прерывания замолкают.

Что-то странное: пока SS=0 байты должны приниматься без изменения на SS - 8 клоков достаточно. Правильно ли настроен вход CLK у slave?


Цитата(paskal @ Jan 25 2012, 21:05) *
А нельзя ли этот счетчик сбросить не через импульс на SS, а как нибудь программным способом?


SPCR=0 - запрет spi
SS=вход
SPSR=<сброс флагов>
SPCR=<включить>
То есть запретить/разрешить spi.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.