Easyelectronics.ru

Электроника для всех
Текущее время: 20 июл 2018, 04:06

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 07:17 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Привет.
Вот думаю на сколько правильный код написан. В принципе код работает. Но вдруг есть какие подводные камни.

Хочу забирать данные с микросхемы TDC7200 через SPI. Без прерывание и DMA.

Написал вот такой код:

Show


Вопрос в проверки флагов SPI_FLAG_TXE и SPI_FLAG_RXNE. Точно как делать в мануале не написано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 08:30 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Так у вас DMA то и нету тут...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 08:40 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2653
Цитата:
// нужна ли проверка занятости ?

Нужна обязательно. Иначе вы поднимете CS где-то посередине последнего байта. И вообще такие штуки лучше с DMA, к чему эти блокирующие ожидания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 08:52 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Проверка BSY нужна только в конце передачи, после последнего байта. Иначе вы не получите непрерывную передачу байтов, после каждого байта будет идти небольшая пауза. И эту проверку (ожидание BSY) лучше всего выводить ЗА пределы цикла передачи, перед отключением SPI.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 11:44 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
А разве можно использовать DMA для одновременной передачи и приема информации по SPI?
Если можно, то можете сказать как ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 11:49 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2653
И можно и нужно)
Код прикладываю, аккурат для вашего чипа.
Использовать примерно так:
Код:
   SPI_CS_Low(PWR_ADE);
   SPI1_SetDMA_RxTx((uint32_t)TxBuf, 3,DMA_MODE_TX);
   SPI1_SetDMA_RxTx((uint32_t)RxBuf, 4,DMA_MODE_RX);
   SPI_CS_High(PWR_ADE);

Код под FreeRTOS/


Вложения:
COMMON_SYS.zip [3.23 Кб]
Скачиваний: 11
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 12:11 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Создал проект для начало в кубе. И увидал странность.
Зависает SPI у меня не сразу а через какое то время работы.
Причем так интересно зависает.
Примерно на пол пути ставит бит RXNE в единицу и молчит. Если в ручною сбросить его то все дальше работает. Потом проходи какое то время и снова бит RXNE в единице. Такое ощущение что не читается регистр SPI_DR.
И в счетчики DMA_SxNDTR остается число.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 15:05 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
А еще наверняка ставит бит OVR, когда новые данные уже получены, но так и не были прочитаны из DR регистра. Скорость работы всей этой HAL-овской дребедени выходит ниже, чем скорость поступления байтов.
Если используете DMA чтение, значит, что-то его прерывает. Посмотрите флаги ошибок в DMA-потоке. Либо вы как-то что-то где-то неверно настроили


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 15:33 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Нет OVR не установлен. Ошибок от DMA нет. Проверял несколько раз.
DMA ведь аппаратный как влияет скорость кода на передачу данных из SPI в память ОЗУ?
Помогло понижение скорости SPI до 1 МГц.
Вот скриншот всех основных битов. Видно бит RXNE в нуле. Значит данные из SPI не переданы в ОЗУ. DMA2 3 канал приемник 1 канал передатчик.


