STM32CubeIDE 10 (SPI Slave with DMA)

SPI Slaveを使い通信します。
SPI Masterが角度を取得しにきます。
DMA転送させます。

SPI Slave with DMA

main.cpp

void
spi_slave_out( uint8_t *tx_buf, uint16_t len )
{
    uint8_t dummy_rx_buf[8] = {0};
    // static uint8_t dummy_rx_buf[8] = {0};

    /// without DMA

    // switch ( HAL_SPI_TransmitReceive(&hspi2, tx_buf, dummy_rx_buf, len, 10000) )
    // {
    //     case HAL_OK:
    //         break;
    //
    //     case HAL_TIMEOUT:
    //     case HAL_ERROR:
    //         error_type = SPI_ERROR;
    //         Error_Handler();
    //         break;
    //     default:
    //         break;
    // }

    /// with DMA

    if ( HAL_SPI_TransmitReceive_DMA(&hspi2, tx_buf, dummy_rx_buf, len) != HAL_OK )
    {
        error_type = SPI_ERROR;
        Error_Handler();
    }

    HAL_Delay(1);

    while ( spi_slave_state == SPI_SLAVE_WAIT )
    {
        sprintf( uart_message, "\r\n SPI SLAVE : NOT COMPLETE \r\n" );
        p_( uart_message );
        HAL_Delay(1);
    }

    switch ( spi_slave_state )
    {
        case SPI_SLAVE_COMPLETE :
            break;
        default :
            error_type = SPI_ERROR;
            Error_Handler();
            break;
    }
}

void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
  spi_slave_state = SPI_SLAVE_COMPLETE;
}

void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
{
  spi_slave_state = SPI_SLAVE_ERROR;
}

まとめ

処理負荷が低いときは良いのですが、負荷が高くなるとコールバックが呼ばれなくなっている動作に見えます。
次の転送が正しく行われるのに、状態が戻っていないように見えます。解析しないと。

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト




«       »