Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SFUD
page256_or_1_byte_write
发布于 2020-02-14 21:02:50 浏览:1183
订阅该版
有个关于page256_or_1_byte_write 这个函数的问题 代码如下 ```static sfud_err page256_or_1_byte_write(const sfud_flash *flash, uint32_t addr, size_t size, uint16_t write_gran, const uint8_t *data) { sfud_err result = SFUD_SUCCESS; const sfud_spi *spi = &flash->spi; static uint8_t cmd_data[5 + SFUD_WRITE_MAX_PAGE_SIZE]; uint8_t cmd_size; size_t data_size; SFUD_ASSERT(flash); /* only support 1 or 256 */ SFUD_ASSERT(write_gran == 1 || write_gran == 256); /* must be call this function after initialize OK */ SFUD_ASSERT(flash->init_ok); /* check the flash address bound */ if (addr + size > flash->chip.capacity) { SFUD_INFO("Error: Flash address is out of bound."); return SFUD_ERR_ADDR_OUT_OF_BOUND; } /* lock SPI */ if (spi->lock) { spi->lock(spi); } /* loop write operate. write unit is write granularity */ while (size) { /* set the flash write enable */ result = set_write_enabled(flash, true); if (result != SFUD_SUCCESS) { goto __exit; } cmd_data[0] = SFUD_CMD_PAGE_PROGRAM; make_adress_byte_array(flash, addr, &cmd_data[1]); cmd_size = flash->addr_in_4_byte ? 5 : 4; /* make write align and calculate next write address */ SFUD_INFO("addr=%d ",addr); if (addr % write_gran != 0) { if (size > write_gran - (addr % write_gran)) { data_size = write_gran - (addr % write_gran); } else { data_size = size; } } else { if (size > write_gran) { data_size = write_gran; }else { data_size = size; } } size -= data_size; addr += data_size; memcpy(&cmd_data[cmd_size], data, data_size); result = spi->wr(spi, cmd_data, cmd_size + data_size, NULL, 0); if (result != SFUD_SUCCESS) { SFUD_INFO("Error: Flash write SPI communicate error."); goto __exit; } result = wait_busy(flash); if (result != SFUD_SUCCESS) { goto __exit; } data += data_size; } __exit: /* set the flash write disable */ set_write_enabled(flash, false); /* unlock SPI */ if (spi->unlock) { spi->unlock(spi); } return result; } ```最终是调用result = spi->wr(spi, cmd_data, cmd_size + data_size, NULL, 0); 将数据写入flash 在执行之前可以看到data_size的值并不等于入参size,会根据page的大小和地址做改变,flash 每次写入应该写入一个page 那么若地址为page的起始地址,长度小于page,是不是应该先读取一个page的内容,然后在memcpy写入的数据,然后在写入page, 若地址不为page的起始地址,那么要考虑写入的长度是否在两个page内。 不知道我这样的理解对不对,但是这个函数并没有读取的操作。 还是说flash可以不以page进行写操作的么?
查看更多
0
个回答
默认排序
按发布时间排序
ZBXY_7941
2020-06-19
这家伙很懒,什么也没写!
在这个程序中 make_adress_byte_array(flash, addr, &cmd_data[1]); cmd_size = flash->addr_in_4_byte ? 5 : 4; 这两句代码是啥作用?您可以讲解一下吗?
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
1.2k
关于作者
freedom195
好好学习,天天向上
提问
30
回答
53
被采纳
1
关注TA
发私信
相关问题
1
【分享】如何使用 SFUD 库来操作 SPI Flash 设备
2
SFUD怎么使用
3
请教大家一下关于 SFUD 的的问题
4
移植sfud
5
使用SFUD操作FLASH
6
env使用easyflash不是3.2.4版本,而且没有type插件?
7
新增了W25X32设备成功,无法格式化
8
easyflash随着数据存储量增加,耗费时间加长
9
关于SFDP的问题
10
spi nand flash 能使用SFUD驱动吗
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
NXP MCXN947测评(二)ETH设备使用
2
【RA8D1-Vision Board】适配 LVGL V8
3
VISION BOARD 第二弹 基础工程配置和点亮一个LED灯
4
musb移植问题记录【设备注册3次挂起】
5
关于使用CherryUSB时候使用外挂的usb phy 芯片配置的一点注意事项
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
Hardfault
CAN总线
FinSH
USB
文件系统
RT-Thread
DMA
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
keil_MDK
编译报错
socket
MicroPython
GD32
msh
Debug
ulog
SDIO总线
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
本月问答贡献
xiaorui
7
个答案
3
次被采纳
sakumisu
4
个答案
3
次被采纳
三世执戟
31
个答案
1
次被采纳
梦笑真美
18
个答案
1
次被采纳
踩姑娘的小蘑菇
14
个答案
1
次被采纳
本月文章贡献
Z_Y
2
篇文章
5
次点赞
Alipay
2
篇文章
3
次点赞
2345vor
2
篇文章
1
次点赞
比特饼干
1
篇文章
6
次点赞
Lu_盼盼
1
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部