Пытаюсь настроить тачскрин STMPE811 на STM32f429 discovery.
При отладке программы происходит зависание то на while(!(I2C3->SR1 & I2C_SR1_SB)) то while (!(I2C3->SR1 & I2C_SR1_ADDR)) и постоянно начинает виснуть при открывании списка регистров I2C3 где можно посмотреть их значения. Если отладка проходит дальше то зависание происходит при чтении ID микросхемы x[0] = I2C3->DR. Считывается 8 и зависает. Когда покупал плату тестовая программа работала нормально и тачскрин в том числе . Не могу понять в чем проблема? Правильно ли настроил I2C3 ?
void TFTLCD_I2C3_Init(void){
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
RCC->APB1ENR |= RCC_APB1ENR_I2C3EN;
GPIOC->MODER &= ~(GPIO_MODER_MODER9);
GPIOA->MODER &= ~(GPIO_MODER_MODER8);
GPIOC->MODER |= (GPIO_MODER_MODER9_1); //режим альтернативных функций
GPIOA->MODER |= (GPIO_MODER_MODER8_1); //режим альтернативных функций
GPIOC->OTYPER |=(GPIO_OTYPER_OT_9); //открытый сток
GPIOA->OTYPER |=(GPIO_OTYPER_OT_8); //открытый сток
GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEED8_1); //определяет частоту переключения выхода
GPIOC->OSPEEDR |= (GPIO_OSPEEDR_OSPEED9_1); //определяет частоту переключения выхода
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD8); //определяет подтяжку вывода |= 0;
GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPD9); // определяет подтяжку вывода
GPIOA->AFR[1] |= 4;
GPIOC->AFR[1] |= (4<<(4*1));
I2C3->CR1 &= ~I2C_CR1_SMBUS; //настраиваем модуль в режим I2C
I2C3->CR2 &= ~I2C_CR2_FREQ; //указываем частоту тактирования модуля
I2C3->CR2 |= 45;
I2C3->CCR &= ~I2C_CCR_CCR; //задаем частоту работы модуля SCL по формуле
I2C3->CCR |= 225; //45000000(45MHz)/(2*100000(100KHz))=225
I2C3->CCR &= ~(I2C_CCR_FS | I2C_CCR_DUTY); //конфигурируем I2C, standart 100 KHz tlow/thigh = 2
I2C3->TRISE = 46; //(1000nS/22nS)+1 Standart_Mode = 1000nS, Fast_Mode = 300nS, 1/45MHz = 22nS
I2C3->OAR1 = 0x41;
I2C3->CR1 |= I2C_CR1_PE; //включаем модуль
}
void STMPE811_read_byte(){
I2C3->CR1 |= I2C_CR1_START; // Start bit
while(!(I2C3->SR1 & I2C_SR1_SB)); // ожидается готовность
(void) I2C3->SR1;
I2C3->DR = 0x82; // передается адреса устройства
while (!(I2C3->SR1 & I2C_SR1_ADDR)); // Ожидаем окончание передачи адреса
while((I2C3->SR2 & I2C_SR2_TRA)==0);
(void) I2C3->SR1;
(void) I2C3->SR2;
I2C3->DR = 0x00;
while (!(I2C3->SR1 & I2C_SR1_TXE));
I2C3->CR1 |= I2C_CR1_START; // Restart bit
while(!(I2C3->SR1 & I2C_SR1_SB));
I2C3->DR = 0x82|1;
while (!(I2C3->SR1 & I2C_SR1_ADDR));
while((I2C3->SR2 & I2C_SR2_TRA)==1);
I2C3->CR1 |= I2C_CR1_ACK;
while( (I2C3->SR1 & I2C_SR1_RXNE)==I2C_SR1_RXNE ){}
x[0] = I2C3->DR; //Считываем регистр в массив
while((I2C3->SR1,I2C_SR1_RXNE)==0){}
x[1] = I2C3->DR; //Считываем регистр в массив
I2C3->CR1 |= I2C_CR1_STOP; // Формирование сигнала "Стоп"
}