Problema al inicializar la interrupción SPI TX en STM32F103

3

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

A continuación se muestra el código que usé 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 se bloquea dentro de la función spi_init (). Cuando comento cualquiera el comando NVIC_Init y el comando SPI_I2S_ITConfig (SPI2, SPI_I2S_IT_TXE, ENABLE), no se bloqueará. Pero simplemente no funcionará con los dos juntos.

Se agradece cualquier ayuda sobre lo que está causando el problema.

    
pregunta ferrophile

1 respuesta

3

Se está atascando en su controlador de interrupciones porque está intentando 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 hecho de cargar este byte es lo que borra el indicador TXE.

Si no tiene más datos para enviar, debe desactivar esta interrupción hasta que desee enviar más datos.

    
respondido por el brhans

Lea otras preguntas en las etiquetas