int WriteFlashAcrossPages(unsigned int addr, unsigned char *buf, unsigned int len)
{
#define PAGE_SIZE 256
unsigned int i,j,k;//用于循环的计数器
unsigned int page_num;
unsigned int page_offset;
unsigned int page_addr;
unsigned int endpage_addr;
unsigned int page_remain;
unsigned int buf_offset;
unsigned int buf_remain;
unsigned int page_buf[PAGE_SIZE];//用于存储读取的页数据
page_offset = addr % PAGE_SIZE; //页内待写入数据的起始偏移量
page_remain = PAGE_SIZE - page_offset; //当前页剩余可写入空间
page_num = (len-page_remain) / PAGE_SIZE+1; //循环进行次数(首页加上完整页数)
page_addr=addr-page_offset; //起始地址所在页的首地址
endpage_addr=page_addr+PAGE_SIZE*page_num;//最后一页的首地址,条件为真说明跨两页,条件为假说明跨多页(len-page_remain)<=PAGE_SIZE? page_addr+PAGE_SIZE :
buf_offset = 0; //待写入数据在buf中的起始偏移量
buf_remain = len; //待写入数据的剩余长度,随着写入数据,len不断减小
// 写入数据
for (i = 0; i < page_num; i++)
{
// 读取页数据
FlashAddr_read(page_addr, page_buf, PAGE_SIZE);
// 拷贝数据
//memcpy(page_buf + page_offset, buf + buf_offset, page_remain);//string.h中定义的,从"buf + buf_offset"位置开始拷贝"page_remain"个字节到"page_buf + page_offset"位置开始的地址中,第一个参数是目标地址,第二个参数是源地址,第三个参数是拷贝的字节数。
for (j = 0; j < page_remain; j++)
{
*(page_buf + page_offset + j) = *(buf + buf_offset + j);
}
// 写入页数据
FlashAddr_program(page_addr, page_buf, PAGE_SIZE);
// 更新参数
page_addr += PAGE_SIZE;//下一页的首地址
buf_offset += page_remain;//buf内的偏移每次要加上写入的数据长度
buf_remain -= page_remain;//和buf_remain-=buf_offset一样的
page_offset = 0;//后面所有的页内偏移都是0,因为是写入完整的一页
page_remain = PAGE_SIZE;//剩余可写入空间也是完整的一页空间
}
// 剩余数据
if (buf_remain > 0)
{
// 读取页数据
FlashAddr_read(endpage_addr, page_buf, PAGE_SIZE);
// 拷贝数据
//memcpy(page_buf + page_offset, buf + buf_offset, buf_remain);//page_offset=0 ,page_buf + page_offset=pagebuf
for (k = 0; k < buf_remain; k++)
{
*(page_buf + page_offset + k) = *(buf + buf_offset + k);
}
// 写入页数据
FlashAddr_program(endpage_addr, page_buf, PAGE_SIZE);
}
return 0;
}
跨页写入循环只执行了一次,哪里出问题了呢?