SPI_POLLING 使用示例

例程路径: ls_sdk\examples\peripheral\spi_i2s\spi_polling_master ls_sdk\examples\peripheral\spi_i2s\spi_polling_slave

一、程序基本配置及说明:

spi_polling示例程序演示了使用polling的方式实现spi master和spi slave之间的数据传输,例程以100ms的间隔传输10组数据

程序开始时先进行系统初始化和spi初始化:

    /* system init app     */
    sys_init_none();
    /* init spi and GPIO   */
    spi_init();

spi IO端口设置:

    /* Configure the GPIO AF */
    /* CLK-------------PB12 */	
    /* CS--------------PB13 */	
    /* MOSI------------PB14 */	
    /* MISO------------PB15 */	
    /* master device */
    spi2_master_cs_init(SPI_CS_PIN);
    pinmux_spi2_master_clk_init(SPI_CLK_PIN,SPI_POLARITY_LOW);  // The idle state of clock must correspond to the polarity
    pinmux_spi2_master_clk_init(SPI_CLK_PIN);
    pinmux_spi2_master_mosi_init(SPI_MOSI_PIN); 
    pinmux_spi2_master_miso_init(SPI_MISO_PIN);
 
    /* slave device */
    pinmux_spi2_slave_clk_init(SPI_CLK_PIN);
    pinmux_spi2_slave_nss_init(SPI_CS_PIN);
    pinmux_spi2_slave_mosi_init(SPI_MOSI_PIN);
    pinmux_spi2_slave_miso_init(SPI_MISO_PIN);

二、操作步骤及结果:

2.1 操作步骤

说明

SPI初始化结构体配置说明:

    /* Set the SPI parameters */
    SpiHandle.Instance               = SPI2;   						        /*选择SPI Instance */
    SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;		    /*设置时钟分频因子,fpclk/分频数=fSCK */
    SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;				        /*设置时钟相位,可选奇/偶数边沿采样 */
    SpiHandle.Init.CLKPolarity       = SPI_POLARITY_LOW;				    /*设置时钟极性CPOL,可选高/低电平*/
    SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;				    /*设置SPI的数据帧长度,可选8/16位 */
    SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;				    /*设置MSB/LSB先行 */
    SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;			        /*指定是否启用TI模式 */
    SpiHandle.Init.Mode 			 = SPI_MODE_MASTER;		                /*设置SPI的主/从机模式,可选主机/从机 */

SPI polling模式数据传输提供了3个API:

HAL_SPI_Transmit :发送数据有效

HAL_SPI_Receive : 接收数据有效

HAL_SPI_TransmitReceive :发送和接收数据同时有效

HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint16_t Size, uint32_t Timeout)
HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,
                                          uint32_t Timeout)

下面是HAL_SPI_TransmitReceive API中各参数的说明:

/**
  * @brief  Transmit and Receive an amount of data in blocking mode.
  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains
  *               the configuration information for SPI module.
  * @param  pTxData pointer to transmission data buffer
  * @param  pRxData pointer to reception data buffer
  * @param  Size amount of data to be sent and received
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)

超时时间Timeout单位为ms

2.1.1 端口连接

例程需要使用两块开发板,在程序开始运行之前需要按照下面方式连接master和slave设备:

SPI MASTER BOARD

SPI SLAVE BOARD

spi_master_clk

spi_slave_clk

spi_master_cs

spi_slave_cs

spi_master_mosi

spi_slave_mosi

spi_master_miso

spi_slave_miso

GND

GND

2.1.2 运行程序

主从机程序分别编译后下载到对应的开发板中,需要先在从机上进行复位,然后在主机上进行复位后观察开发板上LED的状态

注意:polling示例HAL_SPI_TransmitReceive的参数Timeout默认被配置为10秒,因此需要在从机完成复位操作后10秒内对主机进行复位,否则从机会发生超时,无法接收来自主机的数据。

2.2 测试结果

在本例程中,aTxBuffer是预定义的,aRxBuffer大小与aTxBuffer相同。SPI主机通过HAL_SPI_TransmitReceive() 发送aTxBuffer和接收RxBuffer的数据,同时SPI从机通过HAL_SPI_TransmitReceive()发送TxBuffer和接收RxBuffer的数据,通过Buffercmp()比较aRxBuffer和aTxBuffer,以检查buffer中数据的正确性。

板子上PA01对应的的LED可用于监控传输状态:

当发送/接收过程中数据出现错误时,LED会以500ms的间隔闪烁