|
AT91SAM7SE, PIO и 8-bit параллельный интерфейс, Связь с SSD1305 Oled контроллером |
|
|
|
Aug 20 2009, 12:39
|
Участник

Группа: Участник
Сообщений: 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 нс. Как ее уменьшить?
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Aug 20 2009, 13:01
|
Участник

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

|
Спасибо! Буду смотреть.
Пока сделал так:
pPIO->PIO_CODR = 0x400; pPIO->PIO_CODR = 0x1000; pPIO->PIO_ODSR = 0xFF; pPIO->PIO_ODSR = 0x00; pPIO->PIO_SODR = 0x1000; pPIO->PIO_SODR = 0x400;
CS (это который 0x1000) длительностью 2 мк сек получился...
|
|
|
|
|
Aug 20 2009, 13:07
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Во-вторых, SAM7, как и любой арм, дрыгает ногами весьма неохотно. Не так уж все и запущено именно на атмеловских армах. 3 такта на запись в порт (супротив двух при записи, например, в ОЗУ). Тут решать надо по другому. Код #pragma optimize=no_inline void Out8Bit(unsigned int d1, unsigned int d2, unsigned int d3, unsigned int d4) { pPIO->PIO_CODR = d1; pPIO->PIO_CODR = d2; pPIO->PIO_ODSR = d3; pPIO->PIO_ODSR = d4; pPIO->PIO_SODR = d2; pPIO->PIO_SODR = d1; } и вызывать уже эту функцию, передавая ей в параметрах нужные биты. Код ... Out8Bit(0x400,0x1000,0xFF,0x00); ... Тогда будет достаточно быстро.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 21 2009, 05:44
|
Участник

Группа: Участник
Сообщений: 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 я не правлю, только при включении и инициализации. Спасибо за наводки, будем думать!)
|
|
|
|
|
Aug 21 2009, 05:59
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480

|
Цитата(Artkop @ Aug 21 2009, 09:44)  DmitryM: Да, и правда можно! D[0..7], CS, Read и Write есть! Правда необходимо добавить еще 2 линии. Но эти линии (команда/данные и reset) можно и в ручную дергать. Линию команда/данные можно завести на A0 и всё будет работать.
Сообщение отредактировал fantex - Aug 21 2009, 06:00
|
|
|
|
|
Aug 21 2009, 06:12
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 21 2009, 06:43
|
Участник

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

|
Genadi Zawidowski: Без volatile (и соответственно с включенной оптимизацией по скорости) строб получился 100нс! В пять раз короче! (компилятор IARовский)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|