Skip to content

SPI FLASH

FLASH简介

片内FLASH需要通SPI访问,AP的8088片内FLASH有2MByte。

访问FLASH

访问片内FLASH需要使用SPI,库中提供了以下接口:

函数 描述
onchip_flash_erase() 按块擦除FLASH
onchip_flash_write() 向FLAHS写入数据
onchip_flash_read() 从FLASH读出数据

按块擦除FLASH

按块(4KByte)擦除FLASH,函数原型如下所示:

int onchip_flash_erase(uint32_t offset, uint32_t size);
  • 参数

    [IN]offset:擦除的起始地址。

    [IN]size:擦除的字节大小。

  • 返回值

    返回0。

注:由于内部FLASH最小擦除单位为4KByte,因此起始地址offset以及擦除大小size需要为4KByte的整数倍。

向FLASH写入数据

通过SPI总线,向FLASH写入数据,函数原型如下所示:

int onchip_flash_write(uint32_t offset, const uint8_t* buf, uint32_t size);

  • 参数

    [IN]offset:写入的起始地址。

    [IN]buf:写入的数据。

    [IN]size:写入的字节大小,大小不能超过buf的大小。

  • 返回值

    正常,返回写入的字节大小。

    失败,返回-RT_EINVAL或-RT_ERROR。

从FLASH读出数据

通过SPI总线,从FLASH读出数据,函数原型如下所示:

int onchip_flash_read(uint32_t offset, uint8_t* buf, uint32_t size);
  • 参数

    [IN]offset:读取的起始地址。

    [OUT]buf:读出的数据。

    [IN]size:期望读出的字节大小,大小不能超过buf的大小。

  • 返回值

    返回读出的字节大小。

FLASH使用示例

使用示例需要配置menuconfig打开配置(默认关闭),路径如下:

wiota APP -> open spi, default close(_SPI_FLASH_APP_)

以下提供SPI FLASH测试实例,测试步骤如下:

  1. 擦除数据。
  2. 写入数据。
  3. 读出数据。
#include <rtthread.h>
#ifdef _SPI_FLASH_APP_
#include <rtdevice.h>
#include <stdlib.h>
#include <time.h>
#include "uc_spi_flash_app.h"
#include "drv_onchip_flash.h"

#define FLASH_DATA_ADDR (0x7D000)
#define FLASH_DATA_LEN  (1024)

int spi_flash_app_init(void)
{
    rt_err_t ret = RT_EOK;

    return ret;
}

void spi_flash_app_sample(void)
{
    rt_err_t ret = RT_EOK;
    rt_uint8_t *wr_buf = (rt_uint8_t *)rt_calloc(1, FLASH_DATA_LEN);
    rt_uint8_t *rd_buf = (rt_uint8_t *)rt_malloc(FLASH_DATA_LEN);
    rt_int32_t index = 0;

    rt_kprintf("enter spi_flash_app_sample()\r\n");
    srand(time(0));
    for (index = 0; index < FLASH_DATA_LEN; index++)
    {
        wr_buf[index] = rand() & 0xFF;
    }

    do
    {
        ret = spi_flash_app_init();
        if (ret != RT_EOK)
        {
            rt_kprintf("spi flash init failed!\n");
            break;
        }

        ret = onchip_flash_erase(FLASH_DATA_ADDR, FLASH_DATA_LEN);
        if (ret != RT_EOK)
        {
            rt_kprintf("spi erase flash failed!\n");
            break;
        }

        ret = onchip_flash_write(FLASH_DATA_ADDR, wr_buf, FLASH_DATA_LEN);
        if (ret != FLASH_DATA_LEN)
        {
            rt_kprintf("spi write flash failed!\n");
            break;
        }

        ret = onchip_flash_read(FLASH_DATA_ADDR, rd_buf, FLASH_DATA_LEN);
        if (ret != FLASH_DATA_LEN)
        {
            rt_kprintf("spi read flash failed!\n");
            break;
        }

        if (rt_memcmp(wr_buf, rd_buf, FLASH_DATA_LEN))
        {
            rt_kprintf("data diff!\n");
        }
        else
        {
            rt_kprintf("data same\n");
        }
    } while (0);

    rt_free(wr_buf);
    rt_free(rd_buf);
}

#endif
Back to top