【联盛德W806上手笔记】八、SPI及其DMA

发布者:collectors最新更新时间:2022-07-19 来源: csdn关键字:SPI  DMA 手机看文章 扫描二维码
随时随地手机看文章

Windows 10 20H2

HLK-W806-V1.0-KIT

WM_SDK_W806_v0.6.0


       摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》、《WM_W800_寄存器手册 V2.1》


高速 SPI 设备控制器

       兼容通用 SPI 物理层协议,通过约定与主机交互的数据格式,主机对设备的高速访问,最高支持工作频率为50Mbps。


兼容通用 SPI 协议

可选择的电平中断信号

最高支持 50Mbps 速率

简单的帧格式,全硬件解析与 DMA


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

库函数

函数

HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi);

//初始化SPI的工作模式和速率等


HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi);

//将初始化之后的SPI接口恢复成默认的状态–各个寄存器复位时的值


void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi);

//用于启用SPI时钟,引脚复用,配置DMA及中断优先级等


void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi);

//用于禁用SPI时钟,将对应引脚恢复成默认的状态


HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout);

//SPI发送数据,使用超时管理机制 

HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout);

//SPI接收数据,使用超时管理机制 

HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint32_t Size,

                                          uint32_t Timeout);

//SPI收发数据,使用超时管理机制 


HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size);

//SPI中断模式发送

HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size);

//SPI中断模式接收

HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,

                                             uint32_t Size);

//SPI中断模式收发


HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size);

//SPI DMA模式发送

HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size);

//SPI DMA模式接收

HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,

                                              uint32_t Size);

//SPI DMA模式收发

  

HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi);

//SPI DMA传输暂停

HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi);

//SPI DMA传输恢复

HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi);

//SPI DMA传输停止


void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi);

//SPI 中断服务函数

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);

//SPI 发送完毕回调函数

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);

//SPI 接收完毕回调函数

void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);

//SPI 收发完毕回调函数

void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi);

void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi);

void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi);

void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi);


HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi);

//获取SPI传输状态

uint32_t             HAL_SPI_GetError(SPI_HandleTypeDef *hspi);



参数

结构体和枚举类型


typedef struct

{

uint32_t Mode;                /*!< Specifies the SPI operating mode.

This parameter can be a value of @ref SPI_Mode */


uint32_t CLKPolarity;         /*!< Specifies the serial clock steady state.

This parameter can be a value of @ref SPI_Clock_Polarity */


uint32_t CLKPhase;            /*!< Specifies the clock active edge for the bit capture.

This parameter can be a value of @ref SPI_Clock_Phase */


uint32_t NSS;                 /*!< Specifies whether the NSS signal is managed by

hardware (NSS pin) or by software using the SSI bit.

This parameter can be a value of @ref SPI_Slave_Select_management */


uint32_t BaudRatePrescaler;   /*!< Specifies the Baud Rate prescaler value which will be

used to configure the transmit and receive SCK clock.

This parameter can be a value of @ref SPI_BaudRate_Prescaler

@note The communication clock is derived from the master

clock. The slave clock does not need to be set. */

 

uint32_t FirstByte;   /* Specifies whether data transfers start from high byte or low byte.

This parameter can be a value of @ref SPI_HBYTE_LBYTE_transmission */

 


} SPI_InitTypeDef;


typedef enum

{

HAL_SPI_STATE_RESET      = 0x00U,    /*!< Peripheral not Initialized                         */

HAL_SPI_STATE_READY      = 0x01U,    /*!< Peripheral Initialized and ready for use           */

HAL_SPI_STATE_BUSY       = 0x02U,    /*!< an internal process is ongoing                     */

HAL_SPI_STATE_BUSY_TX    = 0x03U,    /*!< Data Transmission process is ongoing               */

HAL_SPI_STATE_BUSY_RX    = 0x04U,    /*!< Data Reception process is ongoing                  */

HAL_SPI_STATE_BUSY_TX_RX = 0x05U,    /*!< Data Transmission and Reception process is ongoing */

HAL_SPI_STATE_ERROR      = 0x06U,    /*!< SPI error state                                    */

HAL_SPI_STATE_ABORT      = 0x07U     /*!< SPI abort is ongoing                               */

} HAL_SPI_StateTypeDef;


typedef struct __SPI_HandleTypeDef

{

SPI_TypeDef                *Instance;      /*!< SPI registers base address               */


SPI_InitTypeDef            Init;           /*!< SPI communication parameters             */


uint8_t                    *pTxBuffPtr;    /*!< Pointer to SPI Tx transfer Buffer        */


uint32_t                   TxXferSize;     /*!< SPI Tx Transfer size                     */


__IO uint32_t              TxXferCount;    /*!< SPI Tx Transfer Counter                  */


uint8_t                    *pRxBuffPtr;    /*!< Pointer to SPI Rx transfer Buffer        */


uint32_t                   RxXferSize;     /*!< SPI Rx Transfer size                     */


__IO uint32_t              RxXferCount;    /*!< SPI Rx Transfer Counter                  */

DMA_HandleTypeDef    *hdmatx;    /*!< SPI Tx DMA Handle parameters */

DMA_HandleTypeDef    *hdmarx;    /*!< SPI Rx DMA Handle parameters */


HAL_LockTypeDef            Lock;           /*!< Locking object                           */


__IO HAL_SPI_StateTypeDef  State;          /*!< SPI communication state                  */


__IO uint32_t              ErrorCode;      /*!< SPI Error code                           */


} SPI_HandleTypeDef;


宏参数


#define SPI                ((SPI_TypeDef *)SPI_BASE)


#define HAL_SPI_ERROR_NONE              (0x00000000U)   /*!< No error                               */

#define HAL_SPI_ERROR_TXERR (0x00000001U) /*!< Tx error                               */

#define HAL_SPI_ERROR_RXERR (0x00000002U) /*!< Rx error                               */

#define HAL_SPI_ERROR_DMA               (0x00000010U)   /*!< DMA transfer error                     */



// SPI_Mode

#define SPI_MODE_SLAVE                  (0x00000000U)

#define SPI_MODE_MASTER                 (SPI_SPI_CFG_MASTER)


// SPI_Clock_Polarity

#define SPI_POLARITY_LOW                (0x00000000U)

#define SPI_POLARITY_HIGH               SPI_SPI_CFG_CPOL


// SPI_Clock_Phase

#define SPI_PHASE_1EDGE                 (0x00000000U)

#define SPI_PHASE_2EDGE                 SPI_SPI_CFG_CPHA


// SPI_Slave_Select_management

#define SPI_NSS_HARD              (0x00000000U)

#define SPI_NSS_SOFT                    SPI_CH_CFG_CSSEL

[1] [2] [3]
关键字:SPI  DMA 引用地址:【联盛德W806上手笔记】八、SPI及其DMA

上一篇:【联盛德W806上手笔记】九、DMA
下一篇:【联盛德W806上手笔记】七、I2C

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved