介绍关于SPI初始化、收发数据、关闭等功能所调用的一些抽象函数。

API列表

函数名称 功能描述
hal_spi_init 初始化指定SPI端口
hal_spi_send 从指定的SPI端口发送数据
hal_spi_recv 从指定的SPI端口接收数据
hal_spi_send_recv 从指定的SPI端口发送并接收数据
hal_spi_finalize 关闭指定SPI端口

hal_spi_init

定义描述
定义 描述
函数原型 int32_t hal_spi_init(spi_dev_t *spi)
描述 初始化指定SPI端口
参数 spi:SPI设备描述,定义需要初始化的SPI参数
返回值 返回成功或失败,返回0表示SPI初始化成功,非0表示失败

调用示例

具体请参见使用示例

hal_spi_send

定义描述
定义 描述
函数原型 int32_t hal_spi_send(spi_dev_t *spi, const uint8_t *data, uint16_t size, uint32_t timeout)
描述 从指定的SPI端口发送数据
参数
  • spi:SPI设备描述
  • data:指向要发送数据的数据指针
  • size:要发送的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功发送size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_spi_recv

定义描述
定义 描述
函数原型 int32_t hal_spi_recv(spi_dev_t *spi, uint8_t *data, uint16_t size, uint32_t timeout)
描述 从指定的SPI端口接收数据
参数
  • spi:SPI设备描述
  • data:指向接收缓冲区的数据指针
  • size:期望接收的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功接收size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_spi_send_recv

定义描述
定义 描述
函数原型 int32_t hal_spi_send_recv(spi_dev_t *spi, uint8_t *tx_data, uint8_t *rx_data, uint16_t size, uint32_t timeout)
描述 从指定的SPI端口发送并接收数据
参数
  • spi:SPI设备描述
  • tx_data:指向接收缓冲区的数据指针
  • rx_data:指向发送缓冲区的数据指针
  • size:要发送和接收数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功发送并接收size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_spi_finalize

定义描述
定义 描述
函数原型 int32_t hal_spi_finalize(spi_dev_t *spi)
描述 关闭指定SPI端口
参数 spi:SPI设备描述
返回值 类型:int 返回成功或失败,返回0表示SPI关闭成功,非0表示失败。

调用示例

具体请参见使用示例

相关宏定义

#define HAL_SPI_MODE_MASTER 1 /* spi communication is master mode */
#define HAL_SPI_MODE_SLAVE  2 /* spi communication is slave mode */

spi_dev_t数据结构

typedef struct {
    uint8_t      port;   /* spi port */
    spi_config_t config; /* spi config */
    void        *priv;   /* priv data */
} spi_dev_t;

spi_config_t数据结构

typedef struct {
    uint32_t mode; /* spi communication mode */
    uint32_t freq; /* communication frequency Hz */
} spi_config_t;

使用示例

#include <aos/hal/spi.h>

#define SPI1_PORT_NUM  1
#define SPI_BUF_SIZE   10
#define SPI_TX_TIMEOUT 10
#define SPI_RX_TIMEOUT 10

/* define dev */
spi_dev_t spi1;

/* data buffer */
char spi_data_buf[SPI_BUF_SIZE];

int application_start(int argc, char *argv[])
{
    int count   = 0;
    int ret     = -1;
    int i       = 0;
    int rx_size = 0;

    /* spi port set */
    spi1.port = SPI1_PORT_NUM;

    /* spi attr config */
    spi1.config.mode  = HAL_SPI_MODE_MASTER;
    spi1.config.freq = 30000000;

    /* init spi1 with the given settings */
    ret = hal_spi_init(&spi1);
    if (ret != 0) {
        printf("spi1 init error !\n");
        return -1;
    }

    /* init the tx buffer */
    for (i = 0; i < SPI_BUF_SIZE; i++) {
        spi_data_buf[i] = i + 1;
    }

/* send 1,2,3,4,5,6,7,8,9,10 by spi1 */
    ret = hal_spi_send(&spi1, spi_data_buf, SPI_BUF_SIZE, SPI_TX_TIMEOUT);
    if (ret == 0) {
        printf("spi1 data send succeed !\n");
    }

    /* scan spi every 100ms to get the data */
    while(1) {
        ret = hal_spi_recv(&spi1, spi_data_buf, SPI_BUF_SIZE, SPI_RX_TIMEOUT);
        if (ret == 0) {
            printf("spi1 data received succeed !\n");
        }

        /* sleep 100ms */
        aos_msleep(100);
    };
}
说明
  • port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现。
  • 移植前,请新建hal_spi_xxmcu.chal_spi_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_spi_xxmcu.c中实现所需要的hal函数,hal_spi_xxmcu.h中放置相关宏定义。具体请参见platform/mcu/stm32l4xx_cube/hal/hal_spi_stm32l4.c