Jump to content

Leo

Members
  • Content Count

    135
  • Joined

  • Last visited

Community Reputation

-3 Плохой

About Leo

  • Rank
    Осваивающийся

Информация

  • Пол
    Мужчина
  • Город
    москва

Электроника

  • Стаж в электронике
    1-2 года
  1. Ради этого и задаю вопрос что не так. А знание Си приходит с опытом и пониманием. Я бы пожелал примеры Cmsis для лучшего понимания. А уж потом круговерть с библиотеками.
  2. Жаль что используется Cub!
  3. Пытаюсь настроить SDRAM но при записи по адресу заполняются сразу 4 ячейки через одну . Дальше заполняются 4 пропущенные ячейки через одну . И так по кругу 8 раз то первые то вторые ячейки заполняются новыми данными . А на 9 разе происходит переход и цикл повторяется. Если кто настраивал подскажите? Настройка частоты 180 мГц APB1=45мГц APB2=90мГц void SdRamNastroika (void){ uint32_t tmp; // Enable clock for FMC RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN; // Initialization step 1 FMC_Bank5_6->SDCR[0] = FMC_SDCR1_SDCLK_1 | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE_1; FMC_Bank5_6->SDCR[1] = FMC_SDCR1_NR_0 | FMC_SDCR1_MWID_0 | FMC_SDCR1_NB | FMC_SDCR1_CAS; // Initialization step 2 FMC_Bank5_6->SDTR[0] = TRC(7) | TRP(2); FMC_Bank5_6->SDTR[1] = TMRD(2) | TXSR(7) | TRAS(4) | TWR(2) | TRCD(2); // Initialization step 3 while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY); FMC_Bank5_6->SDCMR = 1 | FMC_SDCMR_CTB2 | (1 << 5); // Initialization step 4 for(tmp = 0; tmp < 10000000; tmp++); // Initialization step 5 while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY); FMC_Bank5_6->SDCMR = 2 | FMC_SDCMR_CTB2 | (1 << 5); // Initialization step 6 while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY); FMC_Bank5_6->SDCMR = 3 | FMC_SDCMR_CTB2 | (4 << 5); // Initialization step 7 while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY); FMC_Bank5_6->SDCMR = 4 | FMC_SDCMR_CTB2 | (1 << 5) | (0x231 << 9); // Initialization step 8 while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY); FMC_Bank5_6->SDRTR |= (683 << 1); while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY); for(tmp = SDRAM_START_ADR; tmp < (SDRAM_START_ADR + SDRAM_MEMORY_SIZE); tmp += 4)//0x00800000 0x00000000 (*(__IO uint32_t *)tmp) = 0x00000000; } void SDRAM_Write32(uint32_t value){ uint32_t tmp1 = 0xD0000000; *(__IO uint32_t*)tmp1 = value;//0xD15151FF tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD45783FF; tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD59256FF; tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD14748FF; tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD95317FF; tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD45786FF; tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD59256CF; tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD14749FF; tmp1+=4; *(__IO uint32_t*)tmp1 = 0xD95316FF; }
  4. Пытаюсь настроить тачскрин 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; // Формирование сигнала "Стоп" }
×
×
  • Create New...