HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-SPI详解

目录

  • 一、 SPI 概述
  • 二、SPI 模块相关API
  • 三、接口调用实例
  • 四、SPI HDF驱动开发
  • 4.1、开发步骤(待续…)
  • 坚持就有收获
  • 一、 SPI 概述

    SPI 是串行外设接口(Serial Peripheral Interface)是一种高速的全双工同步的通信总线。

    SPI 是由 Motorola 公司开发,用于在主设备和从设备之间进行通信,常用于与闪存、实时时钟、传感器以及模数转换器等进行通信。

    SPI 通信通常由主设备发起,通过以下步骤完成一次通信:

  • 通过 CS 选中要通信的从设备,在任意时刻一个主设备上最多只能有一个从设备被选中。
  • 通过 SCLK 给选中的从设备提供时钟信号。
  • 基于 SCLK 时钟信号,主设备数据通过 MOSI 发送给从设备,同时通过 MISO 接收从设备发送的数据,完成通信。
  • 从设备 A 和从设备 B 共享主设备的 SCLK、MISO 和 MOSI 三根引脚,从设备 A 的片选 CS0 连接主设备的 CS0,从设备 B 的片选 CS1 连接主设备的 CS1。

    SPI 设备的连接示意图如下:

    请添加图片描述

    SPI 以主从方式工作,通常有一个主设备和一个或者多个从设备。主设备和从设备之间一般用4 根线相连,它们分别是:

  • SCLK – 时钟信号,由主设备产生;
  • MOSI – 主设备数据输出,从设备数据输入;
  • MISO – 主设备数据输入,从设备数据输出;
  • CS – 片选,从设备使能信号,由主设备控制。
  • 数据的采集时机是时钟信号的边沿(上升沿或下降沿),根据 SCLK 时钟信号的 CPOL(Clock Polarity,时钟极性)和 CPHA(Clock Phase,时钟相位)的不同组合,SPI 有以下四种工作模式:

  • CPOL=0,CPHA=0 时钟信号 idle 状态为低电平,第一个时钟边沿采样数据。
  • CPOL=0,CPHA=1 时钟信号 idle 状态为低电平,第二个时钟边沿采样数据。
  • CPOL=1,CPHA=0 时钟信号 idle 状态为高电平,第一个时钟边沿采样数据。
  • CPOL=1,CPHA=1 时钟信号 idle 状态为高电平,第二个时钟边沿采样数据。
  • 请添加图片描述

    如下图所示:

    SPI 操作流程如下:

    请添加图片描述

    二、SPI 模块相关API

    头文件路径:base/iothardware/peripheral/interfaces/inner_api/iot_spi.h

    接口函数 描述
    hi_u32 hi_spi_init(hi_spi_idx spi_id, hi_spi_cfg_init_param init_param, const hi_spi_cfg_basic_info *param); 初始化SPI
    hi_u32 hi_spi_slave_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len, hi_u32 time_out_ms); SPI从写操作
    hi_u32 hi_spi_host_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len); SPI主写操作
    hi_u32 hi_spi_host_writeread(hi_spi_idx spi_id, hi_pvoid write_data, hi_pvoid read_data, hi_u32 byte_len); SPI主读写操作

    三、接口调用实例

    //代码功能:定义了 SPI 接口功能以及 SPI 相关参数,GPIO_00 号口作为 SPI1_CLK 模式。
    
    IotSpiCfgBasicInfo BasicInfo;
    BasicInfo.cpol = HI_SPI_CFG_CLOCK_CPOL_1; //通信极性
    BasicInfo.cpha = HI_SPI_CFG_CLOCK_CPHA_1; //通信相位
    BasicInfo.framMode = HI_SPI_CFG_FRAM_MODE_MOTOROLA; //MOTOROLA 协议
    BasicInfo.dataWidth = HI _SPI_CFG_DATA_WIDTH_E_8BIT; //位宽为 8bit
    BasicInfo.endian = HI_SPI_CFG_ENDIAN_LITTLE; //小端传输
    BasicInfo.pad =31; //主发模式
    BasicInfo.freq= 40000000; //通信频率
    IotSpiCfgInitParam InitParam;
    ret=IoTSpiInit(0,InitParam, &BasicInfo);
    
    

    四、SPI HDF驱动开发

    在HDF框架中,SPI的接口适配模式采用独立服务模式(如图1所示),在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,若设备过多可能增加内存占用。

    独立服务模式下,核心层不会统一发布一个服务供上层使用,因此这种模式下驱动要为每个控制器发布一个服务,具体表现为:

  • 驱动适配者需要实现HdfDriverEntry的Bind钩子函数以绑定服务。
  • device_info.hcs文件中deviceNode的policy字段为1或2,不能为0。
  • 图 1 SPI独立服务模式结构图

    请添加图片描述

    4.1、开发步骤(待续…)

    SPI模块适配包含以下四个步骤:

  • 实例化驱动入口

  • 实例化HdfDriverEntry结构体成员。
  • 调用HDF_INIT将HdfDriverEntry实例化对象注册到HDF框架中。
  • 配置属性文件

  • 在device_info.hcs文件中添加deviceNode描述。
  • 【可选】添加spi_config.hcs器件属性文件。
  • 实例化SPI控制器对象

  • 初始化SpiCntlr成员。
  • 实例化SpiCntlr成员SpiCntlrMethod。
  • 说明:

  • 实例化SpiCntlr成员SpiCntlrMethod,其定义和成员说明见接口说明。
  • 驱动调试

  • 【可选】针对新增驱动程序,建议验证驱动基本功能,例如SPI控制状态,中断响应情况等。
  • 坚持就有收获

    物联沃分享整理
    物联沃-IOTWORD物联网 » HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-SPI详解

    发表评论