Инициализация I2C, согласно даташиту и найденным примерам
Код: Выделить всё
// Initialize I2C Interface
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN | RCC_APB1ENR_PWREN;
I2C1->CR1 &= ~I2C_CR1_PE;
GPIOF->MODER |= _VAL2FLD(GPIO_MODER_MODER6, 0x2);
GPIOF->OTYPER |= GPIO_OTYPER_OT_6; // Set OD
GPIOF->PUPDR |= _VAL2FLD(GPIO_PUPDR_PUPDR6, GPIO_PuPd_NOPULL);
GPIOF->OSPEEDR |= _VAL2FLD(GPIO_OSPEEDR_OSPEEDR6, GPIO_Speed_Level_2);
GPIOF->MODER |= _VAL2FLD(GPIO_MODER_MODER7, 0x2);
GPIOF->OTYPER |= GPIO_OTYPER_OT_7; // Set OD
GPIOF->PUPDR |= _VAL2FLD(GPIO_PUPDR_PUPDR7, GPIO_PuPd_NOPULL);
GPIOF->OSPEEDR |= _VAL2FLD(GPIO_OSPEEDR_OSPEEDR7, GPIO_Speed_Level_2);
I2C1->CR1 |= I2C_CR1_SWRST;
asm("nop");
I2C1->CR1 &= ~I2C_CR1_SWRST;
asm("nop");
I2C1->TIMINGR|=(1 << 28)|(4<<20)|(2<<16)|(0xf<<8)|(0x13); //конфигурируем тайминги
I2C1->CR1 |= I2C_CR1_PE;Но при начале передачи, сразу вываливается флаг BUSY в ISR и висит неопределенное время.
Код: Выделить всё
uint16_t SADD = 0x48; //Slave address
uint16_t NBYTES = 0x1; //Slave address
I2C1->CR2 = (NBYTES<<16) | I2C_CR2_RD_WRN | (SADD << 1);
while ((I2C1->ISR & I2C_ISR_TXE) == 0); //while TXE ==0, buffer is full
I2C1->CR2 |= I2C_CR2_START;
while ( (I2C1 -> ISR & I2C_ISR_TXIS) == 0);
Подскажите, плиз, куда копать?
Добавлено after 3 hours 4 minutes 50 seconds:
Уже система вырисовывается. Пока пост на форуме не напишу не разберусь))
Грабли сильно ударили по башке. Читаю мануал, а там на пинах PF6 и PF7 I2C1 для версий с 6-кой, а у меня 8-ка - I2C2. Поменял инициализацию на второй I2C вроде зашевелилось. Блииин....