Jump to content

    

Nosaer

Свой
  • Content Count

    102
  • Joined

  • Last visited

Everything posted by Nosaer


  1. Извиняюсь, за долгий ответ. Как писал выше, проблемы выскакивают далеко не сразу. Поэтому понадобилось много времени, чтоб опробовать ваши советы. Не выставляется мастером. Хотя я больше склоняюсь, что ведомый удерживает линию. Сначала использовал 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); } }
  2. Доброго времени суток. К МК подключено 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.
  3. Всем большое спасибо. Проблема была в том, что при инициализации не выставлялся бит UDE в DIER.
  4. Я пока не использую АЦП. А просто пытаюсь считать любой порт, где заведомо подал сигналы на некоторые выводы.
  5. 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); Результата тоже не дало
  6. 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.
  7. Да вы правы, мне уже подсказали это. И я заменил DMA1 на DMA2, но это не помогло.
  8. День добрый Есть внешний параллельный АЦП, который я тактирую шимом одного из таймеров(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, но что то делаю не так Укажите пожалуйста на ошибку
  9. Другие MicroSD я пробовал, проблема та же. Через SDIO на прямую я спокойно работаю с картой, могу считывать все ее параметры, записывать, считывать. Тоже самое в принципе и с FATFS, кроме функции форматирования. Карт SD, под рукой к сожалению пока нет. haker_fox, моего уровня знаний пока не достаточно чтобы прицепить FATFS самостоятельно. Если бы у меня сейчас получилось инициализировать все с помощью куба, чтобы все конкретно заработало. Я бы со временем с этими настройками все переписал бы под себя. Как в принципе я поступаю со всей другой периферией: освоил на HAL, посмотрел как все инициализируется, посмотрел как все работает, перехожу на CMSIS. Во всяком случае для меня, это на много упрощает освоение STM.
  10. Здравствуйте. МК зависает при вызове функции: 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
  11. ivan24190, Большое спасибо, помогло.
  12. На данном этапе мне удобнее производить всю инициализацию на HAL. Постепенно осваиваю CMSIS, т.к. некоторые функции от HAL выполняются очень долго и то что освоил пробую писать на CMSIS. Поэтому пока такая мусорка)) Штатными функциями HAL принудительно изменить значение регистра CNT тоже не получилось.
  13. // Изначальная инициализация: 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
  14. Считываю по UART значение. Таймер на момент считывания значения CNT, даже не запущен. После запуска, считать начинает с 0.
  15. Добрый день. Хочу занести свое значение в регистр CNT: TIM2 -> CNT = 0x112233; TIM2 -> ARR = 0x334455; TIM2 -> EGR |= TIM_EGR_UG; С ARR проблем никаких нет, он обновляется и значение остается тем, которое я задал. CNT по началу принимает заданное значение, но буквально через пару тактов после TIM2 -> EGR |= IM_EGR_UG; сбрасывается опять в 0
  16. Добюрый день. Использую Atmega8u2 и библиотеку LUFA(Virtual COM Port) Подскажите пожалуйста как настроить обработку прерывания на прием данных от хоста. Что то я окончательно запутался в настройках USB. Чтобы не проверять постоянно CDC_Device_BytesReceived() и CDC_Device_ReceiveByte() А по прерыванию, запускать CDC_Device_ReceiveByte и уже потом обрабатывать полученные данные.
  17. На STM32 так и не смог подключить Mass Storage девайс. Писать на карту могу, и чисто по SDIO и используя FatFS. А чтоб определялось на ПК как внешний накопитель так и не смог реализовать. Поэтому и поглядываю в сторону уже более готовых решений.
  18. День добрый Подскажите какой нибудь проверенный (не шибко навороченный) контроллер USB-SDIO. На вроде тех, что используются в кардридерах. С помощью МК пишу в MicroSD, а затем хочу через USB извлекать данные с этой MicroSD.
  19. Код скопировал скорее всего когда пробовал методом перебора добиться отсутствия ошибки, извиняюсь, не доглядел. В основном пытаюсь писать во флеш по даташиту. И как уже писал выше, куда только пробовал не писать. Сейчас заметил, что при включении оптимизации(а она у меня отключена), компилируется без ошибок. Но в память все равно не пишет.
  20. В плане адреса, согласно мануалу он существует. К тому же я практически методом перебора уже перепробовал всевозможные адреса
  21. Читал. Если я правильно понял, то ошибка обычно возникает когда значение IRAM меньше, чем на самом деле память у контроллера. В своем случае с 0x1000 поднимал до 0x5000 на вскидку, пробовал подставить адрес из нового диапазона. Ошибки все те же.
  22. Добрый день Пытаюсь записывать свои данные во Flash на STM32f0xx, при компиляции выдает кучу ошибок по типу: HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef EraseInitStruct; EraseInitStruct.PageAddress = 0x08004000; EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.NbPages = 1; uint32_t SectorError = 0; if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) { HAL_FLASH_Lock(); } HAL_FLASH_Unlock(); HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x08010000, AHReady); HAL_FLASH_Lock(); Пробовал менять адрес для записи, на разные области памяти. Ситуация вообще не меняется Собственно ругается на строки, где я передаю адрес для записи(стирания)
  23. Теперь все понял) Спасибо большое)
  24. /* SPI1 init function */ static void MX_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } Проинициалированно на 8 бит, и считываю по 8. Не совсем понял про 16 бит.