norflash与mcu之间主要通过SPI接口进行通信。
norflash的初始化主要包括SPI接口的初始化、分区创建及初始化操作。
详细过程:
初始化norflash访问的SPI接口
根据名字创建分区,如果该名字分区已经存在,则不创建
如果创建分区时,空间不足,返回错误
创建新分区时,该分区与其他分区是否存在重叠
int _norflash_init(const char *name, struct norflash_dev_platform_data *pdata)//初始化
{
log_info("norflash_init ! %x %x", pdata->spi_cs_port, pdata->spi_read_width);//打印CS引脚和位宽
if (_norflash.spi_num == (int) - 1) {
//SPI编号未初始化
_norflash.spi_num = pdata->spi_hw_num;//编号
_norflash.spi_cs_io = pdata->spi_cs_port;//CS引脚配置
_norflash.spi_r_width = pdata->spi_read_width;//位宽配置
_norflash.flash_id = 0;
_norflash.flash_capacity = 0;//flash的存储能力
os_mutex_create(&_norflash.mutex);//创建互斥信号量
_norflash.max_end_addr = 0;//最大的结束地址
_norflash.part_num = 0;//已使用的分区个数
}
ASSERT(_norflash.spi_num == pdata->spi_hw_num);
ASSERT(_norflash.spi_cs_io == pdata->spi_cs_port);
ASSERT(_norflash.spi_r_width == pdata->spi_read_width);
struct norflash_partition *part;
part = norflash_find_part(name);//根据名字查找part
if (!part) {
//没找到则可以根据这个name进行新建
part = norflash_new_part(name, pdata->start_addr, pdata->size);//新建
ASSERT(part, "not enough norflash partition memory in array\n");//空间不足
ASSERT(norflash_verify_part(part) == 0, "norflash partition %s overlaps\n", name);//检验是否重叠
log_info("norflash new partition %s\n", part->name);
} else {
ASSERT(0, "norflash partition name already exists\n");//名字已存在
}
return 0;
}
这里仅对指定name的分区进行了初始化操作。
norflash的打开操作首先判断是否被打开过,
没有被打开过,则需要进行SPI的初始化,
读取芯片的ID,通过芯片ID计算芯片的存储容量,
如果使能了缓存功能,则先从flash地址0处读4KB到缓存中,
将打开计数递增。
open函数主要是整个芯片的打开、初始化;init函数是分区的初始化。
int _norflash_open(void *arg)//打开
{
int reg = 0;
os_mutex_pend(&_norflash.mutex, 0);
log_info("norflash open\n");
if (!_norflash.open_cnt) {
//如果open cnt为0表示接口未打开,需初始化接口等
spi_cs_init();//片选引脚初始化
spi_open(_norflash.spi_num);//SPI打开
_norflash.flash_id = _norflash_read_id();//读芯片ID
log_info("norflash_read_id: 0x%x\n", _norflash.flash_id);//打印芯片ID
if ((_norflash.flash_id == 0) || (_norflash.flash_id == 0xffffff)) {
//读回来的为0或全F,表示错误
log_error("read norflash id error !\n");
reg = -ENODEV;
goto __exit;
}
//id号的最后一个字节表明芯片的存储空间大小
//通过换算计算flash存储空间
//例如WinBond FLASH W25X16最后一个ID为0x15,W25X32最后一个ID为0x16
//W25X16空间为2MB,W25X32为4MB
//W25X16空间大小计算:(ID & 0xFF) - 0x10 = 5
// 2^5 * 64KB = 2MB
_norflash.flash_capacity = 64 * _pow(2, (_norflash.flash_id & 0xff) - 0x10) * 1024;//计算存储空间大小
log_info("norflash_capacity: 0x%x\n", _norflash.flash_capacity)
norflash的基本操作
最新推荐文章于 2025-04-16 14:45:49 发布