当前位置: 首页 > news >正文

W25Q64中跨页写入数据

W25Q64中跨页写入数据

static uint8_t W25Q64_WriteFontBuffer(uint32_t addr, uint8_t *buf, uint32_t len, uint8_t type) {uint32_t pageRemain;uint8_t verifySuccess = 1;uint32_t totalWritten = 0;uint8_t singleRowLength = 0;// 字符数据缓冲区(调整为最大可能字符大小的2倍)static uint8_t charDataBuffer[MAX_CHAR_SIZE];static uint32_t charDataBufferIndex = 0;// 跨页字符处理状态static struct {uint8_t buffer[MAX_CHAR_SIZE]; // 跨页字符临时存储uint32_t stored;    // 已存储字节数uint32_t expected;  // 期望的字符总大小uint32_t startAddr; // 字符起始地址} crossPageChar = {0};uint32_t lastCharSize = 0;uint32_t lastCharOffset = 0;// 预分配缓冲区用于读取验证static uint8_t readBackBuf[W25Q64_PAGE_SIZE];// 按页写入(每页256字节),即单次写入最多是一页,即256字节while (len) {// 计算当前页剩余空间pageRemain = W25Q64_PAGE_SIZE - (addr % W25Q64_PAGE_SIZE);if (pageRemain > len)pageRemain = len;// 页编程写入数据W25Q64_PageProgram(addr, buf, pageRemain);// 读取回数据验证W25Q64_ReadBuffer(addr, readBackBuf, pageRemain);// 验证数据,逐字节比较,验证写入的数据与读取的数据是否一致for (uint32_t i = 0; i < pageRemain; i++) {if (readBackBuf[i] != buf[i]) {printf("Verify failed at addr=0x%06lX: wrote=0x%02X, read=0x%02X\n",addr + i, buf[i], readBackBuf[i]);verifySuccess = 0;break;}}if (!verifySuccess) {// 重置状态后返回charDataBufferIndex = 0;memset(&crossPageChar, 0, sizeof(crossPageChar));return 0;   // 数据验证失败};// 处理字符数据(如果验证成功)uint32_t offset = 0;while (offset < pageRemain) {uint32_t currentPos = totalWritten + offset;uint8_t *readData = NULL;uint32_t headerSize = 0;// 根据类型确定单行长度和头部大小switch (type) {case 0:  // ASCII_6x12singleRowLength = 12;headerSize = 16 + singleRowLength * (95 - 1);break;case 1:  // ASCII_8x16singleRowLength = 16;headerSize = 16 + singleRowLength * (95 - 1);break;case 2:  // ASCII_12x24singleRowLength = 48;headerSize = 16 + singleRowLength * (95 - 1);break;case 3:  // ASCII_16x32singleRowLength = 64;headerSize = 16 + singleRowLength * (95 - 1);break;case 4: // Chinese_12x12singleRowLength = 3 + 24;headerSize = 16 + singleRowLength * (2 - 1);break;case 5: // Chinese_16x16singleRowLength = 3 + 32;headerSize = 16 + singleRowLength * (20 - 1);break;case 6: // Chinese_24x24singleRowLength = 3 + 72;headerSize = 16 + singleRowLength * (2 - 1);break;case 7: // Chinese_32x32singleRowLength = 3 + 128;headerSize = 16 + singleRowLength * (2 - 1);break;}// 检查是否有路面字符需要继续处理if (crossPageChar.expected > 0) {uint32_t needed = crossPageChar.expected - crossPageChar.stored;uint32_t toCopy = (needed < (pageRemain - offset)) ? needed : (pageRemain - offset);memcpy(crossPageChar.buffer + crossPageChar.stored, readBackBuf + offset, toCopy);crossPageChar.stored += toCopy;offset += toCopy;// 如果完成了一个跨页字符if (crossPageChar.stored == crossPageChar.expected) {if (charDataBufferIndex + crossPageChar.expected <= MAX_CHAR_SIZE) {memcpy(charDataBuffer + charDataBufferIndex, crossPageChar.buffer, crossPageChar.expected);charDataBufferIndex += crossPageChar.expected;lastCharSize = crossPageChar.expected;lastCharOffset = crossPageChar.startAddr;} else {printf("Error: Character buffer overflow!\n");}memset(&crossPageChar, 0, sizeof(crossPageChar));}continue;}// 正常字符处理if (currentPos >= headerSize) {uint32_t charOffset = (currentPos - headerSize) % singleRowLength;uint32_t charStartPos = currentPos - charOffset;// 只有当这是字符的起始位置时才处理if (currentPos == charStartPos) {// 检查字符是否完整在当前页if ((offset + singleRowLength) <= pageRemain) {// 完整字符if (charDataBufferIndex + singleRowLength <= MAX_CHAR_SIZE) {memcpy(charDataBuffer + charDataBufferIndex,readBackBuf + offset,singleRowLength);charDataBufferIndex += singleRowLength;lastCharSize = singleRowLength;lastCharOffset = addr + offset;} else {printf("Error: Character buffer overflow!\n");}offset += singleRowLength;} else {// 字符跨页,保存第一部分uint32_t firstPart = pageRemain - offset;memcpy(crossPageChar.buffer,readBackBuf + offset,firstPart);crossPageChar.stored = firstPart;crossPageChar.expected = singleRowLength;crossPageChar.startAddr = addr + offset;offset += firstPart;}continue;}}// 非字符起始位置,单字节前进offset++;}// 更新指针和计数器addr += pageRemain;buf += pageRemain;len -= pageRemain;totalWritten += pageRemain;}// 打印最后一个字符数据if (charDataBufferIndex > 0) {// 打印标题const char *typeNames[] = {"ASCII_6X12", "ASCII_8X16", "ASCII_12X24", "ASCII_16X32","chinese_12x12", "chinese_16x16", "chinese_24x24", "chinese_32x32"};printf("\r\n---------------- Last Character Data (Type=%s) ----------------\r\n", typeNames[type]);printf("End row start address: 0x%06lX, Size: %lu bytes\r\n", lastCharOffset, lastCharSize);// 计算最后一个字符的起始位置uint32_t lastCharStart = (charDataBufferIndex >= lastCharSize) ?(charDataBufferIndex - lastCharSize) : 0;// 打印字符数据(16字节/行)for (uint32_t j = 0; j < lastCharSize; j++) {printf("[%lu]: 0x%02X ", j, charDataBuffer[lastCharStart + j]);if ((j + 1) % singleRowLength == 0)printf("\r\n");}printf("\r\n----------------------------------------------------------------\r\n");}// 重置缓冲区索引以备下次使用charDataBufferIndex = 0;memset(&crossPageChar, 0, sizeof(crossPageChar));return verifySuccess;
}
http://www.dtcms.com/a/323187.html

