Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SFUD
page256_or_1_byte_write
发布于 2020-02-14 21:02:50 浏览:1334
订阅该版
有个关于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.3k
关于作者
freedom195
好好学习,天天向上
提问
33
回答
57
被采纳
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
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部