|
|
  |
Софтовый SPI, Поделитесь исходничком. |
|
|
|
Mar 22 2007, 09:21
|
Участник

Группа: Новичок
Сообщений: 27
Регистрация: 24-02-07
Пользователь №: 25 639

|
С добрым утром всех  . Собственно если у кого есть софтовая реализация SPI поделитесь пожалуйста. Вся проблема в том что нужен SPI, но порт занят дисплеем , поэтому хочу использовать его софтовую реализацию на произвольных выводах.
Сообщение отредактировал neonix - Mar 22 2007, 09:23
|
|
|
|
|
Mar 22 2007, 10:40
|
Участник

Группа: Новичок
Сообщений: 27
Регистрация: 24-02-07
Пользователь №: 25 639

|
Дисплей то не с SPI шиной ,а обычной паралельный на базе контроллера HD44780. Просто порт занят и использовать его альтернативную функцию я не могу так как необходим вывод на ЖКИ.
|
|
|
|
|
Mar 22 2007, 10:51
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(neonix @ Mar 22 2007, 09:40)  Дисплей то не с SPI шиной ,а обычной паралельный на базе контроллера HD44780. Просто порт занят и использовать его альтернативную функцию я не могу так как необходим вывод на ЖКИ. И что вывод на LCD идет постоянно? А так нельзя: -- вывел информацию на LCD: -- перестроил порт и работай в SPI: -- перестроил порт на LCD: -- вывел информацию на LCD: и т.д.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Mar 22 2007, 10:59
|
Участник

Группа: Новичок
Сообщений: 27
Регистрация: 24-02-07
Пользователь №: 25 639

|
Если честно я не знал что так можно , думал инициализация устройств только вначале программы  . Впринципе можно и так , но тогда появляется другая проблема - не будет ли SPI портить выведеную информацию на ЖКИ ?
|
|
|
|
|
Mar 22 2007, 11:01
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
Под 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; }
|
|
|
|
|
Mar 22 2007, 11:06
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(neonix @ Mar 22 2007, 09:59)  Если честно я не знал что так можно , думал инициализация устройств только вначале программы  . Впринципе можно и так , но тогда появляется другая проблема - не будет ли SPI портить выведеную информацию на ЖКИ ? Ну для этого существуют схемотехнические решения  типа Цитата тама на устройстве к которому ты пордключаешь МК есть /CS ... если 0 подать, то оно и выбрано ... поэтому тебе потребуется всего 1 дополнительная нога на МК
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Mar 22 2007, 11:08
|
Участник

Группа: Новичок
Сообщений: 27
Регистрация: 24-02-07
Пользователь №: 25 639

|
Спасибо , буду пробовать  , жалко что в таком случае прийдется вручную обрабатывать событие о поступлении данных...
|
|
|
|
|
Mar 22 2007, 11:13
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(neonix @ Mar 22 2007, 10:08)  Спасибо , буду пробовать  , жалко что в таком случае прийдется вручную обрабатывать событие о поступлении данных... Такая проблема возникает всегда, когда хочется навешать на "маленький"  м\к большое количество переферии!
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Mar 22 2007, 11:58
|
Участник

Группа: Новичок
Сообщений: 27
Регистрация: 24-02-07
Пользователь №: 25 639

|
ahulap не могли бы Вы привести задержки в милисекундах , тк не хочу использовать модуль delay.h . И еще как я понял ваша функция возвращает то что пришло в ответ по spi ?
|
|
|
|
|
Mar 22 2007, 14:27
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
Да, возвращает принятый байт по SPI. Работает в SPI mode 0, как по app.note AVR320. Задержка при "высоком полупериоде" SCK - половине частоты SPI (-2 такта на установку пина), при "низком" полупериоде - та же половина частоты SPI (- ~12 тактов на зацикливание, установку MOSI и считывание MISO). Каждая итерация _delay_loop_1() занимает 3 цикла (ldi; dec, brne).
|
|
|
|
|
Mar 22 2007, 15:58
|
Участник

Группа: Новичок
Сообщений: 27
Регистрация: 24-02-07
Пользователь №: 25 639

|
Всем большое спасибо, все получилось и работает , ahulap вам отдельное спасибо за предоставленный исходник.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|