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

 
 
 
Reply to this topicStart new topic
> 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
_dem
сообщение Aug 20 2009, 12:41
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Нет.
Используйте SODR / CODR для установки / снятия уровня.

Во-вторых, SAM7, как и любой арм, дрыгает ногами весьма неохотно.
Посмотрите документацию на предмет синхронизации состояния PIO линий с тактовой частотой.
Go to the top of the page
 
+Quote Post
Artkop
сообщение Aug 20 2009, 13:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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 мк сек получился...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 20 2009, 13:07
Сообщение #4


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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);
...


Тогда будет достаточно быстро.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 20 2009, 18:31
Сообщение #5


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

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



volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA;
volatile AT91PS_PMC pPMC = AT91C_BASE_PMC;

А зачем припсали выделенное ключевое слово? const ещё понимаю, а это-то зачем?

Тут в три такта не уложитесь никак... посмотрите что Вам нагенерировал компилятор.

У меня 62 наносекунды между соседними фронтами получалось (gcc, код для 32-бит ARM, из ОЗУ на 48 МГц, оптимизация -Os).

Сообщение отредактировал Genadi Zawidowski - Aug 20 2009, 18:35
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Aug 21 2009, 04:33
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Хм, может не в теме, но зачем эмулировать паралельный интерфейс, если у SE серии есть EBI (8/16/32)
Почему просто через него не обращаться как к статической 8-разрядной памяти?
Go to the top of the page
 
+Quote Post
Artkop
сообщение Aug 21 2009, 05:44
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
fantex
сообщение Aug 21 2009, 05:59
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 21 2009, 06:12
Сообщение #9


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

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


Участник
*

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



Genadi Zawidowski: Без volatile (и соответственно с включенной оптимизацией по скорости) строб получился 100нс! В пять раз короче! (компилятор IARовский)
Go to the top of the page
 
+Quote Post

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

 


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


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