Jump to content

    

Nosaer

Свой
  • Content Count

    105
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Nosaer

  • Rank
    Частый гость
  • Birthday 01/01/1950

Recent Profile Visitors

3335 profile views
  1. Arlleex, большое спасибо. // if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) // { // if ((((uint32_t)pData) & 1U) != 0U) // { // return HAL_ERROR; // } // } Решило всю проблему, МК и в самом деле автоматически подстраивается
  2. 1) STM32G071 2) Размер буфера взят с большим запасом. В прерывании по простою вычисляю сколько данных пришло. 3) Я понимаю, что нельзя и почему. Но надеялся, что есть какого то рода обходные пути, чтоб как можно меньше исправлять уже в существующей программе. Как вариант нашел это: https://blog.ghmit.com.au/2019/09/stm32-9-bit-uart-halerror.html Но пока разбираюсь и не совсем понимаю как это реализовать.
  3. Доброго времени суток. UART работает в 9 битном режиме. Девятый бит мне как таковое не интересен, поэтому я его всегда отбрасываю и собираю данные в 8 битный буфер. При запуске DMA на прием данных: uint8_t Data[BUFFER_SIZE] = {0}; HAL_UART_Receive_DMA(BKI_UART, &Data[Index], BUFFER_SIZE); В тех случаях когда Index нечетное значение, получаю HAL_ERROR HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter should be aligned on a u16 frontier, as data copy from RDR will be handled by DMA from a u16 frontier. */ if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { if ((((uint32_t)pData) & 1U) != 0U) { return HAL_ERROR; } } Собственно вопрос, можно ли как то это обойти?
  4. Извиняюсь, за долгий ответ. Как писал выше, проблемы выскакивают далеко не сразу. Поэтому понадобилось много времени, чтоб опробовать ваши советы. Не выставляется мастером. Хотя я больше склоняюсь, что ведомый удерживает линию. Сначала использовал HAL. После того, как столкнулся с проблемой переписал все на CMSIS. Проблема осталась та же. Поэтому исходник я в какой то степени исключил. Плюс у меня есть проекты на МК F0 и F1 серии, и там я тоже использую I2C и подобных проблем у меня нет. Питание слейвов отключаю. Делаю сброс как в вашем первом сообщении. В итоге на 2 или 3 измерении показаний опять зависает в том же месте. Опять делаю сброс. Опять хватает на 2-3 измерения и опять зависает. Итого после примерно 20 сбросов, начинает работать. Через сколько опять зависнет остается загадкой. Сейчас пробую второй предложенный вами способ. Тактировать линию, пока ведомый не отпустит SDA. Собственно мой код, где я выставляю Nak при чтении for(register uint16_t Counter = 0; Counter < Size; Counter++) { if(Counter < (Size-1)) { EmergencyCycleCounter = 0; while(!READ_BIT(I2C1->SR1, I2C_SR1_RXNE)) { EmergencyCycleCounter++; if(EmergencyCycleCounter > 1000) break; } pData[Counter] = READ_BIT(I2C1->DR, I2C_DR_DR); } else { CLEAR_BIT(I2C1->CR1, I2C_CR1_ACK); SET_BIT(I2C1->CR1, I2C_CR1_STOP); EmergencyCycleCounter = 0; while(!READ_BIT(I2C1->SR1, I2C_SR1_RXNE)) { EmergencyCycleCounter++; if(EmergencyCycleCounter > 1000) break; } pData[Counter] = READ_BIT(I2C1->DR, I2C_DR_DR); } }
  5. Доброго времени суток. К МК подключено 2 микросхемы, с которыми он общается по средствам I2C. Запрос к обеим идет раз в секунду В процессе работы прилетает два типа косяков, которые могут себя проявить как через 10 часов работы, так и через 30. Поймать их отладчиком или анализатором довольно проблемно. При первом я просто получаю единоразово не корректные данные. При втором косяке полное зависание шины I2C. При первом косяке регистры: CR1 = 0x201 , SR1 = 0, SR2 = 0x03 При втором косяке регистры: CR1 = 0x301 , SR1 = 0x200, SR2 = 0x02 Случай с полным зависанием, удалось поймать анализатором пару раз. Видно, что не выставляется NAK по окончанию передачи и линия SDA остается прижатой к земле. В ерата на этот контроллер есть пункт 2.4.2, где описывается схожая проблема. Рекомендуют проводить Reset I2C. Но здесь или я чего не так делаю, или проблема не совсем та. В общем проблема никуда не уходит Возможно кто то сталкивался с таким или у кого есть мысли по решению проблемы?! Так же интересует каков правильный алгоритм для сброса I2C.
  6. Всем большое спасибо. Проблема была в том, что при инициализации не выставлялся бит UDE в DIER.
  7. Я пока не использую АЦП. А просто пытаюсь считать любой порт, где заведомо подал сигналы на некоторые выводы.
  8. DMA менял в кубе. Контроллер STM32F407 С шимом проблем нет, в этом плане все работает. Пробовал считывать все порты, во всех случаях вижу только 0xFF. У меня больше подозрений на запуск: HAL_DMA_Start(&hdma_tim4_up, (uint32_t)&PORT_ADC->IDR, &TestDMA[0], 100); Возможно не так запускаю или не то использую. Пробовал так же HAL_DMA_Start_IT(&hdma_tim4_up, (uint32_t)&PORT_ADC->IDR, &TestDMA[0], 100); Результата тоже не дало
  9. Xenia, тактирование и запуск прерываний прописан в MX_DMA_INIT, как и написал HardEgor. static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA interrupt init */ /* DMA2_Stream5_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn); } Хандлер для их приема тоже автоматически сгенерирован кубом. П.С. Как я уже писал выше, заменил DMA1 на DMA2.
  10. Да вы правы, мне уже подсказали это. И я заменил DMA1 на DMA2, но это не помогло.
  11. День добрый Есть внешний параллельный АЦП, который я тактирую шимом одного из таймеров(STM32F4), вручную забирая данные с порта к которому подключен АЦП. Возникло желание использовать для этих целей DMA. ШИМ настроен на: TIM4 - Channel 4 - PWM Generation CH4 Добавил DMA Событие: TIM4_UP Направление передачи: Периферия - Память Инкрементируется адрес памяти Собственно инициализация в кубе: __HAL_RCC_GPIOB_CLK_ENABLE(); /**TIM4 GPIO Configuration PB9 ------> TIM4_CH4 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); __HAL_RCC_TIM4_CLK_ENABLE(); /* TIM4 DMA Init */ /* TIM4_UP Init */ hdma_tim4_up.Instance = DMA1_Stream6; hdma_tim4_up.Init.Channel = DMA_CHANNEL_2; hdma_tim4_up.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_tim4_up.Init.PeriphInc = DMA_PINC_DISABLE; hdma_tim4_up.Init.MemInc = DMA_MINC_ENABLE; hdma_tim4_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_tim4_up.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_tim4_up.Init.Mode = DMA_NORMAL; hdma_tim4_up.Init.Priority = DMA_PRIORITY_VERY_HIGH; hdma_tim4_up.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_tim4_up) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_UPDATE],hdma_tim4_up); Запускаю ШИМ, запускаю DMA: HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4); HAL_DMA_Start(&hdma_tim4_up, (uint32_t)&PORT_ADC->IDR, &TestDMA[0], 100); На выходе имею пустой массив Опирался на AN4666, но что то делаю не так Укажите пожалуйста на ошибку
  12. Другие MicroSD я пробовал, проблема та же. Через SDIO на прямую я спокойно работаю с картой, могу считывать все ее параметры, записывать, считывать. Тоже самое в принципе и с FATFS, кроме функции форматирования. Карт SD, под рукой к сожалению пока нет. haker_fox, моего уровня знаний пока не достаточно чтобы прицепить FATFS самостоятельно. Если бы у меня сейчас получилось инициализировать все с помощью куба, чтобы все конкретно заработало. Я бы со временем с этими настройками все переписал бы под себя. Как в принципе я поступаю со всей другой периферией: освоил на HAL, посмотрел как все инициализируется, посмотрел как все работает, перехожу на CMSIS. Во всяком случае для меня, это на много упрощает освоение STM.
  13. Здравствуйте. МК зависает при вызове функции: f_mkfs("", FM_FAT32, 0, work, sizeof work); Зависает в функции HAL_SD_WriteBlocks, в этом цикле: while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR)) Монтирование, создание файлов и запись в них выполняется нормально, но с форматированием проблема. Пробовал всевозможные файловые системы, в половине случае так же зависает, в половине возвращает: FR_INVALID_PARAMETER Пробовал разные MicroSD, результат везде один. Где то год назад я уже пробовал работать с MicroSD, и тогда никаких проблем у меня не возникало. Возможно причина связана с новым обновлением CubeMX или с тем, что в CubeMX в настройках FATFS появился пункт BSP (Detect_SDIO) Возможно кто то сталкивался с подобным и подскажет решение МК: STM32F4 Проект генерирую в кубе Связка FATFS+SDIO
  14. ivan24190, Большое спасибо, помогло.