1. 概述

串行外设接口(Serial Peripheral Interface Bus, SPI)是一种用于短程通信的同步串行通信接口规范,装置之间使用全双工模式通信,是一个主机和一个或多个从机的主从模式。SPI 使用 4 根线完成全双工的通信,这 4 根信号线分别是:CS(片选)、SCLK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)。

2. API参考

2.1 SPI引脚初始化

  • 函数原型:
    void hosal_spi_flash_set_gpio(uint8_t clk, uint8_t cs,

uint8_t mosi, uint8_t miso);

  • 功能描述:初始化spi引脚
  • 函数参数:
    • clk:clk引脚(clk % 4 == 3才可以作为clk功能使用)
    • cs:cs引脚(cs % 4 == 0才可以作为cs功能使用)
    • mosi:mosi引脚(mosi% 4 == 2才可以作为mosi功能使用)
    • miso:miso引脚(miso % 4 == 1才可以作为miso功能使用)
  • 返回值:

    • 无。

      2.2 SPI初始化

  • 函数原型:
    BL_Err_Type hosal_spi_flash_init(void);

  • 功能描述:spi初始化。
  • 函数参数:
    • NULL
  • 返回值:

    • 成功返回0。
    • 错误返回-1。

      2.3 获取Flash ID

  • 函数原型:
    BL_Err_Type hosal_spi_flash_read_jedec_id(uint8_t *data);

  • 功能描述:获取flash id。
  • 函数参数:
    • data:存储id值
  • 返回值:

    • 成功返回0。
    • 错误返回-1。

      2.4 读Flash

  • 函数原型:
    BL_Err_Type hosal_spi_flash_read(uint32_t addr, uint8_t *data, uint32_t len);

  • 功能描述:读取从addr地址开始,长度len(byte)大小的flash内容
  • 函数参数:
    • addr:起始地址
    • data:存储数据的buffer
    • len:数据长度
  • 返回值:

    • 成功返回0。
    • 错误返回-1。

      2.5 写Flash

  • 函数原型:
    BL_Err_Type hosal_spi_flash_write(uint32_t addr, uint8_t *data,

uint32_t len);

  • 功能描述:从addr地址开始的地方写入数据,长度为len(byte)
  • 函数参数:
    • addr:起始地址
    • data:数据buffer
    • len:数据长度
  • 返回值:

    • 成功返回0。
    • 错误返回-1。

      2.6 擦除Flash

  • 函数原型:
    BL_Err_Type hosal_spi_flash_erase(uint32_t startaddr, uint32_t len);

  • 功能描述:从startaddr地址开始的地方擦除,长度为len(byte)
  • 函数参数:
    • startaddr:起始地址
    • len:数据长度
  • 返回值:
    • 成功返回0。
    • 错误返回-1。

      3. Demo示例

      ```c hosal_spi_flash_set_gpio(SPI_PIN_CLK, SPI_PIN_CS, SPI_PIN_MOSI, SPI_PIN_MISO); hosal_spi_flash_init();
  1. - 初始化用作spi功能的4gpio引脚并初始化spi
  2. ```c
  3. hosal_spi_flash_erase(0, FLASH_WRITE_READ_SIZE);
  • 调用 hosal_spi_flash_erase 擦除地址0开始 FLASH_WRITE_READ_SIZE长度。
hosal_spi_flash_write(0, wData, FLASH_WRITE_READ_SIZE);
  • 通过 hosal_spi_flash_write 来写数据
hosal_spi_flash_read(0, rData, FLASH_WRITE_READ_SIZE);
  • 通过 hosal_spi_flash_read 接口读取数据。