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

 
 
> AT91SAM7SE, PIO и 8-bit параллельный интерфейс, Связь с SSD1305 Oled контроллером
Artkop
сообщение Aug 20 2009, 12:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-08
Пользователь №: 38 217



Доброго времени суток! Необходимо соединить at91sam7se и дисплейный OLED модуль (контроллер SSD1305). Для этого надо написать софтверный протокол на PIO (8080 параллельный интерфейс). Разбираюсь.. Выяснил, что можно выставлять уровни ножек PIO (в моем случае PIOA) регистрами PIO_SODR и PIO_СODR. Но если делать это в программе, в ручную, то временные диаграммы получаются не пойми какими. Для синхронной записи используется PIO_ODSR, я правильно понимаю?

Делаю так:

//----------------------------------------------------------------------------------

volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA;

volatile AT91PS_PMC pPMC = AT91C_BASE_PMC;
pPMC->PMC_PCER = (1<<AT91C_ID_PIOA);

pPIO->PIO_PER = AT91C_PIO_PA0 | AT91C_PIO_PA1 | AT91C_PIO_PA2 | AT91C_PIO_PA3 |
AT91C_PIO_PA4 | AT91C_PIO_PA5 | AT91C_PIO_PA6 | AT91C_PIO_PA7 |
AT91C_PIO_PA8 | AT91C_PIO_PA9 | AT91C_PIO_PA10 | AT91C_PIO_PA11 | AT91C_PIO_PA12 | AT91C_PIO_PA14 | AT91C_PIO_PA15;

pPIO->PIO_OER = AT91C_PIO_PA0 | AT91C_PIO_PA1 | AT91C_PIO_PA2 | AT91C_PIO_PA3 |
AT91C_PIO_PA4 | AT91C_PIO_PA5 | AT91C_PIO_PA6 | AT91C_PIO_PA7 |
AT91C_PIO_PA8 | AT91C_PIO_PA9 | AT91C_PIO_PA10 | AT91C_PIO_PA11 | AT91C_PIO_PA12 | AT91C_PIO_PA14 | AT91C_PIO_PA15;

pPIO->PIO_OWER = AT91C_PIO_PA0 | AT91C_PIO_PA1 | AT91C_PIO_PA2 | AT91C_PIO_PA3 |
AT91C_PIO_PA4 | AT91C_PIO_PA5 | AT91C_PIO_PA6 | AT91C_PIO_PA7;

pPIO->PIO_ODSR = 0xFF; //
pPIO->PIO_ODSR = 0x00; // Сформировал строб на 8битной шине

//------------------------------------------------------------------------------------------------------------------------------------

Но длительность импульса получилась 600 нс. Как ее уменьшить?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Artkop
сообщение Aug 21 2009, 05:44
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-08
Пользователь №: 38 217



DmitryM: Да, и правда можно! D[0..7], CS, Read и Write есть! Правда необходимо добавить еще 2 линии. Но эти линии (команда/данные и reset) можно и в ручную дергать.

Genadi Zawidowski: volatile используется для того, чтобы в обработчике прерываний изменять переменную. (я там запрещаю прерывание, типа такого (например для SPI) pSPI->SPI_IDR = AT91C_SPI_RDRF) Ну и компилятор не должен ее оптимизировать. Хотя вот написал это, а для PIOA никаких обработчиков еще нет, да и не будет наверное, и ничто параллельно выполнению основной задачи структуру PIO не изменит. И PMC я не правлю, только при включении и инициализации. Спасибо за наводки, будем думать!)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 21 2009, 06:12
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(Artkop @ Aug 21 2009, 09:44) *
Ну и компилятор не должен ее оптимизировать.

Это и причина низкой скорости.

pSPI->SPI_IDR = AT91C_SPI_RDRF - в этом случае volatile у адреса не нужен, так как сами регистры периферии имеют такой атрибут:
typedef volatile unsigned int AT91_REG;

Вы же не переставляете в прерывани значение переменной pSPI - а именно у неё Вами добавлено volatile!

Сообщение отредактировал Genadi Zawidowski - Aug 21 2009, 06:26
Go to the top of the page
 
+Quote Post



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

 


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


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