Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103C8 + S1D15D14 чтение из DDRAM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
BittleF1998
Цель: масковые шрифты, пиктограммы.

Задача: чтение из памяти дисплея.

Осложнения: после установки необходимой области (команды 0x2A,0x2B) и отправки команды RAM data read(0x2E) перевожу SPI в bidirectional режим(BIDIMODE), однако на выходе(SPI->DR) почему-то 0xFF, тактовые импульсы есть, данных нет.

Действия: объединил промежуток опущенного CS (до этого поднимал после каждого байта) как сказано на 36 странице документации
изменил режим MISO с push-pull afio на open drain afio с добавлением 4.7к резистора на питание. Сначала был уверен, что линия MISO, оставшаяся внизу после передачи последнего бита(он там 0 получается- 0x2E) давит сигналы с дисплея, однако когда я отключал ножку PA7 от afio блока перед началом чтения, увидел, что вывод так и остаётся висеть, подтянутый к питанию.

Косяки: не вставляю dummy clock перед чтением. сделать это будет очень непросто с моей архитектурой кода. но пока не появились хоть какие-то данные, запариваться глупо.

разрабатываю часики в личное пользование.
сейчас установлен только дисплей, МК, внешний spi flash.
питание 3.3в от программатора, конденсатор керамика 10uf фильтр.
CS и A0 сохраняют свои состояния на протяжении всей(восьмибитной) передачи.
завершения передачи жду в пустом цикле, ожидая флага. исправлю как-нибудь потом.

если это чем-то поможет, могу предоставить исходники, фото монтажа, схемы, ссылки на используемую мной документацию.
Golikov A.
Цитата
Сначала был уверен, что линия MISO, оставшаяся внизу после передачи последнего бита

у вас мастер кто? контроллер или дисплей? Если контроллер то почему на мастер инпут у вас была какая-то передача?


документацию на S1D15D14 неплохо было бы кинуть...
схему подключения тоже, для понятности, фото не нужно....
BittleF1998
Цитата(Golikov A. @ Sep 15 2015, 17:05) *
у вас мастер кто? контроллер или дисплей? Если контроллер то почему на мастер инпут у вас была какая-то передача?


Моя ошибка, перепутал. конечно же MOSI.
мастер- контроллер.
дело в том, что spi блок переключает состояние только по необходимости и поэтому, если последний переданный бит был единицей, то линия и остаётся в верхнем положении. если последним следовал нуль, то и линия внизу.

дока на дисплей
http://www.mikrocontroller.net/attachment/...E_14_030526.pdf

а править свою писанину никак нельзя? а то стыдно. название дисплея в шапке перепутал (S1D15G14) и mosi с miso
Golikov A.
Цитата
а править свою писанину никак нельзя? а то стыдно. название дисплея в шапке перепутал (S1D15G14) и mosi с miso

хотите чтобы следующие уже ответившие выглядели глупо%sm.gif?


Цитата
дело в том, что spi блок переключает состояние только по необходимости и поэтому, если последний переданный бит был единицей, то линия и остаётся в верхнем положении. если последним следовал нуль, то и линия внизу

так у вас 1 проводной интерфейс?... тогда чтобы слейв по этой же линии что-то обратно отдал, надо ее переводить в 3 состояние, но принять вы что-то сможете только по другой ноге MISO, так как по MOSI вы что-то примите, только если контроллер переведете в слейв, а тогда он не выдаст клоки.

Или же вам надо использовать специальный 1 проводной режим, в некоторых STM он есть, сам все это перещелкивает. Либо заводить контакт на обе ноги MOSI и MISO и на время приема MOSI переводить на вход. Какой вариант вы реализуете?
AlanDrakes
Чтож.. Похоже, по схеме подключения остаётся вопрос: Шина описана с выводами SCL, MOSI, CS и A0. Как понимаю, подключение - 4-х проводное, с общим проводом MOSI/MISO (получается вывод SIO в инструкции).
Судя по мануалу к STM32, нужно сделать следующее, чтобы работало именно так:
Передать байт (команду), затем непосредственно перед началом чтения ответа выполнить:
Код
SPIn->CR1 &= ~(SPI_CR1_SPE | SPI_CR1_BIDIOE); // Отключить SPI и переключить режим двустороннего обмена на приём
SPIn->CR1 |= (SPI_CR1_BIDIMODE);  // Включаем режим двустороннего обмена по одной линии (ТОЛЬКО ПРИЁМ)
SPIn->CR1 |= (SPI_CR1_SPE); // Разрешаем работу SPI

После этого данные будут принудительно получаться с шины. Нужно получить необходимое колчичество и отключить SPI, затем отключить и режим однопроводной шины.
Код
SPIn->CR1 &= ~(SPI_CR1_SPE | SPI_CR1_BIDIOE | SPI_CR1_BIDIMODE);

Должно помочь.
Golikov A.
И самый главный вопрос

пункт 8.1 описания
Цитата
However ,the contents of display RAM cannot be read....

c этим то что делать?
AlanDrakes
Цитата(Golikov A. @ Sep 16 2015, 12:50) *
И самый главный вопрос

пункт 8.1 описания

c этим то что делать?

А вот до туда я не дочитал... сразу пошёл искать подключение и команды.
Чтож, ничего не поделать, RAM не будет читаться. Зато, мне кажется, двусторонний обмен данными регистров получить удастся.
Obam
"However ,the contents of display RAM cannot be read.... c этим то что делать?"

Жадничать не надо, параллельный интерфейс позволяет всё. И быстродействие будет сразу sm.gif
BittleF1998
ну чтож, я даже не ожидал такой быстрой реакции. благодарю всех ответивших.

меня сразу смутило, что для последовательного порта диаграмма чтения указана где-то в описании команд. смутило, но я не отступил.
вот буковки читать иногда полезно. спасибо, Golikov A.

идея про перезагрузку spi у меня появилась самостоятельно, но я её не успел реализовать.
всё равно благодарю AlanDrakes!

чтение памяти было самым дубовым решением проблемы, но не единственным. буду рисовать точками. при адекватной оптимизации может получится даже быстрее
всем спасибо!.
Golikov A.
вы уверены что вы не операцию на глазу через зад делаетеsm.gif?

Я с трудом улавливаю связь между тем что не удалось считать память и необходимость рисовать чего-то точками. Вы бы описали задачу чуть общее, народу на форум много, кто-то что-то подобное наверняка делал....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.