CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

SPI Master & Slave

SPI Master & Slave示例实现了SPI主从设备之间的数据交互。该示例中同时实现了主从设备的代码,使用时请用宏定义MASTER_BOARD区分主从设备。

SPI Master & Slave示例的源代码和工程文件位于SDK_Folder\projects\peripheral\spi\spi_master_slave,其中工程文件在文件夹Keil_5下。

代码理解

示例工程流程图如图 31所示:

图 31 SPI Master & Slave示例流程图
  1. 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

  2. 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

  3. 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);
    
  4. 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);
    
  5. 主从设备采用非阻塞方式的接口进行收发数据,返回结果或者状态通过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");
    }
    

测试验证

  1. 在工程配置中定义宏MASTER_BOARD,编译并下载至主设备开发板;在工程配置中取消MASTER_BOARD宏定义,编译并下载至从设备开发板。
  2. 连接主从设备开发板的对应IO引脚。
  3. 将主从设备开发板的串口分别连接至PC端,打开并配置GRUart。
  4. 在GRUart的Receive Data窗口中将会显示SPI主从设备开发板的数据交互信息。

扫描关注

打开微信,使用“扫一扫”即可关注。