Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SFUD
page256_or_1_byte_write
发布于 2020-02-14 21:02:50 浏览:1391
订阅该版
有个关于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.4k
关于作者
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
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部