Перейти к содержанию
    

STM32F103..., SPI передача через DMA, проблема с CS

22 часа назад, mitya1698 сказал:

так как spi синхронный, то окончание приема означает как раз окончание передачи, они же по одному клоку работают.

мм, а это мысль...только прерывание ставить по RXNE предварительно очищенный и разрешенный по прерыванию DMA TC, до этого момента IT по буферу не нужно, если есть DMA. Может поэтому и не сделали TC_IT для SPI...в общем надо попробовать, у меня правда затык, чего-то проц странно работает, в отладке пошагово программа выполняется, но как только отпускаешь до брейкпоинта, например цикл чтобы прошел, уходит в хард, это походу контрофакт с алика экземпляр запаял. Но это так лирика - новый поставлю проверю.

Изменено пользователем auric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, auric сказал:

но как только отпускаешь до брейкпоинта, например цикл чтобы прошел, уходит в хард

Такты ожидания флеша для выбранной частоты правильно выставлены?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 часа назад, Сергей Борщ сказал:

Такты ожидания флеша для выбранной частоты правильно выставлены?

вроде да, эту часть программы пробовал на других проектах в том числе на таком же "камне", все запускалось.

Там еще к тому же периферия ввод/вывод тоже не работает (физически), все-таки предполагаю - как уже писал народ - сбойные толкнули и попался случайно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На F103 успешно работает вот такая конструкция ожидания завершения передачи последнего* байта:

	    *(volatile uint8_t *)&(SPI2->DR) = Data; // Складываем байт
    while (!(SPI2->SR & SPI_SR_TXE));  // Ждём, пока не станет "Свободно" в буфере передатчика (иначе можно проскочить)
    while (SPI2->SR & SPI_SR_BSY); // Только после этого дожидаемся снятия флага "ЗАНЯТО, Л-Л-ЛЯ!"
	

После этого данные гарантированно переданы и можно поднимать ножку. С DMA - можно использовать те же проверки, предварительно отключив сам DMA канал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 for (uint8_t i = 0; i < datalen; i++)
 {
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
   SPI_I2S_SendData(SPI2, data[i]);
 }
 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) != RESET);
 GPIO_WriteBit (GPIOB, GPIO_Pin_5, Bit_SET); // LE = 1
 GPIO_WriteBit (GPIOB, GPIO_Pin_5, Bit_RESET); // LE = 0

На 103 если без dma и прерываний я тоже так отправляю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, AlanDrakes said:

С DMA - можно использовать те же проверки, предварительно отключив сам DMA канал.

Как раз где-то недавно обсуждали эту тему. И выяснили, что всё это занимает время процессора. А если проект построен на базе ОСРВ, то это - открытое расточительство, противоречащее природе событийно-ориентированной модели. Пришли к выводу, что лучше взводить прерывание таймера на время чуть большее необходимого и расчитанного сброса флага BUSY. Там, в прерывании, выполнять необходимые действия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.11.2023 в 22:58, Сергей Борщ сказал:

Такты ожидания флеша для выбранной частоты правильно выставлены?

тааакс вечер перестает быть томным ((( не в проце было дело. Скинул проц, поставил другой симптомы те же, более того думал кварц не подхватился, запустил на HSI - те же симптомы, FLASH_Latency_2 выбирал, тк частота 72МГц на внешнем кварце либо 64МГц на внутреннем, пробовал понизить частоту на внутреннем и запустить на 32МГц с FLASH_Latency_1 тоже не получилось.

Еще раз опишу симптомы: не работает периферия, хотя регистр ODR вижу меняется, но нет подсветки светодиода, хотя он слабо горит так, как будто через подтягивающий резистор - хотя выход настроен как GPIO_Mode_Out_PP. Не хочет запускать циклы типа (улетает в хард фаулт, но если пошагово - то выполняет):

        for(temp=0; temp < MenuQnty; temp++)
        {
            prog_write_buffer[temp]=MEM[temp]; //где MEM - массив, записанный во флеше.
        }

Либо улетает в хард фаулт на настройке ком-порта (USART)...далее не забегал.

Изменено пользователем auric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, auric сказал:

Либо улетает в хард фаулт на настройке ком-порта (USART)...далее не забегал.

А цепь питания AVDD точно запитана? Мне однажды вместо ферритовой бусины туда запаяли идентичный по виду конденсатор и проц улетал в HardFault при попытке запустить PLL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Сергей Борщ сказал:

А цепь питания AVDD точно запитана? Мне однажды вместо ферритовой бусины туда запаяли идентичный по виду конденсатор и проц улетал в HardFault при попытке запустить PLL.

Проверю, спасибо за наводку.

ЗЫ: проверил, все запитано, да и отключал для проверки все что связано с АЦП, пытался оставить одну периферию - не работает как надо. Правда есть одно подозрение по поводу периферии...проверю...может это и не основной симптом, а как дополнительный, сам по себе...

Изменено пользователем auric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, auric сказал:

да и отключал для проверки все что связано с АЦП

От этого питания кормится не только АЦП, но и PLL и кое-что еще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Сергей Борщ сказал:

От этого питания кормится не только АЦП, но и PLL и кое-что еще.

Понял, как уже писал с питанием все ОК, а с периферией самым нелепым образом совпало, что пин на который поставил тестовый светодиод PA15 имеет функцию после сброса JTDI, переопределил и светодиод ожил, НО проблемы не ушли, так вроде тестовая программа мигания светодиодом работает без проблем, но сложная (хотя многое уже опробовано было на другом камне более простом STM32F103CBT6) не хочет - все так же, когда заходит в цикл, почему-то улетает в хард, но пошагово выполняет. Кварц работает, запускал оба варианта на простой программе и HSE и HSI, короче странно все это...

Изменено пользователем auric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/4/2023 at 3:47 PM, auric said:

Еще раз опишу симптомы: не работает периферия, хотя регистр ODR вижу меняется, но нет подсветки светодиода, хотя он слабо горит так, как будто через подтягивающий резистор - хотя выход настроен как GPIO_Mode_Out_PP. Не хочет запускать циклы типа (улетает в хард фаулт, но если пошагово - то выполняет):

        for(temp=0; temp < MenuQnty; temp++)
        {
            prog_write_buffer[temp]=MEM[temp]; //где MEM - массив, записанный во флеше.
        }

temp, MenuQnty, prog_write_buffer, MEM - как объявлены ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, dimka76 сказал:

temp, MenuQnty, prog_write_buffer, MEM - как объявлены ?

temp локальная, MenuQnty, prog_write_buffer, MEM глобальные, собственно не в этом дело, убираю этот цикл, застревает в другом месте, вообще не мной описанные финкции, то в DMA_DeInit(DMA1_Channel2) как только попадает, даже шаг со входом в дебаге не помогает, то в SysTick_Config, короче я уже много пересмотрел, может Coocox так реагирует на смену камня с MD на HD, то ли что...пока не могу понять где кака. Если только какое-то прерывание срабатывает, необработанное. А кстати пока писал нашел - дописывал кучу прерываний в таблицу и в одном из них нашел отсутствие NVIC_Init(&NVIC_InitStructure); но опять мимо, все равно те же симптомы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...