STM32F207 голый металлический SPI RXNE и TXE не работают?

#arm #stm32 #spi

#рука #stm32 #spi

Вопрос:

Мне нужно связаться с микросхемой eeprom (25lc1024) через SPI. Я могу заставить следующий код работать, но мне приходится прибегать к задержкам не только из-за флагов. В противном случае я вижу в области видимости, что он не ждет, пока все биты будут сдвинуты, и продолжает работу. Есть какие-нибудь идеи, почему флаги не останавливают это?

 void  Init_SPI(void){
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;   // enable SPI clock

    GPIOA->AFR[0] |= SET_AFL_A_FOR_SPI1;
    GPIOB->AFR[0] |= SET_AFL_B_FOR_SPI1;

    SPI1_NSS = DESELECT_CHIP;            // set the SS pin high
    
    // initialize the SPI configuration register
    SPI1->CR1  =  SPI_CR1_MSTR  // SPI master mode
                | SPI_CR1_BR_1; // 010 bit rate prescale /8 (60MHz/8 = 7.5MHz)
    SPI1->CR2  =    SPI_CR2_SSOE;
    
    SPI1->CR1  |= SPI_CR1_SPE;  // enable SPI
}

unsigned int eeprom_read(unsigned long address, unsigned int chars_to_read)
{
    char temp;
    unsigned int result = 0;


    SPI1_NSS = SELECT_CHIP;                         // set the SS pin low
    SPI1->DR = READ_FROM_SPI;                       // send data out SPI
    while( !(SPI1->SR amp; SPI_SR_TXE) );              // wait until transmit buffer empty

    SPI1->DR = (address amp; 0xFF0000) >> ADJ16;   // send data out SPI
    while( !(SPI1->SR amp; SPI_SR_TXE) );              // wait until transmit buffer empty
    SPI1->DR = (address amp; 0x00FF00) >> ADJ8;    // send data out SPI
    while( !(SPI1->SR amp; SPI_SR_TXE) );              // wait until transmit buffer empty
    SPI1->DR = (address amp; 0x0000FF);                    // send data out SPI
    while( !(SPI1->SR amp; SPI_SR_TXE) );              // wait until transmit buffer empty

    delay();
    temp = SPI1->DR;
    SPI1->DR = DUMMY_8BIT;                    // send dummy 8 bits to generate clock
    chars_to_read--;

    while( !(SPI1->SR amp; SPI_SR_RXNE) );             // wait until receive buffer is not empty
    
    //USART2->DR = SPI1->DR;
    result = SPI1->DR;
    
    if(chars_to_read != 0){
        while((SPI1->SR amp; SPI_SR_RXNE) );               // wait until receive buffer is empty
        delay();
        SPI1->DR = DUMMY_8BIT;                    // send dummy 8 bits to generate clock
        
        //delay();
        while( !(SPI1->SR amp; SPI_SR_TXE) );              // wait until transmit buffer is empty
        while( !(SPI1->SR amp; SPI_SR_RXNE) );             // wait until receive buffer is not empty
        temp = SPI1->DR;
        result = (result*256)   temp;
        chars_to_read--;
    }
    
    delay();
    SPI1_NSS = DESELECT_CHIP;                                   // set the SS pin high
    
    return resu<
}

static void delay(void)
{
    unsigned int j = FALSE;
    for (j = 0; j < 25; j  ) {
    }
}

 

Комментарии:

1. RXNE и TXE — это флаги, определяющие состояние буфера . Как только начнется передача первого бита, TXE повысится, поскольку буфер уже способен принять следующий байт. Это хорошо для уменьшения пауз между байтами. В некоторых случаях вам нужно будет вместо этого установить флажок BSY.