跳转至

串行闪存控制器(SPIFLASH)


简介

SPIFLASH控制器为本公司自行开发的模块(qspi_controller),所以与市面上常见的SPI控制器有所不同;有很多独有的功能:支持AMBA 2.0协议,APB配置和AHB数据传输,只支持32bit数据宽度,支持DMA方式数据传输,支持CPU boot传输,以SINGLE模式传输,支持SINGLE INCR INCR4 INCR8 INCR16传输方式,两条AHB数据总线,支持PARA参数预取操作及普通操作,支持M值的配置,深度为64,宽度为32bit的发送与接收FIFO,支持写、擦除地址保护,支持管脚复位FLASH,支持AHB和AHB的总线检测AHB0端,支持CPU boot传输,以SINGLE模式传输,支持M值的配置,深度为64,宽度为32bit的发送与接收FIFO,支持水线可配,只支持32bit数据宽度,支持DMA方式数据传输(读写传输都支持),DMA支持single和burst请求,支持SINGLE/INCR/INCR4/INCR8/INCR16传输方式,除boot模式外,每次读写操作前都需要通过APB端口配置传输模式、传输数据大小,传输数据起始地址等等。


API列表

函数名 描述
flash_init 初始化SPIFLASH设备
spic_read_unique_id SPIFLASH设备读取UNIQUE ID
spic_read_jedec_id SPIFLASH设备读取JEDEC ID
spic_erase_security_reg SPIFLASH设备擦除安全寄存器
spic_write_security_reg SPIFLASH设备写安全寄存器
spic_read_security_reg SPIFLASH设备读安全寄存器
spic_security_reg_lock SPIFLASH设备锁定安全寄存器
flash_erase SPIFLASH擦除
flash_write SPIFLASH写
flash_read SPIFLASH读
spic_quad_mode SPIFLASH设置四线模式


示例

以下示例初始化FLASH并检查模式,最后进行了擦除读写操作:

#include "ci130x_spiflash.h"
#include "ci_log.h"

uint8_t write_buf[1024] = {0}; /* 写入FLASH的数据缓存 */
uint8_t read_buf[1024] = {0};  /* 读出FLASH数据的缓存 */

void flash_test()
{
    uint32_t flash_addr = 0x10000; /*FLASH偏移地址*/
    uint32_t size = 256; /* 读写数据大小 */

    for(int i=0; i<size; i++)
    {
        write_buf[i] = i;
        read_buf[i] = 0;
    }

    /* FLASH 初始化*/
    if(RETURN_OK != flash_init(QSPI0))
    {
        mprintf("flash init error !!!\n");
        while(1);
    }
    /* FLASH 擦除4K*/
    if(RETURN_OK != flash_erase(QSPI0,flash_addr,(4 * 1024)))
    {
        mprintf("flash erase error !!!\n");
        while(1);
    }
    /* FLASH 写入数据*/
    if(RETURN_OK != flash_write(QSPI0,flash_addr,write_buf,size))
    {
        mprintf("flash write error !!!\n");
        while(1);
    }
    /* FLASH 读出数据*/
    if(RETURN_OK != flash_read(QSPI0,read_buf,flash_addr,size))
    {
        mprintf("flash read error !!!\n");
        while(1);
    }
    /* 比较写入和读出的数据*/
    if(memcmp(write_buf, read_buf, size))
    {
        mprintf("cmp error !!!\n");
        while(1);
    }
    else
    {
        //比较正确
    }
}

API 参考