【CH554式改评测】CH554的dataflash和ID
<div class='showpostmsg'> 本帖最后由 ljj3166 于 2018-4-20 00:47 编辑今天大概了解了一下CH554的片上FLASH
片上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看看
UINT8X *tmp;
ReadDataFlash(FLASHDATA_LEN_ADDR, 1, &flashdata_len);
if ((flashdata_len < 0xFF) && (flashdata_len > 0))
{
printf("flashdata_len = %d\r\n", (UINT16)flashdata_len);
ReadDataFlash(FLASHDATA_ADDR, flashdata_len, tmp);
for(i = 0; i < flashdata_len; i++)
{printf("%c",tmp);}
printf("\r\n");
}
else{}
if(send_flag == 0x01)
{
cnt = USB_RX_LEN;
printf("get data_len = %d...\r\n", (UINT16)cnt);
for(i = 0; i < cnt; i++)
{tmp = Ep2Buffer;printf("%c",tmp);}
WriteDataFlash(FLASHDATA_LEN_ADDR, &cnt, 1);
WriteDataFlash(FLASHDATA_ADDR, tmp, cnt);
send_flag = 0x00;
memset(Ep2Buffer, '\0', THIS_ENDP0_SIZE);
memset(tmp, '\0', cnt);
}
else {}
大概意思就是
将PC发送过来的字符串保存到dataflash区0x01以后的空间
dataflash区的0x00保存接收到字符串的长度
先发一串试试
重启进BL模式
读取dataflash区的数据
确实正常写入了
这里报告一个ISP软件的BUG:
勾选“清空DataFlash”再下载后
无法清除目标芯片的dataflash区
可以通过手动填充的方式清空
操作系统环境windows7
ISP版本V2.40
不知道是不是楼主打开方式不对
reboot单板
确实可以正常读取dataflash区的数据
玩了一下下
感觉这256字节的存储区
更像是EEPROM
可以直接对数据进行修改
而不需要像flash一样要先擦除,再写入
可能是iFlash工艺
或者单片鸡在写入前有暗箱操作
要不为毛只有偶地址有效?嘿嘿。
配置信息区
Configuration Information空间处于3FF8到3FFF区域
这里头比较关注的就是唯一ID了
3FFC和3FFE两个地址处是16位数据
3FFA处是8位数据
码了3种读取方式
UINT16 id;
id = CBYTE;
id = CBYTE;
id = CBYTE;
id = CBYTE;
id = CBYTE;
for(i = 0; i < 5; i++)
{printf("id[%d] = 0x%02X ",(UINT16)i, id);}
printf("\r\n");
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))),
(UINT16)(*((UINT8C *)(0x3FFE))),(UINT16)(*((UINT8C *)(0x3FFF))));
printf("ID1 = 0x%02X, ID2 = 0x%04X, ID3 = 0x%04X....\r\n", (UINT16)(*((UINT8 *)(0x3FFA))), *((UINT16 *)(0x3FFC)), *((UINT16 *)(0x3FFE)));
打印结果如下
似乎前面两种才是正确的
为毛直接* (unsigned int *)读出的数据有误呢?
似乎是51核xdata、code寻址搞的鬼
碎觉....
此内容由EEWORLD论坛网友ljj3166原创,如需转载或用于商业用途需征得作者同意并注明出处
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> dataflash只有128字节,只能操作偶地址。
ISP工具是旧版本的,目前官网版本V2.50,你可以下载替换试试看。
ID读法的话,第一种CBYTE; 这个变量类型是什么?
第二种是常用的访问方法,第三种类型不明确,编译器可能指向XDATA区域,不是CODE地址,要看编译器。 SuiBianLiuLiu 发表于 2018-5-2 18:06
dataflash只有128字节,只能操作偶地址。
ISP工具是旧版本的,目前官网版本V2.50,你可以下载替换试试看。 ...
报告班长,新版V2.50勾选清空DataFlash还是不能完成数据区的擦除功能
页:
[1]