PadenieShtanov
-
Постов
5 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные PadenieShtanov
-
-
5 минут назад, jcxz сказал:
Зачем вы везде читаете I2C2->ICR??? Ref.manual говорит, что этот регистр "write only".
Слезание стоит начать с чтения ref.manual-а. Судя по операциям с I2C2->ICR вы его ещё даже не открывали.
Я думал, что этими операциями сбрасываю флаг прерывания, имею на это основания, так как убрав, например I2C2->ICR |= I2C_ICR_ADDRCF, коммуникация прекращается и висит флаг ADDR
-
35 минут назад, jcxz сказал:
Чтобы вам могли ответить что-то вменяемое, СЛЕДУЕТ УКАЗЫВАТЬ О КАКОМ МК ИДЁТ РЕЧЬ!
Совсем забыл, речь об мк stm32g030c6
25 минут назад, tonyk_av сказал:Прикольная солянка из ХАЛа и прямой работы с регистрами. Уж пишите или на регистрах, указав МК, или на ХАЛе, чтоб было пофиг на тип МК.
Давно не встречал паскалевского стиля написания имён переменных заглавными буквами. Так-то в С другой стиль написания рекомендуют.
Пытаюсь поскорее слезть с халовской иглы, как видите пока на полпути), а МК stm32g030c6
-
Пытаюсь разобраться с коммуникацией по 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); }
То, что уходит по шине
-
Приветствую, столкнулся с проблемой при записи данных с АЦП, посредством библиотеки 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, с чем вроде можно и свыкнуться, но хотелось бы разобраться в чём причина. Возможно кто-то сталкивался с подобной проблемой и может помочь.
Проблема с передачей данных от слейва мастеру I2C STM32
в ARM, 32bit
Опубликовано · Пожаловаться
А как возможно прерывание TXIS без предварительного прерывания ADDR?