Вложения:
1.png
1.png [ 170.62 Кб | Просмотров: 697 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 27 июн 2018, 14:24 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Написал код на регистрах.
Стало лучше. Зависания пропали но стали вываливаться ошибки DMA думаю еще и ошибки SPI присутствуют.

Код имеет следующий вид:
Show


Ошибки пометил +.
Не ясно из за чего могут быть ошибки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 27 июн 2018, 14:50 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2653
А зачем вам два прерывания на DMA? Актуально только Rx, Tx по сути геморно использовать, т.к. срабатывание DMA , означает лишь то, что все DMA закончил свою работу, но это не значит что все байты ушли физически по линии MOSI. Зачем при чтении (у вас же чтение?) передавать &TDC7200? Передавайте любой байт без инкремента адреса источника, канал Tx нужен тупо для тактирования.
Да и надо убедиться, что (unsigned int) это 32-битное число, иначе у вас может быть беда с адресом, записываемым в M0AR


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 27 июн 2018, 18:00 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 455
zhilenkov писал(а):
Написал код на регистрах.
Стало лучше. Зависания пропали но стали вываливаться ошибки DMA думаю еще и ошибки SPI присутствуют.

Использование "|=" для полной перезаписи регистра ->CR - не имеет смысла. У вас остаются старые значения и добавляются новые. Имеет смысл объединить все строчки в одну прямую запись. Сброс флагов выполняется прямой записью единицы, значение регистра для сброса обнуляется аппаратно после выполнения операции. Время на сброс флага может быть больше восьми тиков, посему в прерывании сначала сбрасываем - а после делаем ещё что-то важное. Иначе есть шанс влететь в прерывание вторично.
Свойства флагов почти одинаковы для всей автономной периферии- той что может тикать самостоятельно.
Дополнительно:
F429 не имеет fifo буфера на spi, по этому порядок чтения-записи очень важен. Оба запроса на эти операции прилетают практически одновременно. Для того чтобы разрулить ситуацию - нужно назначить разные приоритеты для дма. Пусть rx перебивает tx.
Ну и ещё, у spi множество режимов, в том числе: только чтение. Этот режим намного проще в обслуживании.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 27 июн 2018, 18:51 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Канал передачи SPI на TDC7200 работает также, как HC595 регистр. Первый байт это Register Read/Write.
Поэтому мне нужен кольцевой SPI. Только чтение или запись не подходят.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 29 июн 2018, 09:46 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Что за ошибка DMA Stream x FIFO error interrupt flag?
Что она означает ? Как ее убрать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 29 июн 2018, 15:36 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Полностью она звучит как FIFO overrun/underrun и означает либо переполнение, либо опустошение FIFO буфера. То есть, либо не успеваете читать приёмник буфер, либо не успеваете заполнять передающий.
Я же сразу говорил - проверьте ошибки DMA


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 29 июн 2018, 18:56 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Как правильно включать spi до инициализации DMA или после?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 29 июн 2018, 20:00 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Без разницы. DMA - это всего лишь канал связи.
Ой, пардон, я там в предыдущем сообщении не про тот FIFO вторую часть сообщения написал, я чето про FIFO SPI подумал...
Относительно FIFO DMA - у вас непорядки с упаковкой в FIFO. Там вообще замудренный он сделан. Лучше его отключить, используя Direct mode. FIFO DMA нужен, если вы на одной стороне передаете (или получаете) 2-байтными данными, а на другой стороне оперируете 1-байтными.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 13:54 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Цитата:
Лучше его отключить, используя Direct mode.
Отключил вот так

Код:
  DMA2_Stream1->FCR = 0x00000000;
  DMA2_Stream1->FCR |= DMA_SxFCR_DMDIS;


все равно вылазит ошибка
Код:
  if(DMA2->LISR & DMA_LISR_FEIF1)
  {
  DMA2->LIFCR |= DMA_LIFCR_CFEIF1;
  //while(1);
  }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 15:56 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Этот бит работает диаметрально противоположно. Direct mode Disabled, если =1, то запрещен, если =0, то direct mode разрешен. То есть, в direct mode не используется FIFO.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 16:29 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Цитата:
Этот бит работает диаметрально противоположно.
Это прочитал в RM0090.
Столкнулся с еще одной проблемой, получаемые данные смещены относительно начального адреса структуры ровно на один байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 16:43 
Заглядывает иногда

Зарегистрирован: 22 авг 2014, 12:29
Сообщения: 85
В прерываниях нельзя использовать конструкцию типа DMA2->LIFCR |= DMA_LIFCR_CTEIF1; надо использовать DMA2->LIFCR = DMA_LIFCR_CTEIF1; вы можете по I вычитать кроме своего флага и другие и сбросить их . (регистр только и на запись ) В процедуре DMA2_TDC7200() отсутствует строка SPI4->CR1 &= ~SPI_CR1_SPE; у вас настроен и вкл spi вы конфигурируете дма и включаете передачу а потом дергаете включаете SPI притом что он был на преведущей посылке включен в RM есть последовательность вы ее почти выполнили только та последовательность считает что spi выключен и не включена передача по дма .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 18:38 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
Почему только в прерываниях? Биты в регистре DMA_LIFCR - типа write only, запись 1 сбрасывает соотв.флаг, а запись 0 не влияет. Чтение этого регистра дает 0, так что ничего страшного не происходит, просто лишняя команда.
Выключать SPI не обязательно. Когда счетчик DMA-передач достигнет 0, SPI остановится. Тем более, что процедура выключения SPI тоже должна быть правильной - нужно ожидать BSY = 0, то есть, незанятости SPI.

Вообще, когда мне предстоит изучить работу с какой-то микросхемой, я как делаю - создаю пустой проект, и в нем, безо всего лишнего, изучаю работу с микросхемой. Затем, создаю пару файлов TDC7200_drv.c / TDC7200_drv.h, пишу в них все функции, полученные в результате отработки, ну и получаю готовый драйвер микросхемы. И эти файлы потом копирую в свой рабочий проект и прикручиваю уже отлаженный драйвер внутрь рабочего проекта.
Это я к тому, что когда разбираетесь с чем-то одним, старайтесь исключить всё остальное, что окажется лишним, мешающим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 19:08 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 559
Цитата:
в RM есть последовательность вы ее почти выполнили
Можете назвать страницу где это написано? Я почему то думал что spi сам отключается по завершению передачи данных через DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 19:26 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1951
SPI останавливается - это да. Потому что DMA останавливается по завершению счетчика. Но SPI не выключается.
Для rev.15 от июля 17-го года - начиная со стр. 898 и далее, рис. 259, 260


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 02 июл 2018, 22:25 
Заглядывает иногда

Зарегистрирован: 22 авг 2014, 12:29
Сообщения: 85
BusMaster писал(а):
Почему только в прерываниях? Биты в регистре DMA_LIFCR - типа write only, запись 1 сбрасывает соотв.флаг, а запись 0 не влияет. Чтение этого регистра дает 0, так что ничего страшного не происходит, просто лишняя команда.
Выключать SPI не обязательно. Когда счетчик DMA-передач достигнет 0, SPI остановится. Тем более, что процедура выключения SPI тоже должна быть правильной - нужно ожидать BSY = 0, то есть, незанятости SPI.

Потому что у TC он в прерывании :) Читает он не всегда 0 и если регистр на запись то не чего его читать . На счет выключения полностью согласен но тогда надо убрать строки включения в конце . И еще неправильно работа с DMA нельзя выполнять DMA2_Stream1->NDTR = sizeof(TDC7200); // счетчик сколько передать данных
DMA2_Stream1->PAR = (uint32_t)(&(SPI4->DR));
DMA2_Stream1->M0AR = (unsigned int)&TDC7200;
пока EN = 1 . Отключение DMA происходит не мгновенно там надо ставить задержку . и while в прерываниях тоже нельзя . while( !(SPI4->SR) & SPI_FLAG_TXE );
while( SPI4->SR & SPI_FLAG_BSY);


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB