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

PadenieShtanov

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. А как возможно прерывание TXIS без предварительного прерывания ADDR?
  2. Я думал, что этими операциями сбрасываю флаг прерывания, имею на это основания, так как убрав, например I2C2->ICR |= I2C_ICR_ADDRCF, коммуникация прекращается и висит флаг ADDR
  3. Совсем забыл, речь об мк stm32g030c6 Пытаюсь поскорее слезть с халовской иглы, как видите пока на полпути), а МК stm32g030c6
  4. Пытаюсь разобраться с коммуникацией по I2C, есть плата, которая шлёт мне 16 байт, и в ответ ожидает от меня 3 байта, с обработкой пришедших байт всё нормально, однако при отправке, байты отправляются в неправильном порядке, я ожидаю, что байты уйдут в последовательности 0x01 0x02 0x03, сижу битый час безрезультатно, возможно кто-то может подсказать в чём ошибка. Мой обработчик прерываний I2C: void I2C2_IRQHandler(void) { /* USER CODE BEGIN I2C2_IRQn 0 */ TXBUF[0] = 0x01; TXBUF[1] = 0x02; TXBUF[2] = 0x03; /* USER CODE END I2C2_IRQn 0 */ if(I2C2->ISR & I2C_ISR_RXNE) { BUF[CNT] = I2C2->RXDR; CNT++; } if(I2C2->ISR & I2C_ISR_ADDR) { CNT=0; TXCNT=0; I2C2->ICR |= I2C_ICR_ADDRCF; } if(I2C2->ISR & I2C_ISR_STOPF) { I2C2->ICR |= I2C_ICR_STOPCF; } if(I2C2->ISR & I2C_ISR_NACKF) { I2C2->ICR |= I2C_ICR_NACKCF; } if(I2C2->ISR & I2C_ISR_TXIS) { if(TXCNT >= 3) { I2C2->CR2 |= I2C_CR2_STOP; } else { I2C2->TXDR = TXBUF[TXCNT]; TXCNT++; } } /* USER CODE BEGIN I2C2_IRQn 1 */ /* USER CODE END I2C2_IRQn 1 */ } Инициализация I2C: void MX_I2C2_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_I2C2_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF6_I2C2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); CLEAR_BIT(I2C2->CR1, I2C_CR1_PE); I2C2->TIMINGR = 0x0010061A; I2C2->OAR1 &= ~I2C_OAR1_OA1EN; I2C2->OAR1 |= (I2C_OAR1_OA1EN | 0x78); I2C2->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK); I2C2->CR1 |= I2C_CR1_PE; I2C2->CR1 |= I2C_CR1_RXIE; I2C2->CR1 |= I2C_CR1_STOPIE; I2C2->CR1 |= I2C_CR1_NACKIE; I2C2->CR1 |= I2C_CR1_TXIE; I2C2->CR1 |= I2C_CR1_ADDRIE; NVIC_EnableIRQ(I2C2_IRQn); NVIC_SetPriority(I2C2_IRQn,0); } То, что уходит по шине
  5. Приветствую, столкнулся с проблемой при записи данных с АЦП, посредством библиотеки FATFS на SD карту. Данные с АЦП формируются в массив, после чего последовательностью функций f_mount, f_open, f_write записываются на SD карту, однако иногда функция f_write возвращает результат FR_INVALID_OBJECT и запись прерывается. Копнув глубже увидел что такой статус появляется из за того, что функция HAL_SD_GetCardState возвращает странный статус HAL_SD_CARD_SENDING, который описан как sd card is sending operation information. Большего описания нигде не нашел. Проблема исчезает посредством увеличения делителя частоты тактирования SDIO, что в свою очередь значительно режет скорость передачи созданного файла с данными на пк посредством USB HS, с чем вроде можно и свыкнуться, но хотелось бы разобраться в чём причина. Возможно кто-то сталкивался с подобной проблемой и может помочь.
×
×
  • Создать...