相关文章:

  • 总结-ArrayList的扩容机制和BigDecimal大数的底层
  • 机器学习DBSCAN密度聚类
  • 如何更改win11自带录音机所录制文件的存储路径
  • 禁用 WordPress 更新提示(核心、插件、主题)
  • 【重建技巧】Urban Scene Reconstruction-LoD细节提升
  • springBoot集成easyExcel 实现文件上传
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • 集成电路学习:什么是RViz机器人可视化工具
  • Java 时间和空间复杂度
  • 徘徊识别场景误报率↓77%:陌讯动态时序建模方案实战解析
  • 二叉搜索树的C语言实现
  • 《软件测试与质量控制》实验报告五 功能自动化测试
  • 掌握数据可视化:全局配置项详解
  • Java进阶之单列集合List接口下的通用方法
  • Ubuntu22.04 安装vitis2023.2 卡在“Generating installed device list“.
  • 【Datawhale AI夏令营】让AI读懂财报PDF(多模态RAG)(Task 2)
  • 用 C 语言深入理解 Linux 软链接:原理、API 与编程实践
  • 【CTF】PHP反序列化基础知识与解题步骤
  • Claude Code 的核心能力与架构解析
  • Alibaba Cloud Linux 3 生成 github 公钥
  • 【Word】行中包含英文字符致使下划线加粗的解决方法
  • 3款强力的Windows系统软件卸载工具
  • 理解协议最大传输单元(MTU)和TCP 最大报文段长度(MSS)
  • 力扣热题100------70.爬楼梯
  • 从零学习three.js官方文档(一)——基本篇
  • 每日五个pyecharts可视化图表-line:从入门到精通
  • 记录一次ubuntu20.04 解决gmock not found问题的过程
  • Spring 框架中提供Aware接口,实现感知容器对象
  • 机器学习——模型的简单优化
  • CPU缓存(CPU Cache)和TLB(Translation Lookaside Buffer)缓存现代计算机体系结构中用于提高性能的关键技术