Problema al inicializar la interrupción SPI TX en STM32F103

Estoy tratando de establecer una comunicación SPI de maestro a esclavo. Puedo enviar bytes al esclavo y ahora estoy tratando de enviar cuando se activa la interrupción de TX.

A continuación se muestra el código que utilicé para el lado maestro, en STM32F103;

void spi_init() {
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    SPI_I2S_DeInit(SPI2);
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
    SPI_Init(SPI2, &SPI_InitStructure);
    SPI_Cmd(SPI2, ENABLE);
    SPI_CalculateCRC(SPI2, DISABLE);
    SPI_SSOutputCmd(SPI2, DISABLE);

    SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
    SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, ENABLE);
}

void SPI2_IRQHandler(void) {
    if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) == SET) {
        //Send from buffer
        SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_TXE);
    }

    if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET) {
        //Receive
        SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_RXNE);
    }
}

El problema es que el programa siempre falla dentro de la función spi_init(). Cuando comento el comando NVIC_Init y el comando SPI_I2S_ITConfig (SPI2, SPI_I2S_IT_TXE, ENABLE), no fallará. Pero simplemente no funcionará con los dos juntos.

Cualquier ayuda sobre lo que está causando el problema es apreciada.

Respuestas (1)

Se está atascando en su controlador de interrupciones porque está tratando de borrar el indicador TXE 'manualmente' y esto no funciona.

El indicador TXE está ahí para indicarle que el módulo SPI está listo para que cargue otro byte en su registro de transmisión, y el acto de cargar este byte es lo que borra el indicador TXE.

Si no tiene más datos para enviar, debe deshabilitar esta interrupción hasta el momento en que desee enviar más datos.