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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F103 SD -> FSMC по DMA
-Игорь-
сообщение Nov 23 2012, 06:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



Хотел прямо с sd карточки, которая подключена к sdio, данные посылать на жк дисплей, который подключен через fsmc. Не удается. Дело как я понимаю в том, что 4-х байтное слово dma отправляет на fsmc за 4 цикла. Не могу найти решения, чтоб обойти это. Если посылать через буфер в озу, то все работает. Но если так делать, то пропадает почти весь смысл использования dma.
Подскажите как обойти это ограничение.
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 23 2012, 09:07
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



Я не прав. Оказывается пересылка идет правильно, но где-то на 54 пикселе происходит подвис. Т.е. dma успевает сделать порядка 27 циклов. На другой канал попробовать повесить? Кто-нибудь делал удачно такую связку?
Go to the top of the page
 
+Quote Post
011119xx
сообщение Nov 23 2012, 09:19
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(-Игорь- @ Nov 23 2012, 14:07) *
Я не прав. Оказывается пересылка идет правильно, но где-то на 54 пикселе происходит подвис. Т.е. dma успевает сделать порядка 27 циклов. На другой канал попробовать повесить? Кто-нибудь делал удачно такую связку?

Может имеет смысл код показать?
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 23 2012, 09:41
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



Код для SD взят из примеров от stm. Для lcd из примеров от olimex. Конечно могу показать, только не понятно, что именно. Там в общей сложности строк-то прилично.
Ну ок. Чуть сдвинулся с места. Плохо понимаю работу dma, не знал за что отвечает флаг DMA_M2M, и пока еще не знаю, после ответа пойду читать, в примерах с SD он выключен. Включил - экран залился одним цветом, вместо картинки. Но залился весь. И функция чтения из SD закончилась с ошибкой - Receive FIFO over-run.
Пойду читать доки и пытаться понять, что происходит.
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 26 2012, 06:40
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



И так.
С флагом dma_m2m понятно. Он здесь не нужен.
Повторю.
Задача прямо с флешки с помощью дма заливать данные на lcd, который подключен к fsmc.
По отдельности все работает. Т.е. нормально считывается с флешки в буфер озу (используется dma2 channel4). Буфер озу успешно заливается в lcd (используется dma 1 channel3). Здесь никаких проблем не возникает. Но как только при конфигурировании дма2 вместо адреса озу задаю адрес lcd, цикл dma завершается? (виснет канал?) после примерно 50 транзакций, хотя задается 256 и больше. Все убирал из программы, оставлял только функции работы с флешкой и лсд - все равно дма отрабатывает только 50 транзакций. А вообще-то я использую канал 5 второго дма, на этот канал этот завис не отражается. Завис, это образно, я не знаю, что происходит с каналом, но цикл полностью не выполняется и флаг завершения обмена не выставляется.
Код функции запуска транзакций:
Код
static void DMA_lcd(u32 *BufferDST, u32 BufferSize)
{
  DMA_InitTypeDef DMA_InitStructure;
  DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4);
  /* DMA2 Channel4 disable */
  DMA_Cmd(DMA2_Channel4, DISABLE);
  /* DMA2 Channel4 Config */
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SDIO_FIFO_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)BufferDST;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA2_Channel4, &DMA_InitStructure);
  DMA_Cmd(DMA2_Channel4, ENABLE);
}
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 26 2012, 09:52
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



посмотрел регистры канала дма после подвиса. Во всех регистрах нормальные данные. Судя по флагу канал включен. В регистре CNDTR 102, т.е. канал выполнил 26 транзакций.
Пойду смотреть регистры fsmc.

SDIO регистры.
Все регистры ок. В регистре статуса установлены два флага:
RXACT: Data receive in progress
RXDAVL: Data available in receive FIFO


Нашел такой же вопрос на форуме st. Судя по тому, что остался без ответа, похоже глюк микроконтроллера sad.gif
Придется слать через озу sad.gif

https://my.st.com/public/STe2ecommunities/m...urrentviews=236
Go to the top of the page
 
+Quote Post
011119xx
сообщение Nov 26 2012, 09:55
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



А вот это что задается?
Код
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;

Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 26 2012, 10:19
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



Цитата(011119xx @ Nov 26 2012, 12:55) *
А вот это что задается?
Код
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;

Здесь все ок. Это особенности обмена с sd картой. В функцию передается количество байт для пересылки, а в дма заносится количество 4-х байтных слов. Обмен с картой ведется через 32-х битный буфер фифо.
Обмен прекращается после 26-и пересылок, когда передано 104 байта. Счетчик дма виснет на значении 102. Запрос был на 512 байт - 128 пересылок.

И еще. Дело в том, что в этом же виде все работает, если адресоваться в озу. Т.е. эта же функция работает нормально. Там единственное отличие это устанавливается флаг инкримента памяти. Но чтобы точно все проверить я оставлял флаг инкремента и при адресации к fsmc. Т.е. вообще ничего в функции не менял. Результат всегда один и тот же - после 26 транзакций - останов.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Nov 26 2012, 10:31
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



После 26 транзакций на экране дисплея адекватная картинка, та что должна быть?
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 26 2012, 10:59
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



Да.
Т.е. 52 пикселя выводятся туда куда я указываю, и выводятся те на которые я адресуюсь в sd карточке. Регистры в sd и в dma не запорчены. Т.е. просто почему-то передача останавливается на полдороге.

пиксель 16 бит.
Go to the top of the page
 
+Quote Post
k000858
сообщение Nov 28 2012, 03:36
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



интерфейс подключения карты сидит случайно не на той же шине что и интерфейс подключения экрана?
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 28 2012, 04:09
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



На разных.
Я посмотрел апликуху an2598. В ней пересылка на дисплей со всяких внешних интерфесов, разные виды памяти, происходит с использованием dma. Исключение sd. C sd считывание происходит с помощью дма, а для загрузки на дисплей обычный цикл пересылки.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Nov 28 2012, 05:41
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Смотрели в отладчике на каком участке кода происходит завис?
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Nov 28 2012, 07:59
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



Программа не зависает. Прекращается обмен по дма. Т.е. виснет только канал 4 дма 2. Если Вы намекаете, на случай, который описывается в еррарате, то он исключен. Я оставлял практически голую программу, отключал все дма, кроме сдишного. Программа вертелась в пустом цикле. Дма все равно останавливается после 26 транзакций. Кстати, вчера, он вис после 28 транзакций. С чем это связано, я предположить не могу.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Nov 28 2012, 08:33
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Все же хотелось бы увидеть ваш код (а так сложно гадать) ... Предлагаю в качестве эксперимента попробовать сделать тоже самое, но данные в дисплей передавать без участия FSMC.
Go to the top of the page
 
+Quote Post

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

 


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


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