page256_or_1_byte_write

发布于 2020-02-14 21:02:50
有个关于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
被浏览
344
0 个回答
ZBXY_7941
ZBXY_7941 2020-06-19
在这个程序中
make_adress_byte_array(flash, addr, &cmd_data[1]);
cmd_size = flash->addr_in_4_byte ? 5 : 4;
这两句代码是啥作用?您可以讲解一下吗?
暂无答案,快来添加答案吧

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友