SPI使用指导

    图 1 SPI使用流程图

    获取SPI设备句柄

    在使用SPI进行通信时,首先要调用SpiOpen获取SPI设备句柄,该函数会返回指定总线号和片选号的SPI设备句柄。

    struct DevHandle *SpiOpen(const struct SpiDevInfo *info);

    表 1 SpiOpen参数和返回值描述

    假设系统中的SPI设备总线号为0,片选号为0,获取该SPI设备句柄的示例如下:

    在获取到SPI设备句柄之后,需要配置SPI设备属性。配置SPI设备属性之前,可以先获取SPI设备属性,获取SPI设备属性的函数如下所示:

    int32_t SpiGetCfg(struct DevHandle *handle, struct SpiCfg *cfg);

    表 2 SpiGetCfg参数和返回值描述

    参数

    参数描述

    handle

    SPI设备句柄

    cfg

    SPI设备配置参数

    返回值

    返回值描述

    0

    获取配置成功

    负数

    获取配置失败

    1. struct SpiCfg cfg = {0}; /* SPI配置信息*/
    2. ret = SpiGetCfg(spiHandle, &cfg); /* 配置SPI设备属性 */
    3. if (ret != 0) {
    4. HDF_LOGE("SpiGetCfg: failed, ret %d\n", ret);

    配置SPI设备属性

    在获取到SPI设备句柄之后,需要配置SPI设备属性,配置SPI设备属性的函数如下所示:

    int32_t SpiSetCfg(struct DevHandle *handle, struct SpiCfg *cfg);

    表 3 SpiSetCfg参数和返回值描述

    • 向SPI设备写入指定长度的数据

    如果只向SPI设备写一次数据,则可以通过以下函数完成:

    int32_t SpiWrite(struct DevHandle *handle, uint8_t *buf, uint32_t len);

    表 4 SpiWrite参数和返回值描述

    参数

    参数描述

    handle

    SPI设备句柄

    buf

    待写入数据的指针

    len

    待写入的数据长度

    返回值

    返回值描述

    0

    写入成功

    负数

    写入失败

    1. int32_t ret;
    2. uint8_t wbuff[4] = {0x12, 0x34, 0x56, 0x78};
    3. /* 向SPI设备写入指定长度的数据 */
    4. if (ret != 0) {
    5. HDF_LOGE("SpiWrite: failed, ret %d\n", ret);
    6. }
    • 从SPI设备读取指定长度的数据

    如果只读取一次数据,则可以通过以下函数完成:

    int32_t SpiRead(struct DevHandle *handle, uint8_t *buf, uint32_t len);

    表 5 SpiRead参数和返回值描述

    • 自定义传输

    如果需要发起一次自定义传输,则可以通过以下函数完成:

    int32_t SpiTransfer(struct DevHandle *handle, struct SpiMsg *msgs, uint32_t count);

    表 6 SpiTransfer参数和返回值描述

    参数

    参数描述

    handle

    SPI设备句柄

    msgs

    待传输数据的数组

    count

    msgs数组长度

    返回值

    返回值描述

    0

    执行成功

    负数

    执行失败

    1. int32_t ret;
    2. uint8_t rbuff[1] = {0};
    3. struct SpiMsg msg; /* 自定义传输的消息*/
    4. msg.wbuf = wbuff; /* 写入的数据 */
    5. msg.len = 1; /* 读取、写入数据的长度都是1 */
    6. msg.csChange = 1; /* 进行下一次传输前关闭片选 */
    7. msg.delayUs = 0; /* 进行下一次传输前不进行延时 */
    8. msg.speed = 115200; /* 本次传输的速度 */
    9. /* 进行一次自定义传输,传输的msg个数为1 */
    10. ret = SpiTransfer(spiHandle, &msg, 1);
    11. if (ret != 0) {

    销毁SPI设备句柄

    SPI通信完成之后,需要销毁SPI设备句柄,销毁SPI设备句柄的函数如下所示:

    void SpiClose(struct DevHandle *handle);

    该函数会释放掉申请的资源。

    表 7 SpiClose参数描述