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

Nosaer

Свой
  • Постов

    108
  • Зарегистрирован

  • Посещение

Весь контент Nosaer


  1. Здравствуйте. т.е. у меня есть проект, который без проблем работает со всевозможными NAND флешками типа SLC. При попытке заменить SLC память на MLC или TLC, максимум что могу ID сосчитать. Стирание/чтение/запись уже не работают. т.к. MLC и TLC медленнее. тайминги увеличил, но не помогло. Судя по даташитам, набор команд у них примерно одинаковый. Есть ли какие то нюансы(разница) при работе с SLC или TLC памятью?
  2. Спасибо, за рекомендации. Что то я на самом деле упустил момент с параллельным включением.
  3. День добрый. Пытаюсь найти малогабаритный NTC термистор, который при 25 градусах имел бы сопротивление 0-300 Ом, а при низких температурах чтоб сопротивление было от 5кОм и выше т.е. нужны экземпляры с довольно крутой R/T характеристикой. из того, что нахожу либо при отрицательных температурах не выше 1кОм, либо при положительных температурах кОмы Возможно кто то использует что то подобное или сталкивался с такими.
  4. Arlleex, большое спасибо. // if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) // { // if ((((uint32_t)pData) & 1U) != 0U) // { // return HAL_ERROR; // } // } Решило всю проблему, МК и в самом деле автоматически подстраивается
  5. 1) STM32G071 2) Размер буфера взят с большим запасом. В прерывании по простою вычисляю сколько данных пришло. 3) Я понимаю, что нельзя и почему. Но надеялся, что есть какого то рода обходные пути, чтоб как можно меньше исправлять уже в существующей программе. Как вариант нашел это: https://blog.ghmit.com.au/2019/09/stm32-9-bit-uart-halerror.html Но пока разбираюсь и не совсем понимаю как это реализовать.
  6. Доброго времени суток. 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; } } Собственно вопрос, можно ли как то это обойти?
  7. Извиняюсь, за долгий ответ. Как писал выше, проблемы выскакивают далеко не сразу. Поэтому понадобилось много времени, чтоб опробовать ваши советы. Не выставляется мастером. Хотя я больше склоняюсь, что ведомый удерживает линию. Сначала использовал 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); } }
  8. Проблема с I2C в STM32F4

    Доброго времени суток. К МК подключено 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.
  9. Всем большое спасибо. Проблема была в том, что при инициализации не выставлялся бит UDE в DIER.
  10. Я пока не использую АЦП. А просто пытаюсь считать любой порт, где заведомо подал сигналы на некоторые выводы.
  11. 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); Результата тоже не дало
  12. 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.
  13. Да вы правы, мне уже подсказали это. И я заменил DMA1 на DMA2, но это не помогло.
  14. Данные с порта в память(DMA)

    День добрый Есть внешний параллельный АЦП, который я тактирую шимом одного из таймеров(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, но что то делаю не так Укажите пожалуйста на ошибку
  15. Другие MicroSD я пробовал, проблема та же. Через SDIO на прямую я спокойно работаю с картой, могу считывать все ее параметры, записывать, считывать. Тоже самое в принципе и с FATFS, кроме функции форматирования. Карт SD, под рукой к сожалению пока нет. haker_fox, моего уровня знаний пока не достаточно чтобы прицепить FATFS самостоятельно. Если бы у меня сейчас получилось инициализировать все с помощью куба, чтобы все конкретно заработало. Я бы со временем с этими настройками все переписал бы под себя. Как в принципе я поступаю со всей другой периферией: освоил на HAL, посмотрел как все инициализируется, посмотрел как все работает, перехожу на CMSIS. Во всяком случае для меня, это на много упрощает освоение STM.
  16. Зависает в f_mkfs (STM32)

    Здравствуйте. МК зависает при вызове функции: 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
  17. ivan24190, Большое спасибо, помогло.
  18. На данном этапе мне удобнее производить всю инициализацию на HAL. Постепенно осваиваю CMSIS, т.к. некоторые функции от HAL выполняются очень долго и то что освоил пробую писать на CMSIS. Поэтому пока такая мусорка)) Штатными функциями HAL принудительно изменить значение регистра CNT тоже не получилось.
  19. // Изначальная инициализация: static void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 24999; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 68399999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim2); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); } // Перезапуск с другими условиями RCC -> APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2 -> CR1 |= TIM_CR1_URS; TIM2 -> CNT = 0x112233; TIM2 -> ARR = 0x334455; TIM2 -> EGR |= TIM_EGR_UG; TIM2 -> SR &= ~TIM_SR_UIF; TIM2 -> DIER |= TIM_DIER_UIE; NVIC_EnableIRQ(TIM2_IRQn); TIM2 -> CR1 |= TIM_CR1_CEN; МК STM32F4
  20. Считываю по UART значение. Таймер на момент считывания значения CNT, даже не запущен. После запуска, считать начинает с 0.
  21. Не обновляется регистр CNT

    Добрый день. Хочу занести свое значение в регистр CNT: TIM2 -> CNT = 0x112233; TIM2 -> ARR = 0x334455; TIM2 -> EGR |= TIM_EGR_UG; С ARR проблем никаких нет, он обновляется и значение остается тем, которое я задал. CNT по началу принимает заданное значение, но буквально через пару тактов после TIM2 -> EGR |= IM_EGR_UG; сбрасывается опять в 0
  22. Добюрый день. Использую Atmega8u2 и библиотеку LUFA(Virtual COM Port) Подскажите пожалуйста как настроить обработку прерывания на прием данных от хоста. Что то я окончательно запутался в настройках USB. Чтобы не проверять постоянно CDC_Device_BytesReceived() и CDC_Device_ReceiveByte() А по прерыванию, запускать CDC_Device_ReceiveByte и уже потом обрабатывать полученные данные.
  23. На STM32 так и не смог подключить Mass Storage девайс. Писать на карту могу, и чисто по SDIO и используя FatFS. А чтоб определялось на ПК как внешний накопитель так и не смог реализовать. Поэтому и поглядываю в сторону уже более готовых решений.
  24. День добрый Подскажите какой нибудь проверенный (не шибко навороченный) контроллер USB-SDIO. На вроде тех, что используются в кардридерах. С помощью МК пишу в MicroSD, а затем хочу через USB извлекать данные с этой MicroSD.
×
×
  • Создать...