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

 
 
> atmega и 9-bit SPI, как лучше реализовать?
sonycman
сообщение Nov 15 2008, 20:49
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Нужно задействовать ЖКИ от нокии 6510, который требует девяти битного SPI.
Камень ATmega324 (или ATmega88).
Выход в написании софтовых процедур передачи данных (только на запись), или можно как-то заюзать аппаратный интерфейс камня?
Думаю, если передавать девятый бит руками (отключая каждый раз SPI, а потом снова включая), дело пойдёт пошустрее, чем чисто программно? Или это невозможно?

ЗЫ: кстати, никто не имел дела с вышеназванными ЖКИ? В них точно установлен контроллер OM6211?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
AHTOXA
сообщение Nov 15 2008, 21:20
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Nov 16 2008, 02:49) *
Думаю, если передавать девятый бит руками (отключая каждый раз SPI, а потом снова включая), дело пойдёт пошустрее, чем чисто программно? Или это невозможно?

Да, так выходит побыстрее. Гляньте примеры для s65, там вроде так сделано.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 16 2008, 00:06
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(AHTOXA @ Nov 16 2008, 01:20) *
Да, так выходит побыстрее. Гляньте примеры для s65, там вроде так сделано.

Спасибо, но что-то ковыряться в библиотеке и куче асмовых файлов желания мало 05.gif
Включить и выключить SPI - не проблема. Всего-то один бит сменить.
Но вот не придётся ли при этом реинициализировать его регистры?

Ладно, попробую сначала чисто софтом, запущу дисплей, а потом буду извращаться с аппаратным SPI... biggrin.gif

ЗЫ: после ARM почему-то стало казаться, что и в AVRовском интерфейсе можно менять разрядность sad.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 16 2008, 09:34
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Nov 16 2008, 06:06) *
Спасибо, но что-то ковыряться в библиотеке и куче асмовых файлов желания мало 05.gif


Значит я перепуталsmile.gif
Вот рабочий кусок (оба варианта):
CODE

#ifdef USE_SOFT_SPI
static void nokia_spi(uint8_t data)
{
off(NOKIA_DOUT);
if (data & 0x80) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);

off(NOKIA_DOUT);
if (data & 0x40) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);

off(NOKIA_DOUT);
if (data & 0x20) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);

off(NOKIA_DOUT);
if (data & 0x10) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);

off(NOKIA_DOUT);
if (data & 0x08) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);

off(NOKIA_DOUT);
if (data & 0x04) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);

off(NOKIA_DOUT);
if (data & 0x02) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);

off(NOKIA_DOUT);
if (data & 0x01) on(NOKIA_DOUT);
off(NOKIA_SCK);
on(NOKIA_SCK);
}

#else // USE_SOFT_SPI

static inline __attribute__((__always_inline__)) void nokia_spi(uint8_t data)
{
SPCR = (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(0<<SPR1)|(0<<SPR0);
SPDR = data;
while(!(SPSR & (1<<SPIF)));
SPCR = 0;
}

#endif // USE_SOFT_SPI

static void nokia_cmd(uint8_t cmd)
{
off(NOKIA_DOUT);
on(NOKIA_CS);
off(NOKIA_SCK);
on(NOKIA_SCK);

nokia_spi(cmd);

off(NOKIA_CS);
}

static void nokia_data(uint8_t data)
{
on(NOKIA_DOUT);
on(NOKIA_CS);
off(NOKIA_SCK);
on(NOKIA_SCK);

nokia_spi(data);

off(NOKIA_CS);
}


На всякий случай напомню, что нога SS должна быть выходом или подтянута к единице, иначе SPI не заработает.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 16 2008, 10:13
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(AHTOXA @ Nov 16 2008, 12:34) *
На всякий случай напомню, что нога SS должна быть выходом или подтянута к единице, иначе SPI не заработает.

Это в мастере-то ? Всегда работало, а тут вдруг не будет ?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 16 2008, 10:28
Сообщение #6


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(AHTOXA @ Nov 16 2008, 13:34) *
Значит я перепуталsmile.gif
Вот рабочий кусок (оба варианта):

На всякий случай напомню, что нога SS должна быть выходом или подтянута к единице, иначе SPI не заработает.


Вот теперь всё понятно. Так я и планировал сделать! Имхо, тут проблем быть не должно smile.gif

ЗЫ: а зачем все функции в этом примере объявляются статическими?


Цитата(rx3apf @ Nov 16 2008, 14:13) *
Это в мастере-то ? Всегда работало, а тут вдруг не будет ?


Да, даже в режиме мастера с этим пином надо считаться:

Master Mode
When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the
direction of the SS pin.
If SS is configured as an input, it must be held high to ensure Master SPI operation. If the SS pin
is driven low by peripheral circuitry when the SPI is configured as a Master with the SS pin
defined as an input, the SPI system interprets this as another master selecting the SPI as a
slave and starting to send data to it. To avoid bus contention, the SPI system takes the following
actions:
1. The MSTR bit in SPCR is cleared and the SPI system becomes a Slave. As a result of
the SPI becoming a Slave, the MOSI and SCK pins become inputs.
2. The SPIF Flag in SPSR is set, and if the SPI interrupt is enabled, and the I-bit in SREG is
set, the interrupt routine will be executed.
Thus, when interrupt-driven SPI transmission is used in Master mode, and there exists a possibility
that SS is driven low, the interrupt should always check that the MSTR bit is still set. If the
MSTR bit has been cleared by a slave select, it must be set by the user to re-enable SPI Master
mode.

То есть, если пин SS, сконфигурированный как вход, перейдёт в активное состояние (низ. уровень), режим мастера меняется на слэйв.
По крайней мере, это относится в 88 меге... smile.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 16 2008, 11:56
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(sonycman @ Nov 16 2008, 13:28) *
То есть, если пин SS, сконфигурированный как вход, перейдёт в активное состояние (низ. уровень), режим мастера меняется на слэйв.
По крайней мере, это относится в 88 меге... smile.gif
Это относится ко всем AVR. И учитывать это надо всегда.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 16 2008, 16:55
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Nov 16 2008, 16:28) *
а зачем все функции в этом примере объявляются статическими?

Они не вызываются извне, вот и статические. Мне понятнее, оптимизатору легче.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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