SPI Master & Slave
SPI Master & Slave示例实现了SPI主从设备之间的数据交互。该示例中同时实现了主从设备的代码,使用时请用宏定义MASTER_BOARD区分主从设备。
SPI Master & Slave示例的源代码和工程文件位于SDK_Folder\projects\peripheral\spi\spi_master_slave,其中工程文件在文件夹Keil_5下。
代码理解
示例工程流程图如图 31所示:
- SPI Master & Slave的主设备初始化。
g_spi_handle.p_instance = SPIM; g_spi_handle.init.data_size = SPI_DATASIZE_32BIT; g_spi_handle.init.clock_polarity = SPI_POLARITY_LOW; g_spi_handle.init.clock_phase = SPI_PHASE_1EDGE; g_spi_handle.init.baudrate_prescaler = SystemCoreClock / 1000000; g_spi_handle.init.ti_mode = SPI_TIMODE_DISABLE; g_spi_handle.init.slave_select = SPI_SLAVE_SELECT_0; hal_spi_init(&g_spim_handle);SPI详细配置参数请参考SPIM DMA。
- SPI Master & Slave的从设备初始化。
g_spi_handle.p_instance = SPIS; g_spi_handle.init.data_size = SPI_DATASIZE_32BIT; g_spi_handle.init.clock_polarity = SPI_POLARITY_LOW; g_spi_handle.init.clock_phase = SPI_PHASE_1EDGE; g_spi_handle.init.ti_mode = SPI_TIMODE_DISABLE; hal_spi_init(&g_spim_handle);SPI详细配置参数请参考SPIM DMA。
- SPI主设备以中断方式发送或者接收数据。因采用非阻塞方式的接口,需在后续步骤中用while判断是否收发完成。代码如下:
g_tx_done = 0; hal_spi_transmit_it(&g_spi_handle, wdata, sizeof(wdata)); /* Wait for send done */ while(!g_tx_done); g_rx_done = 0; hal_spi_receive_it(&g_spi_handle, rdata, sizeof(rdata)); /* Wait for receive done */ while(!g_rx_done); - SPI从设备以中断方式接收或发送收数据。因采用非阻塞方式的接口,需在后续步骤中用while判断是否收发完成。代码如下:
hal_spi_receive_it(&g_spi_handle, rdata, sizeof(rdata)) /* Wait for receive done */ while(!g_rx_done); g_tx_done = 0; hal_spi_transmit_it(&g_spi_handle, wdata, sizeof(wdata)) while(!g_tx_done); - 主从设备采用非阻塞方式的接口进行收发数据,返回结果或者状态通过hal_spi_rx_cplt_callback()、hal_spi_tx_cplt_callback()、
hal_spi_tx_rx_cplt_callback()、hal_spi_abort_cplt_callback()接口返回,
用户可在这些函数自定义可执行操作。代码如下:
void hal_spi_rx_cplt_callback(spi_handle_t *hspi) { g_rx_done = 1; } void hal_spi_tx_cplt_callback(spi_handle_t *hspi) { g_tx_done = 1; } void hal_spi_tx_rx_cplt_callback(spi_handle_t *p_spi) { g_rx_done = 1; g_tx_done = 1; } void hal_spi_abort_cplt_callback(spi_handle_t *hspi) { if (hspi->p_instance == SPIM) printf("This is Abort complete Callback in SPIM.\r\n"); else if (hspi->p_instance == SPIS) printf("This is Abort complete Callback in SPIS.\r\n"); }
测试验证
- 在工程配置中定义宏MASTER_BOARD,编译并下载至主设备开发板;在工程配置中取消MASTER_BOARD宏定义,编译并下载至从设备开发板。
- 连接主从设备开发板的对应IO引脚。
- 将主从设备开发板的串口分别连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将会显示SPI主从设备开发板的数据交互信息。