Easyelectronics.ru

Электроника для всех
Текущее время: 16 ноя 2018, 12:51

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

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

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

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

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

Show


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


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

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


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

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

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


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

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


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

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


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

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2704
И можно и нужно)
Код прикладываю, аккурат для вашего чипа.
Использовать примерно так:
Код:
   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 Кб]
Скачиваний: 16
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stm32f429 SPI
СообщениеДобавлено: 26 июн 2018, 12:11 
Старожил

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


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

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


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

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


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

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

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


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


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

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


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

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

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

_________________
Потоковая OS


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

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


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

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


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

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


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

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


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

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


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

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 633
Цитата:
Лучше его отключить, используя 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
Сообщения: 2450
Этот бит работает диаметрально противоположно. Direct mode Disabled, если =1, то запрещен, если =0, то direct mode разрешен. То есть, в direct mode не используется FIFO.


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

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


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

Зарегистрирован: 22 авг 2014, 12:29
Сообщения: 117
В прерываниях нельзя использовать конструкцию типа 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
Сообщения: 2450
Почему только в прерываниях? Биты в регистре 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
Сообщения: 633
Цитата:
в RM есть последовательность вы ее почти выполнили
Можете назвать страницу где это написано? Я почему то думал что spi сам отключается по завершению передачи данных через DMA.


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

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


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

Зарегистрирован: 22 авг 2014, 12:29
Сообщения: 117
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 часов


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

Сейчас этот форум просматривают: Atomic-dm


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

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

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