Пытаемся завести на данном проце термодатчик LM75.
Собственно до датчика дело не доходит. Не работает сам I2C.
Инициализация:
CODE
RCC->APB1ENR = RCC_APB1ENR_PWREN | RCC_APB1ENR_TIM2EN | RCC_APB1ENR_I2C1EN;
GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1;
//MODER 32 разрядный
// 00 - по умолчанию вход, 01(GPIO_MODER_MODER0_0) - выход, 10(GPIO_MODER_MODER0_1) - альтернативная функция
// 11(GPIO_MODER_MODER0) - аналоговый режим
GPIOA->AFR[1] |= 0x00000440;//здесь i2c
GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10;
//OTYPER 16 разрядный если 1(GPIO_OTYPER_OT_0) - открытый коллектор, а если 0 - обычный выход(по умолчанию)
GPIOA->PUPDR = GPIO_PUPDR_PUPDR9_0 | GPIO_PUPDR_PUPDR10_0;
//OPUPDR 32 разрядный
// 00 - без подтяжки(по умолчанию), 01(GPIO_PUPDR_PUPDR0_0) - подтяжка к "+", 10(GPIO_PUPDR_PUPDR0_1) - подтяжка к "-"
I2C1->CR1|=I2C_CR1_PE; //включить I2C
I2C1->CR1&=~I2C_CR1_PE; //выключить I2C
while(I2C1->CR1&I2C_CR1_PE); //ждём пока выключится I2C
//I2C1->TIMINGR|=(PRESC << 28)|(SCLL<<0)|(SCLH<<8)|(SCLDEL<<20)|(SDADEL<<16);
//PRESC=11, SCLL=199, SCLH=195, SCLDEL=4, SDADEL=2 это для 10кГц
//PRESC=11, SCLL=19, SCLH=15, SCLDEL=4, SDADEL=2 это для 100кГц
//PRESC=5, SCLL=9, SCLH=3, SCLDEL=3, SDADEL=3 это для 400кГц
//PRESC=5, SCLL=3, SCLH=1, SCLDEL=1, SDADEL=0 это для 1000кГц
I2C1->TIMINGR|=(11 << 28)|(199<<0)|(195<<8)|(4<<20)|(2<<16); //конфигурируем тайминги
I2C1->CR1|=I2C_CR1_PE; //включить I2C
I2C1->CR2 = I2C_CR2_AUTOEND | (1<<16) | I2C_CR2_RD_WRN | (0x90<<1);
Чтение температуры:
CODE
// LM75 address = 0x90
#define LM75_Addr 0x90
// Temperature Register of LM75
#define LM75_TEMP_Reg 0x00
uint16_t I2C_LM75_Temp_Read ( uint8_t addr )
{
uint16_t RegValue = 0;
// 1. Послать в LM75 адрес регистра - 0x00
// Конфигурирование адреса ведомого; количество байтов, которые будут запрограммированы (переданы); перезагрузки и генерировать старт
I2C_TransferHandling ( I2C1, addr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write );
// Подождите, пока ISR.TXIS флаг не будет установлен
// TXIS==1 - TXDR empty
while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_TXIS ) == RESET );
// Отправить адрес (LM75_TEMP_Reg)
I2C_SendData ( I2C1, LM75_TEMP_Reg );
// Подождите, пока ISR.TCR флаг не будет установлен
// TCR == 1 - Заданное кол-во байт передано
while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_TCR ) == RESET );
// 2. Читать ответ LM75
// Конфигурирование адреса ведомого; количество байтов, которые будут считаны; перезагрузки и генерировать старт
I2C_TransferHandling ( I2C1, addr, 2, I2C_Reload_Mode, I2C_Generate_Start_Read );
// ждать приёма байта
// ISR.RXNE == 1 - byte received
while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_RXNE ) == RESET );
RegValue = I2C_ReceiveData ( I2C1 );
RegValue <<= 8;
// ждать приёма байта
// ISR.RXNE == 1 - byte received
while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_RXNE ) == RESET );
RegValue |= I2C_ReceiveData ( I2C1 );
// Сгенерировать STOP
I2C_TransferHandling ( I2C1, addr, 0, I2C_Reload_Mode, I2C_Generate_Stop );
// Подождите, пока ISR.STOPF флаг не будет установлен
// STOPF == 1 - а шине действует STOP
while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_STOPF ) == RESET);
// Очистить флаг STOPF
// ICR.STOPF := 1 1 - очистка флага ISR.STOPF
I2C_ClearFlag ( I2C1, I2C_ICR_STOPCF );
return RegValue;
}
Результат - I2C труп полный, на осцилле обе ноги единицы (pull-up-ы 10кил). Ничего не шевелится

Кто-то с I2C на том проце работал? Он там вообще рабочий? Или я где-то ошибся?
В ДШ на ногах I2C PA9, PA10 есть странный коммент: "This alternate feature is available on standard dies only." Стандарт умер, да здравствует стандарт

Спасибо.