Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Софтовый SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
neonix
С добрым утром всех smile.gif. Собственно если у кого есть софтовая реализация SPI поделитесь пожалуйста. Вся проблема в том что нужен SPI, но порт занят дисплеем , поэтому хочу использовать его софтовую реализацию на произвольных выводах.
zorromen
Те бери дурного в голову ... к SPI можно подключать кучу девайсов паралельно ... тама на устройстве к которому ты пордключаешь МК есть /CS ... если 0 подать, то оно и выбрано ... поэтому тебе потребуется всего 1 дополнительная нога на МК ...
neonix
Дисплей то не с SPI шиной ,а обычной паралельный на базе контроллера HD44780. Просто порт занят и использовать его альтернативную функцию я не могу так как необходим вывод на ЖКИ.
Wild007
Цитата(neonix @ Mar 22 2007, 09:40) *
Дисплей то не с SPI шиной ,а обычной паралельный на базе контроллера HD44780. Просто порт занят и использовать его альтернативную функцию я не могу так как необходим вывод на ЖКИ.

И что вывод на LCD идет постоянно? А так нельзя:
-- вывел информацию на LCD:
-- перестроил порт и работай в SPI:
-- перестроил порт на LCD:
-- вывел информацию на LCD:
и т.д. smile.gif
neonix
Если честно я не знал что так можно , думал инициализация устройств только вначале программы smile.gif . Впринципе можно и так , но тогда появляется другая проблема - не будет ли SPI портить выведеную информацию на ЖКИ ?
ahulap
Под WinAVR, F_CPU/F_SPI/6 должо быть больше 4, ну и естественно порты настроены.

#define F_CPU 8000000
#define F_SPI 250000

#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define SPI_PIN PINB
#define SCK PB7
#define MISO PB6
#define MOSI PB5

unsigned char spi_send(unsigned char d)
{
unsigned char i = 8;


do {
// Set MOSI
if (d & _BV(7)) SPI_PORT |= _BV(MOSI);
else SPI_PORT &= ~_BV(MOSI);

//Get MISO
d <<= 1;
if (SPI_PIN & _BV(MISO)) d++;

// SCK impulse
SPI_PORT |= _BV(SCK);
_delay_loop_1(F_CPU/F_SPI/6 - 1);
SPI_PORT &= ~_BV(SCK);
_delay_loop_1(F_CPU/F_SPI/6 - 4);

} while (--i);

return d;
}
Wild007
Цитата(neonix @ Mar 22 2007, 09:59) *
Если честно я не знал что так можно , думал инициализация устройств только вначале программы smile.gif . Впринципе можно и так , но тогда появляется другая проблема - не будет ли SPI портить выведеную информацию на ЖКИ ?

Ну для этого существуют схемотехнические решения smile.gif типа
Цитата
тама на устройстве к которому ты пордключаешь МК есть /CS ... если 0 подать, то оно и выбрано ... поэтому тебе потребуется всего 1 дополнительная нога на МК
neonix
Спасибо , буду пробовать smile.gif , жалко что в таком случае прийдется вручную обрабатывать событие о поступлении данных...
Wild007
Цитата(neonix @ Mar 22 2007, 10:08) *
Спасибо , буду пробовать smile.gif , жалко что в таком случае прийдется вручную обрабатывать событие о поступлении данных...

Такая проблема возникает всегда, когда хочется навешать на "маленький" smile.gif м\к большое количество переферии! biggrin.gif
neonix
ahulap не могли бы Вы привести задержки в милисекундах , тк не хочу использовать модуль delay.h . И еще как я понял ваша функция возвращает то что пришло в ответ по spi ?
ahulap
Да, возвращает принятый байт по SPI. Работает в SPI mode 0, как по app.note AVR320.
Задержка при "высоком полупериоде" SCK - половине частоты SPI (-2 такта на установку пина), при "низком" полупериоде - та же половина частоты SPI (- ~12 тактов на зацикливание, установку MOSI и считывание MISO).
Каждая итерация _delay_loop_1() занимает 3 цикла (ldi; dec, brne).
GDI
http://electronix.ru/forum/index.php?showtopic=10934 тут посмотрите, вроде было что то.
neonix
Всем большое спасибо, все получилось и работает , ahulap вам отдельное спасибо за предоставленный исходник.
Сергей Борщ
Цитата(neonix @ Mar 22 2007, 14:58) *
Всем большое спасибо, все получилось и работает
Теперь почитайте документацию на ваше SPI-устройство и подумайте - возможно задержки не нужны вообще и AVR при всем желании не сможет развить максимально допустимую для SPI-устройства скорость.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.