STM32G474xx HAL 用户手册
stm32g4xx_hal_spi.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_spi.c
00004   * @author  MCD Application Team
00005   * @brief   SPI HAL模块驱动程序。
00006   *          此文件提供固件函数,用于管理串行外设接口 (SPI) 外设的以下功能:
00007   *           + 初始化和反初始化函数
00008   *           + IO操作函数
00009   *           + 外设控制函数
00010   *           + 外设状态函数
00011   ******************************************************************************
00012   * @attention
00013   *
00014   * 版权所有 (c) 2019 STMicroelectronics。
00015   * 保留所有权利。
00016   *
00017   * 本软件受可在本软件组件根目录下的 LICENSE 文件中找到的条款约束。
00018   * 如果本软件未附带 LICENSE 文件,则按原样提供。
00019   *
00020   ******************************************************************************
00021   @verbatim
00022   ==============================================================================
00023                         ##### 如何使用此驱动程序 #####
00024   ==============================================================================
00025     [..]
00026       SPI HAL驱动程序可按如下方式使用:
00027 
00028       (#) 声明一个 SPI_HandleTypeDef 句柄结构体,例如:
00029           SPI_HandleTypeDef  hspi;
00030 
00031       (#) 通过实现 HAL_SPI_MspInit() API 来初始化 SPI 底层资源:
00032           (##) 使能 SPIx 接口时钟
00033           (##) SPI 引脚配置
00034               (+++) 使能 SPI GPIO 的时钟
00035               (+++) 将这些 SPI 引脚配置为复用功能推挽输出
00036           (##) 如果需要使用中断处理,则进行 NVIC 配置
00037               (+++) 配置 SPIx 中断优先级
00038               (+++) 使能 NVIC SPI IRQ 处理
00039           (##) 如果需要使用 DMA 处理,则进行 DMA 配置
00040               (+++) 为发送或接收流/通道声明一个 DMA_HandleTypeDef 句柄结构体
00041               (+++) 使能 DMAx 时钟
00042               (+++) 配置 DMA 句柄参数
00043               (+++) 配置 DMA Tx 或 Rx 流/通道
00044               (+++) 将初始化好的 hdma_tx(或 _rx)句柄关联到 hspi DMA Tx 或 Rx 句柄
00045               (+++) 配置 DMA Tx 或 Rx 流/通道的传输完成中断的优先级并使能 NVIC
00046 
00047       (#) 在 hspi Init 结构体中编程模式、双向模式、数据大小、波特率预分频器、NSS
00048           管理、时钟极性和相位、FirstBit 和 CRC 配置。
00049 
00050       (#) 通过调用 HAL_SPI_Init() API 来初始化 SPI 寄存器:
00051           (++) 此 API 还通过调用定制的 HAL_SPI_MspInit() API 来配置底层硬件 GPIO、CLOCK、CORTEX...等。
00052      [..]
00053        循环模式限制:
00054       (#) 当 SPI 配置为以下模式时,不能使用 DMA 循环模式:
00055           (##) 主机 2线 仅接收
00056           (##) 主机 1线 接收
00057       (#) 当使能 DMA 循环模式时,不管理 CRC 功能
00058       (#) 当使用 SPI DMA 暂停/停止功能时,必须仅在 SPI 回调函数中使用以下 API
00059           HAL_SPI_DMAPause()/ HAL_SPI_DMAStop()
00060      [..]
00061        主机接收模式限制:
00062       (#) 在主机单向仅接收模式 (MSTR =1, BIDIMODE=0, RXONLY=1) 或
00063           双向接收模式 (MSTR=1, BIDIMODE=1, BIDIOE=0) 下,为确保 SPI
00064           不启动新的传输,必须遵守以下步骤:
00065           (##) HAL_SPI_DeInit()
00066           (##) HAL_SPI_Init()
00067      [..]
00068        回调注册:
00069 
00070       (#) 编译标志 USE_HAL_SPI_REGISTER_CALLBACKS 设置为 1U 时,
00071           允许用户动态配置驱动程序回调。
00072           使用函数 HAL_SPI_RegisterCallback() 来注册中断回调。
00073 
00074           函数 HAL_SPI_RegisterCallback() 允许注册以下回调:
00075             (++) TxCpltCallback        : SPI 发送完成回调
00076             (++) RxCpltCallback        : SPI 接收完成回调
00077             (++) TxRxCpltCallback      : SPI 发送接收完成回调
00078             (++) TxHalfCpltCallback    : SPI 发送半完成回调
00079             (++) RxHalfCpltCallback    : SPI 接收半完成回调
00080             (++) TxRxHalfCpltCallback  : SPI 发送接收半完成回调
00081             (++) ErrorCallback         : SPI 错误回调
00082             (++) AbortCpltCallback     : SPI 中止完成回调
00083             (++) MspInitCallback       : SPI Msp 初始化回调
00084             (++) MspDeInitCallback     : SPI Msp 反初始化回调
00085           此函数接受 HAL 外设句柄、回调 ID
00086           和指向用户回调函数的指针作为参数。
00087 
00088 
00089       (#) 使用函数 HAL_SPI_UnRegisterCallback 将回调重置为默认的
00090           弱函数。
00091           HAL_SPI_UnRegisterCallback 接受 HAL 外设句柄、
00092           和回调 ID 作为参数。
00093           此函数允许重置以下回调:
00094             (++) TxCpltCallback        : SPI 发送完成回调
00095             (++) RxCpltCallback        : SPI 接收完成回调
00096             (++) TxRxCpltCallback      : SPI 发送接收完成回调
00097             (++) TxHalfCpltCallback    : SPI 发送半完成回调
00098             (++) RxHalfCpltCallback    : SPI 接收半完成回调
00099             (++) TxRxHalfCpltCallback  : SPI 发送接收半完成回调
00100             (++) ErrorCallback         : SPI 错误回调
00101             (++) AbortCpltCallback     : SPI 中止完成回调
00102             (++) MspInitCallback       : SPI Msp 初始化回调
00103             (++) MspDeInitCallback     : SPI Msp 反初始化回调
00104 
00105        [..]
00106        默认情况下,在 HAL_SPI_Init() 之后且状态为 HAL_SPI_STATE_RESET 时,
00107        所有回调都设置为相应的弱函数:
00108        例如 HAL_SPI_MasterTxCpltCallback()、HAL_SPI_MasterRxCpltCallback()。
00109        MspInit 和 MspDeInit 函数的例外情况是,仅在这些回调为 null(未预先注册)时,
00110        才在 HAL_SPI_Init()/ HAL_SPI_DeInit() 中重置为传统的弱函数。
00111        如果 MspInit 或 MspDeInit 不为 null,则无论状态如何,
00112        HAL_SPI_Init()/ HAL_SPI_DeInit() 都会保留并使用用户 MspInit/MspDeInit 回调(预先注册)。
00113 
00114        [..]
00115        回调只能在 HAL_SPI_STATE_READY 状态下注册/注销。
00116        MspInit/MspDeInit 函数的例外情况是,可以在 HAL_SPI_STATE_READY 或 HAL_SPI_STATE_RESET 状态下注册/注销,
00117        因此注册的(用户)MspInit/DeInit 回调可以在初始化/反初始化期间使用。
00118        然后,用户首先使用 HAL_SPI_RegisterCallback() 注册 MspInit/MspDeInit 用户回调,
00119        然后再调用 HAL_SPI_DeInit() 或 HAL_SPI_Init() 函数。
00120 
00121        [..]
00122        当编译定义 USE_HAL_PPP_REGISTER_CALLBACKS 设置为 0 或
00123        未定义时,回调注册功能不可用,
00124        并使用弱(重载)回调。
00125 
00126      [..]
00127        使用 HAL 无法在不同 SPI 模式下达到所有支持的 SPI 频率,
00128        下表总结了在数据大小为 8 位/16 位时达到的最大 SPI 频率,
00129          取决于 SPI 实例使用的 APBx 外设时钟频率 (fPCLK)。
00130 
00131   @endverbatim
00132 
00133   附加表格:
00134 
00135        DataSize = SPI_DATASIZE_8BIT:
00136        +----------------------------------------------------------------------------------------------+
00137        |         |                | 2线全双工          |     2线仅接收       |         1线        |
00138        | 过程    | 传输模式       |---------------------|----------------------|----------------------|
00139        |         |                |  主机   |  从机   |  主机    |  从机   |  主机    |  从机   |
00140        |==============================================================================================|
00141        |    T    |     轮询       | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |
00142        |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
00143        |    /    |     中断       | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |
00144        |    R    |----------------|----------|----------|-----------|----------|-----------|----------|
00145        |    X    |       DMA      | Fpclk/2  | Fpclk/2  |    NA     |    NA    |    NA     |   NA     |
00146        |=========|================|==========|==========|===========|==========|===========|==========|
00147        |         |     轮询       | Fpclk/4  | Fpclk/8  | Fpclk/16  | Fpclk/8  | Fpclk/8   | Fpclk/8  |
00148        |         |----------------|----------|----------|-----------|----------|-----------|----------|
00149        |    R    |     中断       | Fpclk/8  | Fpclk/16 | Fpclk/8   | Fpclk/8  | Fpclk/8   | Fpclk/4  |
00150        |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
00151        |         |       DMA      | Fpclk/4  | Fpclk/2  | Fpclk/2   | Fpclk/16 | Fpclk/2   | Fpclk/16 |
00152        |=========|================|==========|==========|===========|==========|===========|==========|
00153        |         |     轮询       | Fpclk/8  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/8  |
00154        |         |----------------|----------|----------|-----------|----------|-----------|----------|
00155        |    T    |     中断       | Fpclk/2  | Fpclk/4  |     NA    |    NA    | Fpclk/16  | Fpclk/8  |
00156        |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
00157        |         |       DMA      | Fpclk/2  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/16 |
00158        +----------------------------------------------------------------------------------------------+
00159 
00160        DataSize = SPI_DATASIZE_16BIT:
00161        +----------------------------------------------------------------------------------------------+
00162        |         |                | 2线全双工          |     2线仅接收       |         1线        |
00163        | 过程    | 传输模式       |---------------------|----------------------|----------------------|
00164        |         |                |  主机   |  从机   |  主机    |  从机   |  主机    |  从机   |
00165        |==============================================================================================|
00166        |    T    |     轮询       | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |
00167        |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
00168        |    /    |     中断       | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |
00169        |    R    |----------------|----------|----------|-----------|----------|-----------|----------|
00170        |    X    |       DMA      | Fpclk/2  | Fpclk/2  |    NA     |    NA    |    NA     |   NA     |
00171