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测试实例,测试步骤如下:
- 擦除数据。
- 写入数据。
- 读出数据。
#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