Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Настройка SPI STM32F405

Вт май 19, 2020 16:13:17

Всем привет. Столкнулся с проблемой при использовании SPI. После отправки байта не устанавливается флаг TXE. Возможно отправка вообще не происходит, нет осциллографа, чтобы проверить. Проверьте пожалуйста код, если кому не сложно, может я там что то упустил.
Код:
void SPI_INIT (void)
{
 RCC->AHB1ENR   |=      (1<<RCC_AHB1ENR_GPIOAEN_Pos);             
  RCC->AHB1ENR  |=      (1<<RCC_AHB1ENR_GPIOBEN_Pos);               
  RCC->APB2ENR  |=      (1<<RCC_APB2ENR_SPI1EN_Pos);
 
  GPIOA->MODER  |=      (0x01<<GPIO_MODER_MODER15_Pos);
  GPIOA->OSPEEDR|=      (0x03<<GPIO_OSPEEDR_OSPEED15_Pos);
 
  GPIOB->MODER  |=      (0x02<<GPIO_MODER_MODER3_Pos)
                |       (0x02<<GPIO_MODER_MODER4_Pos)
                |       (0x02<<GPIO_MODER_MODER5_Pos);
  GPIOB->OSPEEDR|=      (0x03<<GPIO_OSPEEDR_OSPEED3_Pos)
                |       (0x03<<GPIO_OSPEEDR_OSPEED5_Pos);
  GPIOB->AFR[0] |=      (0x05<<GPIO_AFRL_AFSEL3_Pos)
                |       (0x05<<GPIO_AFRL_AFSEL4_Pos)
                |       (0x05<<GPIO_AFRL_AFSEL5_Pos);
 
  SPI1->CR1     |=      (0x05<<SPI_CR1_BR_Pos)
                |       (1<<SPI_CR1_MSTR_Pos);
  SPI1->CR1     |=      (1<<SPI_CR1_SPE_Pos);
}

void SPI_WR(int data)
{
  while (1)
  {
    if (SPI1->SR & SPI_SR_TXE)
      break;
  }
  SPI1->DR = data;
  delay_us(10000);
  while (1)
  {
    if (SPI1->SR & SPI_SR_TXE)
      break;
  }
}
Ответить