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』![](https://www12.a8.net/0.gif?a8mat=356SUU+1823JM+407E+5YJRM)
さくらのレンタルサーバ
![](https://www19.a8.net/0.gif?a8mat=2ZN7UA+4P34KY+D8Y+67RK2)
ムームードメイン
![](https://www16.a8.net/0.gif?a8mat=2ZN7UA+4UG10Y+348+1BNBJM)
Oisix(おいしっくす)
![](https://www17.a8.net/0.gif?a8mat=35H9RO+40OCS2+3RK+2T8BZM)
らでぃっしゅぼーや
![](https://www17.a8.net/0.gif?a8mat=35H9RT+5I9D82+1YGO+1ZIL6Q)
珈琲きゃろっと
![](https://www13.a8.net/0.gif?a8mat=3T0BIX+5TKLPU+2CG0+5YJRM)
エプソムソルト
![](https://www13.a8.net/0.gif?a8mat=3T4CGA+8AA6UQ+R12+609HU)