社区导航

 

搜索
查看: 2313|回复: 2

[原创] 【CH554式改评测】CH554的dataflash和ID

[复制链接]

3386

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-4-20 00:45 | 显示全部楼层 |阅读模式
本帖最后由 ljj3166 于 2018-4-20 00:47 编辑

今天大概了解了一下CH554的片上FLASH
1.png
片上FLASH分为4个空间:
数据、配置、BL以及应用代码
相对关注的是数据空间和配置空间
也就是data flash和Configuration Information

数据空间
data flash从C000到C0FF,256个字节
可以自由存储用户数据
官方例程已经完整给出这部分空间读写的代码
都在"./DataFlash/"的c文件中
主要就是WriteDataFlash和ReadDataFlash这两个操作函数
特别要注意函数传入的参数
譬如UINT8 ReadDataFlash(UINT8 Addr,UINT8 len,PUINT8 buf);
PUINT8其实是个指针类型,unsigne char *
搞得楼主懵逼了半天,到处找可爱的“*”运算符
撸两句bug看看
  1. UINT8X *tmp;
  2. ReadDataFlash(FLASHDATA_LEN_ADDR, 1, &flashdata_len);
  3.                 if ((flashdata_len < 0xFF) && (flashdata_len > 0))
  4.                 {
  5.                         printf("flashdata_len = %d\r\n", (UINT16)flashdata_len);
  6.                         ReadDataFlash(FLASHDATA_ADDR, flashdata_len, tmp);
  7.                         for(i = 0; i < flashdata_len; i++)
  8.                         {printf("%c",tmp[i]);}
  9.                         printf("\r\n");
  10.                 }
  11.                 else{}
复制代码

  1. if(send_flag == 0x01)
  2.                 {
  3.                         cnt = USB_RX_LEN;
  4.                         printf("get data_len = %d...\r\n", (UINT16)cnt);
  5.                         for(i = 0; i < cnt; i++)
  6.                         {tmp[i] = Ep2Buffer[i];printf("%c",tmp[i]);}

  7.                         WriteDataFlash(FLASHDATA_LEN_ADDR, &cnt, 1);
  8.                         WriteDataFlash(FLASHDATA_ADDR, tmp, cnt);

  9.                         send_flag = 0x00;
  10.                         memset(Ep2Buffer, '\0', THIS_ENDP0_SIZE);
  11.                         memset(tmp, '\0', cnt);
  12.                 }
  13.                 else {}
复制代码


大概意思就是
将PC发送过来的字符串保存到dataflash区0x01以后的空间
dataflash区的0x00保存接收到字符串的长度
先发一串试试
2.png
重启进BL模式
读取dataflash区的数据
3.png
确实正常写入了
这里报告一个ISP软件的BUG:
勾选“清空DataFlash”再下载后
无法清除目标芯片的dataflash区
可以通过手动填充的方式清空

操作系统环境windows7
ISP版本V2.40
不知道是不是楼主打开方式不对
reboot单板
4.png
确实可以正常读取dataflash区的数据
玩了一下下
感觉这256字节的存储区
更像是EEPROM
可以直接对数据进行修改
而不需要像flash一样要先擦除,再写入
可能是iFlash工艺
或者单片鸡在写入前有暗箱操作
要不为毛只有偶地址有效?嘿嘿。

配置信息区
Configuration Information空间处于3FF8到3FFF区域
这里头比较关注的就是唯一ID了
5.png
3FFC和3FFE两个地址处是16位数据
3FFA处是8位数据
码了3种读取方式
  1. UINT16 id[5];
  2.                 id[0] = CBYTE[0x3FFA];
  3.                 id[1] = CBYTE[0x3FFC];
  4.                 id[2] = CBYTE[0x3FFD];
  5.                 id[3] = CBYTE[0x3FFE];
  6.                 id[4] = CBYTE[0x3FFF];
  7.                 for(i = 0; i < 5; i++)
  8.                 {printf("id[%d] = 0x%02X ",(UINT16)i, id[i]);}
  9.                 printf("\r\n");
  10.                 printf("ID1 = 0x%02X, ID2 = 0x%02X, ID3 = 0x%02X, ID4 = 0x%02X, ID5 = 0x%02X....\r\n", (UINT16)(*((UINT8C *)(0x3FFA))), (UINT16)(*((UINT8C *)(0x3FFC))), (UINT16)(*((UINT8C *)(0x3FFD))),
  11.                                                 (UINT16)(*((UINT8C *)(0x3FFE))),(UINT16)(*((UINT8C *)(0x3FFF))));
  12.                 printf("ID1 = 0x%02X, ID2 = 0x%04X, ID3 = 0x%04X....\r\n", (UINT16)(*((UINT8 *)(0x3FFA))), *((UINT16 *)(0x3FFC)), *((UINT16 *)(0x3FFE)));
复制代码


打印结果如下
7.png
似乎前面两种才是正确的
为毛直接* (unsigned int *)读出的数据有误呢?
似乎是51核xdata、code寻址搞的鬼

碎觉....


此内容由EEWORLD论坛网友ljj3166原创,如需转载或用于商业用途需征得作者同意并注明出处




此帖出自单片机论坛
So what......

回复

使用道具 举报

63

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-2 18:06 | 显示全部楼层
dataflash只有128字节,只能操作偶地址。
ISP工具是旧版本的,目前官网版本V2.50,你可以下载替换试试看。
ID读法的话,第一种CBYTE[0x3FFA]; 这个变量类型是什么?
第二种是常用的访问方法,第三种类型不明确,编译器可能指向XDATA区域,不是CODE地址,要看编译器。

点评

报告班长,新版V2.50勾选清空DataFlash还是不能完成数据区的擦除功能  详情 回复 发表于 2018-5-8 23:38

回复

使用道具 举报

3386

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

 楼主| 发表于 2018-5-8 23:38 | 显示全部楼层
SuiBianLiuLiu 发表于 2018-5-2 18:06
dataflash只有128字节,只能操作偶地址。
ISP工具是旧版本的,目前官网版本V2.50,你可以下载替换试试看。 ...

报告班长,新版V2.50勾选清空DataFlash还是不能完成数据区的擦除功能
So what......

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-1 07:47 , Processed in 0.149400 second(s), 25 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表