STM32F030R8 и I2C на портах PF6, PF7

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
dolpheen
Родился
Сообщения: 2
Зарегистрирован: Ср дек 19, 2018 11:01:34

STM32F030R8 и I2C на портах PF6, PF7

Сообщение dolpheen »

Застрял в трех соснах.
Инициализация 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);
Вот где в строчке устанавливается флаг в START, всё, бесконечный цикл while.

Подскажите, плиз, куда копать?

Добавлено after 3 hours 4 minutes 50 seconds:
Уже система вырисовывается. Пока пост на форуме не напишу не разберусь))
Грабли сильно ударили по башке. Читаю мануал, а там на пинах PF6 и PF7 I2C1 для версий с 6-кой, а у меня 8-ка - I2C2. Поменял инициализацию на второй I2C вроде зашевелилось. Блииин....
Реклама
Ответить

Вернуться в «ARM»