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(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト