数码之家

标题: 制作便宜好用的N76E003的ICP烧录器(新年礼物) [打印本页]

作者: 2545889167    时间: 2019-2-2 11:36
标题: 制作便宜好用的N76E003的ICP烧录器(新年礼物)
本帖最后由 2545889167 于 2019-2-2 11:47 编辑

来新站的第一帖 这个帖子算是送给玩单片机的朋友的新年礼物吧

一、起因

最近在玩N76E003这个片子 总的来说 这个片子还是不错的 一块钱的样子--便宜; 18K Flash,256字节SRAM,768字节XRAM--够大 12位ADC 比stm8s003多了两个IO

虽然比起stm8s003还是有不少劣势 但是也算是各有所长 有意思玩玩的
但是 N76E003对于普通爱玩玩的爱好者来说,入门的工具成本不低。这个芯片出厂不带LDROM,第一次至少要用官方工具nu-link来烧录boot(LDROM),才可以用串口ISP下载。
但是呢 这个nulink价格不菲(买一个下载器 够买50个N76E芯片了),就算可以自己DIY 主控芯片也不好买(官方店经常缺货 还要22大洋的邮费 实际算下来没便宜多少)
[attach]32985[/attach]
贵就不说了 关键是还相当难用,ICP和ISP软件的设计都是相当反人类。操作复杂 要点半天,设置一堆才能下载。对于量产批量烧录/离线烧录,确实方便,但是对于调试程序过程,频繁修改烧录 操作起来确实繁琐。
果然嫌官方软件烦的朋友不止我一个 在老站就有大神发过自己写的ISP下载软件 链接:http://bbs.mydigit.cn/read.php?tid=2542081 追求下载快速 操作方便
在我之前做的stm8的swim编程器的帖子下面 有好几个朋友问我能不能也弄个N76E的编程器

http://bbs.mydigit.cn/read.php?tid=2217902&page=12

[attach]32991[/attach]
那会儿我已经搞到下载时序了,自己搞了烧写LDROM用的工具,没有完善功能 这次年前有空 整理了下 做出一个完整的烧写工具

二、编程器的DIY教程
正式开始

首先编程工具由两部分组成
一部分是编程器实体  一部分是上位机软件 通过usb免连接 不需要驱动

diy教程是教怎么做编程器实体
选用的是一颗很便宜的带usb的51芯片 ch552g

编程器的程序资源占用很小 不到1k的sram 整整4k的flash(实际更便宜的ch551资源足够,只不过我手上木有)
[attach]32987[/attach]

价格如图

嘉立创价格
[attach]32996[/attach]
淘宝价格  优信电子卖1.5元 可以说非常便宜了(在带usb的单片机里面 算是最便宜的了 当然除了usb 别的外设比较垃圾)
[attach]33005[/attach]


ch552这个芯片还有个好处 可以自己通过USB下载,免去了购买下载器


电路非常非常简单  

就MCU主控 LDO 三颗电容 两颗电阻 usb座子 按键一个
因为非常简单 所以直接感光制版完成

实物图

[attach]33003[/attach]
电路原理图
[attach]32988[/attach]
参考布局图
[attach]32997[/attach]
[attach]32998[/attach]
给ch552下载程序(程序在文末附件)
1 断电
2 按下原理图上S1按键 上拉高D+ 不松手

3 插上usb

就进入boot了(此时下载软件会提示找到CH552)
[attach]33006[/attach]
这是烧录软件可以识别到 按步骤下载 就完成烧录器制作了
烧录软件(见附件)
[attach]32989[/attach]

完成烧录器 插上usb 第一次会提示人体工学设备(HID) 会显示设备名字叫 N76E_ICP_Tool  当然不同电脑系统 可能提示不一样



上位机部分

整个程序用C#写成
[attach]33009[/attach]
需要安装.net 4.0
出现如图错误:程序打开提示”应用程序正常初始化(0xc0000135)失败“的错误,就是需要安装.NET Framework4.0
微软官方下载地址 https://www.microsoft.com/en-US/ ... ation.aspx?id=17718
[attach]33008[/attach]

只要正确安装了.net 4.0  实测在windows XP上是可以正常运行的,并且不需要额外的运行库 也不需要安装任何的驱动
[attach]33007[/attach]




作者: 2545889167    时间: 2019-2-2 11:37
二、编程器的使用教程

这楼专门介绍怎么使用编程器

首先是编程器和目标板的连接 需要接5条线
供电VCC GND  (供电可以是3.3V也可以说5V 当然也可以不从下载器供电 这个根据具体需求)
下载数据 SCK SDA RST

其中SCK和SDA在图中已经框出

[attach]33021[/attach][attach]33026[/attach]

接下来 编程器和电脑通过usb连接


打开编程器软件(软件可以自动识别编程器的连接状态 但是编程器与下载目标的状态需要手动操作)
点击连接就可以连接上目标(接线正确)

[attach]33015[/attach]
最慢烧录情况用时  完整写入18K的flash+不进行优化擦写+校验

[attach]33012[/attach]
如果开启整片擦除的+完整写入18K的flash+校验  能快一些

[attach]33013[/attach]
在要下载的固件很大的时候 整片擦除必去单扇区擦除会快很多 因为每擦除一个扇区用时大于10ms 整芯片由18k/256字节=72个扇区 至少需要720ms
但是整片擦除只需要约300+ms就可以  相反的 如果内容少 不进行整片擦除会快些
同时 如果开启了优化擦写和速度的选项 可以有效的减少擦除和写入 同时也缩短了烧录时间


对于配置位的设置和烧录 设置专门的页面来设置配置位的内容

[attach]33016[/attach]
设计布局和操作  这里就参考了下官方的ISP

[attach]33019[/attach]
操作注释  可以对照芯片手册 配置字 一章查看具体细节

[attach]33017[/attach]
[attach]33049[/attach]

同时 对于LDROM的烧录地址 在这里设置
[attach]33018[/attach]

另一个方面 考虑到本工具是偏向于程序调试而不是量产
因此提供一个串口功能
根据引脚定义 可以看到 新塘官方很贴心的下载口配置了一组串口 那么正好就可以利用一下了  ---省去了重复接线占用IO且麻烦
[attach]33136[/attach]
编程器在不进行下载操作的时候 可以开启串口功能 直接和目标板进行串口调试信息通讯
也可以勾选 下载后打开串口  默认会在下载后自己打开串口
[attach]33014[/attach]
串口回环测试
因为是提供HID协议来模拟串口 受到带宽限制 所以这个串口性能不是太好 首先波特率不能太高 其次可能高速/大量数据会有丢包问题

作为调试串口115200一下波特率理论上问题不大

当然作为一个附赠功能 就凑合用用吧~

[attach]33022[/attach]

同时支持一个方便操作的功能

要下载的文件 可以拖拽载入 免去打开路径的麻烦

[attach]33094[/attach]
同时 次下载的时候 会自动重载文件,也就是说 编译后 不需要重新打开文件 会自动加载最新(当然只是后台刷新了 前台界面显示的不会刷新,需要点一下 “查看”按钮)



最后要提到的一点 是配置信息的储存和载入
随软件的N76E_ICP.EXE.config文件 储存这文件设置的参数
请不要删除,并保持文件名与EXE文件一致,同时不建议手动更改配置文件的内容,以免格式不对造成错误
[attach]33020[/attach]
里面内容是这样的 整个软件所有可设置的参数都记录在其中

[attach]33023[/attach]
点击载入配置可以载入其他的配置文件
另一方面 程序启动的时候也会自动载入随exe的配置文件

点击保存配置 可以保存设置好的下载参数/下载文件路径 下次打开省去繁琐重复的设置 直接可用 方便!(注意 个人强迫症习惯原因 软件关闭的时候不会自动记录 需要手动保存 )

[attach]33024[/attach]

next


作者: 2545889167    时间: 2019-2-2 11:37
附件下载:
[attach]33091[/attach]

最后感谢坛友 @jcdzxh

此处约法三章:
1、严禁用于商业用途
2、拒绝伸手党,下载附件请猛砸m币,如果没有m币的,请积极回帖。不要下载了东西,跟没来过似的~
3、希望大家使用以后 有bug及时反馈 有好的意见 想法 欢迎提出来


一摘使瓜好,再摘令瓜稀。三摘尚自可,摘绝抱蔓归。





做个电解电容耐压测试/稳压二极管测试仪(N76E003开源)
https://www.mydigit.cn/forum.php?mod=viewthread&tid=78297



补充内容 (2019-10-6 21:04):
N76E003的ICP烧录器固件更新-支持解锁上锁芯片(国庆礼物)
https://www.mydigit.cn/forum.php?mod=viewthread&tid=81921
作者: 韩小羽    时间: 2019-2-2 12:14
这个厉害,感谢楼主,看来主控芯片我是白买了
作者: 触景情伤    时间: 2019-2-2 13:10
厉害了!这玩意儿能撸新塘全系列还是就一个76003?
32大佬出来的都是精品啊!
作者: wc5095928    时间: 2019-2-2 13:18
你还在用感光板啊 我用感光板不好用就用热转印了
作者: 温力口    时间: 2019-2-2 13:20
谢谢分享,楼主很强大。。。。




STM32F103C8T6小开发板烧录新唐N76E003
https://www.mydigit.cn/forum.php?mod=viewthread&tid=219663


作者: 2545889167    时间: 2019-2-2 13:33
触景情伤 发表于 2019-2-2 13:10
厉害了!这玩意儿能撸新塘全系列还是就一个76003?
32大佬出来的都是精品啊! ...

只有N76E003 其他系列不感兴趣
作者: 2545889167    时间: 2019-2-2 13:33
wc5095928 发表于 2019-2-2 13:18
你还在用感光板啊 我用感光板不好用就用热转印了

我只有喷墨打印机 没法 哈哈~
作者: 烤乳猪    时间: 2019-2-2 14:24
占个楼在看贴
作者: 搅搅震    时间: 2019-2-2 14:51
STM8还不会玩的过来围观大佬精品贴。
作者: sadate    时间: 2019-2-2 16:17
楼主,出套件吧,广大群众都期盼啊:lol:
作者: 触景情伤    时间: 2019-2-2 19:21
5楼是机器人啊,真好奇是什么语言这么强大…
作者: acbear    时间: 2019-2-2 19:32
楼主辛苦了,太厉害了!
作者: 不吃白菜    时间: 2019-2-2 20:39
:cry:喷墨打印机的路过 很无奈 啊
作者: wjxhone    时间: 2019-2-3 14:15
楼主真厉害,居然用这个廉价的单片机做出了这么实用的工具。我看到网上有用CH552做的25系列FLASH 烧录器,烧写速度比CH341快多了,希望楼主也能搞个出来造福网友。
作者: 2545889167    时间: 2019-2-3 22:15
wjxhone 发表于 2019-2-3 14:15
楼主真厉害,居然用这个廉价的单片机做出了这么实用的工具。我看到网上有用CH552做的25系列FLASH 烧录器, ...

你看我老站的帖子 我有做过 25芯片的烧录器的帖子 速度完爆ch341 你去翻翻
作者: sadate    时间: 2019-2-4 14:36
2545889167 发表于 2019-2-3 22:15
你看我老站的帖子 我有做过 25芯片的烧录器的帖子 速度完爆ch341 你去翻翻

楼主年后能出套件么?
作者: ckvlhf    时间: 2019-2-5 00:49
顶一个,成本降低了很多!
作者: lailai518    时间: 2019-2-5 06:29
新年快乐!~


收藏了,楼主技术很强大,
作者: fsss007    时间: 2019-2-6 09:47
这个要
作者: king8    时间: 2019-2-6 20:24
看见技术贴就顶!
STM8还不会玩的过来围观大佬精品贴。
作者: elecfunwb    时间: 2019-2-6 23:49
这个就真的厉害了,我倒是对CH552感兴趣了
作者: springvirus    时间: 2019-2-7 14:23
新唐的很多板子,都自带nulink me啊,为啥自己折腾
作者: 江小g    时间: 2019-2-7 15:17
确实是降低了开发和烧写成本啊

话说楼主有没有遇到过CH552的兼容性问题,就是在部分电脑/接口上面没法认到USB设备的问题?
作者: 2545889167    时间: 2019-2-7 23:02
springvirus 发表于 2019-2-7 14:23
新唐的很多板子,都自带nulink me啊,为啥自己折腾

带是带 问题是我没有啊。你要是能送我一两片,那我也不折腾好了 哈哈
作者: 98xpj    时间: 2019-2-8 11:47
强烈支持一下作者的作品。:smile:
作者: 2545889167    时间: 2019-2-9 12:04
果然没啥人看 看来是白激动了 哎……
作者: youhm    时间: 2019-2-9 14:20
2545889167 发表于 2019-2-9 12:04
果然没啥人看 看来是白激动了 哎……

新版人来的少,过年人又少些呢
作者: zzdtsz    时间: 2019-2-9 14:56
过来是膜拜大神的,顺祝大家新年快乐!
作者: 面条数码    时间: 2019-2-9 18:25
这个要支持,搞了一堆便宜的N76E003,这个教程实在太好了。
作者: xiaodaishu    时间: 2019-2-11 18:21
能不能用上POS机的芯片下载?更节省
作者: 2545889167    时间: 2019-2-12 10:12
江小g 发表于 2019-2-7 15:17
确实是降低了开发和烧写成本啊

话说楼主有没有遇到过CH552的兼容性问题,就是在部分电脑/接口上面没法认到 ...

没遇过 感觉是程序的问题吧
作者: 海岛椰子树    时间: 2019-2-12 10:27
虽然我不懂。但是还是要积极配合。
作者: 海岛椰子树    时间: 2019-2-12 10:37
2545889167 发表于 2019-2-3 22:15
你看我老站的帖子 我有做过 25芯片的烧录器的帖子 速度完爆ch341 你去翻翻

你好,可以咨询一下,这个CH552可以支持512页面的SPI芯片吗?
作者: aacyxjz    时间: 2019-2-12 11:38
谢谢分享,楼主很强大。。。。
这么好的帖子,才看到,学习了。木分啦,帮顶~回头补上
作者: akikyoua    时间: 2019-2-12 16:59
厉害呀,膜拜
作者: lisingch    时间: 2019-2-12 17:20
本来也想弄几片N76E003玩玩可是没编程器,这下解决问题了:lol:谢谢了!
作者: armauk    时间: 2019-2-13 17:36
官方的软件真不好用
作者: blywq    时间: 2019-2-13 18:51
虽然什么都不懂,还是要积极学习一下。
作者: ljlun    时间: 2019-2-13 19:24
这款MCU真够便宜的
作者: alexi2008    时间: 2019-2-13 23:16
赞赞赞
作者: 海岛椰子树    时间: 2019-2-14 22:23
你好,可以咨询一下,这个CH552可以支持512页面的SPI芯片吗?这个时候可是跟情人约会的时候。我还是坚持住。
作者: 2545889167    时间: 2019-2-14 22:49
海岛椰子树 发表于 2019-2-14 22:23
你好,可以咨询一下,这个CH552可以支持512页面的SPI芯片吗?这个时候可是跟情人约会的时候。我还是坚持住 ...

这个是软件的问题 。另外 我做这个不是烧录spi芯片的
作者: zzs09    时间: 2019-2-18 08:52
2545889167 发表于 2019-2-2 11:37
附件

感谢作者的分析,虽然我也看不懂:cry:
作者: liubin    时间: 2019-2-18 10:36
谢谢了,下回来玩玩玩
作者: youhm    时间: 2019-2-18 16:25
用洞洞板搭了一个,用楼主提供的软件在设备列表里始终找不到设备,官网下载最新版的就可以了,可能下载固件有所修改。
另外打开楼主的上位程序提示不支持的编程设备,不知道什么情况,不过对N76E003编程没有问题,感谢楼主分享!
或许有朋友也会遇到,官网下载地址:http://www.wch.cn/downloads/WCHISPTool_Setup_exe.html
作者: 2545889167    时间: 2019-2-18 21:55
youhm 发表于 2019-2-18 16:25
用洞洞板搭了一个,用楼主提供的软件在设备列表里始终找不到设备,官网下载最新版的就可以了,可能下载固件 ...

好奇怪啊 有图看看嘛
作者: zyyn123    时间: 2019-2-19 09:41
谢谢楼主分享,也买几片单片机玩玩
作者: youhm    时间: 2019-2-19 11:31
2545889167 发表于 2019-2-18 21:55
好奇怪啊 有图看看嘛

如图所示,编程烧写正常


作者: 2545889167    时间: 2019-2-19 13:22
youhm 发表于 2019-2-19 11:31
如图所示,编程烧写正常

好奇怪,我这里就没出现,不过既然不影响,就凑合用吧。
作者: 2545889167    时间: 2019-2-19 13:23
youhm 发表于 2019-2-19 11:31
如图所示,编程烧写正常

对了 你用的ch55x完整型号是啥?
作者: youhm    时间: 2019-2-19 15:17
2545889167 发表于 2019-2-19 13:23
对了 你用的ch55x完整型号是啥?

CH552G,下面一排编号405845822,起初以为买的便宜了,几乎要放弃了,1.35还包邮买了10片。
作者: 2545889167    时间: 2019-2-19 21:36
youhm 发表于 2019-2-19 15:17
CH552G,下面一排编号405845822,起初以为买的便宜了,几乎要放弃了,1.35还包邮买了10片。 ...

和我一样啊,好奇怪的毛病
作者: 面条数码    时间: 2019-2-20 14:51
洞洞板弄了一个,找不到0.1uf的电容,用了个1uf的电容。出现读配置失败,怎么搞都是75%就失败了。郁闷!

作者: 面条数码    时间: 2019-2-21 22:59
19和20两个脚都要弄0.1uf电容,否则各种问题。弄了两个电容,好了,非常感谢!
作者: 125589    时间: 2019-2-22 21:29
一摘使瓜好,再摘令瓜稀。三摘尚自可,摘绝抱蔓归。

好诗,好诗,路过,帮顶:loveliness:
作者: kkstun    时间: 2019-2-24 13:52
LDROM刷哪个好用呢,怎么选4k或者2k还是1k?
作者: 百里128    时间: 2019-2-24 18:43
感谢大神的付出!
作者: 1980a    时间: 2019-2-24 19:08
顶一个,真棒
作者: 2545889167    时间: 2019-2-24 22:38
kkstun 发表于 2019-2-24 13:52
LDROM刷哪个好用呢,怎么选4k或者2k还是1k?

一般用不到ldrom吧。这个是你自己的事情了,你自己写n76e的程序 自己弄IAP升级与否的事情
作者: xiaodaishu    时间: 2019-2-25 20:34
大神,能不能用pos机芯片做个pic编程器
作者: 2545889167    时间: 2019-2-25 21:09
xiaodaishu 发表于 2019-2-25 20:34
大神,能不能用pos机芯片做个pic编程器

不玩PIC和AVR这些 帮不上忙
作者: sadate    时间: 2019-2-27 13:47
2545889167 发表于 2019-2-25 21:09
不玩PIC和AVR这些 帮不上忙

CH552G做个Flash烧录器呢?
作者: 笔墨三千画倾城    时间: 2019-2-28 21:31
楼主好厉害
作者: 贪恋你的美。    时间: 2019-3-2 10:49
感谢楼主的分享:handshake:
作者: 喜羊羊    时间: 2019-3-6 13:20
我觉得nulink没什么毛病啊,直接在编译器上点仿真下进去就好啦啊,还能单步调试:sweat:
作者: zjs423315    时间: 2019-3-12 20:08
我这个水平只看看算了
作者: tempchar    时间: 2019-3-14 16:03
楼主,请教下
这个ISP的USB是HID双向64字节通讯?
你开发这个需要了解N76E003的烧写协议才行吧,这个烧写协议应该怎么找?
作者: 2545889167    时间: 2019-3-14 18:56
tempchar 发表于 2019-3-14 16:03
楼主,请教下
这个ISP的USB是HID双向64字节通讯?
你开发这个需要了解N76E003的烧写协议才行吧,这个烧写协 ...

是的,64字节
21ic有个帖子
作者: stdzlqz    时间: 2019-3-14 19:12
3.3v电压直接从芯片16脚取不可以吗?
作者: 2545889167    时间: 2019-3-14 21:40
stdzlqz 发表于 2019-3-14 19:12
3.3v电压直接从芯片16脚取不可以吗?

那个电流太小了,不足够供应
作者: tempchar    时间: 2019-3-15 14:56
2545889167 发表于 2019-3-14 18:56
是的,64字节
21ic有个帖子

ICP烧录脉冲详解 那个帖子?逻辑分析仪拿来干这事还真是方便

还有印象中usb hid报告传输是不可靠的,需要自己确认送达和发送,这个需要自己在ch552程序里实现吗?
作者: 2545889167    时间: 2019-3-15 18:48
tempchar 发表于 2019-3-15 14:56
ICP烧录脉冲详解 那个帖子?逻辑分析仪拿来干这事还真是方便

还有印象中usb hid报告传输是不可靠的,需 ...

没听说过也没遇到你说的不可靠
作者: sz丁丁    时间: 2019-3-16 21:48
谢谢楼主分享,楼主很强大。
作者: 236131948    时间: 2019-3-17 01:05
小白膜拜。。。。。。,,,
作者: 朱汝棠    时间: 2019-3-20 13:53
楼主强大,过来学习学习:lol:
作者: 贪恋你的美。    时间: 2019-3-22 07:18
感谢楼主分享,自制成功,都正常,谢谢
作者: tempchar    时间: 2019-3-30 20:32
楼主介意我写个java版本的ICP上位机软件吗?
java版本的适用范围可能会稍微广一些,譬如弄个香橙派树莓派也能插上设备跑ICP上位机软件。

刚才用java测试了下,能和hid设备通信是没问题的。

  1. package nir.desktop.demo;

  2. import java.util.List;

  3. import javax.usb.UsbConfiguration;
  4. import javax.usb.UsbConst;
  5. import javax.usb.UsbControlIrp;
  6. import javax.usb.UsbDevice;
  7. import javax.usb.UsbDeviceDescriptor;
  8. import javax.usb.UsbEndpoint;
  9. import javax.usb.UsbException;
  10. import javax.usb.UsbHostManager;
  11. import javax.usb.UsbHub;
  12. import javax.usb.UsbInterface;
  13. import javax.usb.UsbInterfacePolicy;
  14. import javax.usb.UsbPipe;
  15. import javax.usb.event.UsbPipeDataEvent;
  16. import javax.usb.event.UsbPipeErrorEvent;
  17. import javax.usb.event.UsbPipeListener;

  18. public class UsbConn {
  19.     private static final short VENDOR_ID = 0x5131;
  20.     private static final short PRODUCT_ID = 0x2007;
  21.     private static UsbPipe pipe_r, pipe_s;
  22.     @SuppressWarnings("unchecked")
  23.     public static UsbDevice connUsbHidDev(UsbHub hub) {
  24.         UsbDevice launcher = null;

  25.         for (UsbDevice device : (List<UsbDevice>) hub.getAttachedUsbDevices()) {
  26.             if (device.isUsbHub()) {
  27.                 launcher = connUsbHidDev((UsbHub) device);
  28.                 if (launcher != null)
  29.                     return launcher;
  30.             } else {
  31.                 UsbDeviceDescriptor desc = device.getUsbDeviceDescriptor();
  32.                 if (desc.idVendor() == VENDOR_ID
  33.                         && desc.idProduct() == PRODUCT_ID) {
  34.                     System.out.println("find device:" + device);
  35.                     return device;
  36.                 }
  37.             }
  38.         }
  39.         return null;
  40.     }
  41.     public static void sendMessage(UsbDevice device, byte[] message)
  42.             throws UsbException {
  43.         UsbControlIrp irp = device
  44.                 .createUsbControlIrp(
  45.                         (byte) (UsbConst.REQUESTTYPE_TYPE_CLASS | UsbConst.REQUESTTYPE_RECIPIENT_INTERFACE),
  46.                         (byte) 0x09, (short) 2, (short) 1);
  47.         irp.setData(message);
  48.         device.syncSubmit(irp);
  49.     }
  50.         public static void main_send_receive(String[] args){
  51.         UsbDevice device;
  52.         try {
  53.             device = connUsbHidDev(UsbHostManager.getUsbServices()
  54.                     .getRootUsbHub());
  55.             if (device == null) {
  56.                 System.out.println("usb hid dev not found.");
  57.                 System.exit(1);
  58.                 return;
  59.             }
  60.             UsbConfiguration configuration = device.getActiveUsbConfiguration();
  61.             UsbInterface iface = configuration.getUsbInterface((byte) 0);
  62.             iface.claim(new UsbInterfacePolicy() {
  63.                 @Override
  64.                 public boolean forceClaim(UsbInterface arg0) {
  65.                     return true;
  66.                 }
  67.             });
  68.             System.out.println("Now open endpoint pip.");
  69.             UsbEndpoint endpoint02r = (UsbEndpoint)iface.getUsbEndpoints().get(1);
  70.                         byte[] date2read = new byte[64] ;
  71.                         UsbPipe pipe = endpoint02r.getUsbPipe();
  72.                         pipe.open();
  73.             UsbEndpoint endpoint_s = (UsbEndpoint)iface.getUsbEndpoints().get(0);
  74.                         byte[] date2send = {(byte) 0x00,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  75.                                                                 (byte) 0x10,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  76.                                                                 (byte) 0x20,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  77.                                                                 (byte) 0x30,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  78.                                                                 (byte) 0x40,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  79.                                                                 (byte) 0x50,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  80.                                                                 (byte) 0x60,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  81.                                                                 (byte) 0x70,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07  };
  82.                         UsbPipe pipe2send = endpoint_s.getUsbPipe();
  83.                         pipe2send.open();
  84.                         int count = 0 ;
  85.                         long lastTimeMilli = System.currentTimeMillis() ;
  86.                         while(true){
  87.                         int sended = pipe2send.syncSubmit(date2send) ;
  88.                         System.out.println(sended + "bytes send\r\n") ;
  89.                         int received = pipe.syncSubmit(date2read) ;
  90.                         System.out.println(received + "bytes received\r\n") ;
  91.                         count ++ ;
  92.                         if(count %100 == 0 ){
  93.                                 System.out.print( System.currentTimeMillis() - lastTimeMilli ) ;
  94.                                 System.out.print("\n");
  95.                                 lastTimeMilli = System.currentTimeMillis();
  96.                         }
  97.                         for(int ii = 0 ; ii < 8 ; ii ++ ){
  98.                                 for(int jj = 0 ; jj < 8 ; jj ++ ) {
  99.                                         System.out.printf("%x\t", date2read[ii*8 + jj] ) ;
  100.                                 }
  101.                                 System.out.print("\r\n");
  102.                         }
  103.                         for(int kk = 0 ; kk < 8 ; kk ++ )date2send[kk*8] ++ ;
  104.                         }                       
  105.         } catch (Exception e) {
  106.             
  107.             e.printStackTrace();
  108.         } finally {
  109.             
  110.         }
  111.         }
  112.     public static void main(String[] args) {
  113.         UsbDevice device;
  114.         try {
  115.             device = connUsbHidDev(UsbHostManager.getUsbServices()
  116.                     .getRootUsbHub());
  117.             if (device == null) {
  118.                 System.out.println("usb hid dev not found.");
  119.                 System.exit(1);
  120.                 return;
  121.             }
  122.             UsbConfiguration configuration = device.getActiveUsbConfiguration();
  123.             UsbInterface iface = configuration.getUsbInterface((byte) 0);
  124.             iface.claim(new UsbInterfacePolicy() {

  125.                 @Override
  126.                 public boolean forceClaim(UsbInterface arg0) {
  127.                     return true;
  128.                 }
  129.             });
  130.             System.out.println("Now open endpoint pip.");
  131.             UsbEndpoint endpoint02r = (UsbEndpoint)iface.getUsbEndpoints().get(1);
  132.                         byte[] date2read = new byte[64] ;
  133.                         UsbPipe pipe = endpoint02r.getUsbPipe();
  134.                         pipe.open();
  135.             UsbEndpoint endpoint_s = (UsbEndpoint)iface.getUsbEndpoints().get(0);
  136.                         byte[] date2send = {(byte) 0x00,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  137.                                                                 (byte) 0x10,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  138.                                                                 (byte) 0x20,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  139.                                                                 (byte) 0x30,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  140.                                                                 (byte) 0x40,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  141.                                                                 (byte) 0x50,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  142.                                                                 (byte) 0x60,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07,
  143.                                                                 (byte) 0x70,(byte) 0x01,(byte) 0x02,(byte) 0x03,(byte) 0x04,(byte) 0x05,(byte) 0x06,(byte) 0x07  };
  144.                         UsbPipe pipe2send = endpoint_s.getUsbPipe();
  145.                         pipe2send.open();
  146.                         int count = 0 ;
  147.                         long lastTimeMilli = System.currentTimeMillis() ;
  148.                         while(true){
  149.                         int received = pipe.syncSubmit(date2read) ;
  150.                         count ++ ;
  151.                         if(count %100 == 0 ){
  152.                                 System.out.print( System.currentTimeMillis() - lastTimeMilli ) ;
  153.                                 System.out.print("\n");
  154.                                 lastTimeMilli = System.currentTimeMillis();
  155.                         }
  156.                         for(int kk = 0 ; kk < 8 ; kk ++ )date2send[kk*8] ++ ;
  157.                         }
  158.         } catch (Exception e) {
  159.             e.printStackTrace();
  160.         } finally {
  161.         }
  162.     }
  163. }
复制代码

作者: 2545889167    时间: 2019-3-31 01:30
tempchar 发表于 2019-3-30 20:32
楼主介意我写个java版本的ICP上位机软件吗?
java版本的适用范围可能会稍微广一些,譬如弄个香橙派树莓派也 ...

不介意 并且非常欢迎
作者: kkstun    时间: 2019-4-1 00:42
楼主真棒,我用ch551也成功了。
作者: kkstun    时间: 2019-4-3 15:25
本帖最后由 kkstun 于 2019-4-3 19:02 编辑

@2545889167
配置字烧写出错 不知道什么问题。
之前有时候烧写错误,好像是排线问题,换了短的没出错了,但是这个配置子始终没法烧写。

作者: sjh_7366    时间: 2019-4-3 15:43
强烈支持一下作者的作品。
作者: 2545889167    时间: 2019-4-3 23:16
kkstun 发表于 2019-4-3 15:25
@2545889167
配置字烧写出错 不知道什么问题。
之前有时候烧写错误,好像是排线问题,换了短的 ...

你说换线能成功,那么是不是 你布线之类的有问题?我看看你电路实物?
作者: yubinwu    时间: 2019-4-5 16:04
mask下,以后有M币的时候下载
作者: kkstun    时间: 2019-4-5 19:44
2545889167 发表于 2019-4-3 23:16
你说换线能成功,那么是不是 你布线之类的有问题?我看看你电路实物?

哈哈。试了好几天才解决。
作者: 老矿工    时间: 2019-4-9 19:40
:smile:想学习一下楼主的思路,希望尽快能下载源码,可怜的M币,新手还直接是负数,好可怜。:cry:
作者: 老矿工    时间: 2019-4-10 09:04
老矿工 发表于 2019-4-9 19:40
想学习一下楼主的思路,希望尽快能下载源码,可怜的M币,新手还直接是负数,好可怜。 ...

谢谢youhm,:handshake:
作者: 老矿工    时间: 2019-4-12 09:42
再来顶顶帖子,这种方式很好,让大多新手能快速学到更多东西,即使不会也能借鉴良多:smile:
作者: 老腿123    时间: 2019-4-20 21:24
碉堡了,膜拜学习,能否给个21ICn介绍协议帖子的连接。
作者: 老腿123    时间: 2019-4-20 21:41
老腿123 发表于 2019-4-20 21:24
碉堡了,膜拜学习,能否给个21ICn介绍协议帖子的连接。

自己回一下 找到了 :ICP烧录脉冲详解
作者: 西点钟    时间: 2019-4-21 00:53
附件里面是上位机软件,还是烧录器程序了?
作者: 2545889167    时间: 2019-4-21 11:05
西点钟 发表于 2019-4-21 00:53
附件里面是上位机软件,还是烧录器程序了?

都有,全套的
作者: 李花生    时间: 2019-4-21 14:09
新手没M币,顶一个吧
:cry:
作者: jsycwnw    时间: 2019-4-21 17:11
虽然我单片机盲,但知道这是優秀文章
作者: liangcha    时间: 2019-4-22 09:56
2545889167 发表于 2019-3-31 01:30
不介意 并且非常欢迎

想弄个linux版本,可惜没积分下载
作者: liangcha    时间: 2019-4-22 16:44
2545889167 发表于 2019-4-21 11:05
都有,全套的

能否把上机位与烧录器通讯的报文公开出来?
作者: 2545889167    时间: 2019-4-23 12:51
liangcha 发表于 2019-4-22 16:44
能否把上机位与烧录器通讯的报文公开出来?

可以,等我上传
作者: 2545889167    时间: 2019-4-23 13:02
本帖最后由 2545889167 于 2019-4-23 13:08 编辑
liangcha 发表于 2019-4-22 16:44
能否把上机位与烧录器通讯的报文公开出来?

协议如下:
[attach]152427[/attach]
参考下位机代码:
  1. //ICP的指令处理函数
  2. void ICP_CMD_ASK(void)
  3. {
  4.         uint8_t cache;
  5.         uint16_t Now_Addr;
  6.         if(Write_Check_ASK)//如果置检查 但是数据指令不对 取消检查
  7.         {
  8.                 if((HID_RX_Data_Buff[0]&0x1f)!=0x05)Write_Check_ASK=FALSE;
  9.         }
  10.         switch(HID_RX_Data_Buff[0]&0x1f)//高3位为细节码
  11.         {
  12.                 case 0x01://测试编程器
  13.                         if(HID_RX_Data_Buff[1]==0x5A)//符合规则
  14.                         {
  15.                                 HID_TX_Data_Buff[0]=0x01;
  16.                                 HID_TX_Data_Buff[1] = //编程器ID0
  17.                                 HID_TX_Data_Buff[2] = //编程器ID1
  18.                                 HID_TX_Data_Buff[3] = //编程器ID2
  19.                                 HID_TX_Data_Buff[4] = //编程器ID3
  20.                                 HID_TX_Data_Buff[5] = //编程器ID4
  21.                                 HID_TX_Data_Buff[6] = //编程器ID5
  22.                                 HID_TX_Data_Buff[7] = //编程器固件版本号        
  23.                                 HID_TX_Data_Buff[8] = //编程器硬件版本号        
  24.                                 HID_TX_Data_Buff[9] = 0x10;
  25.                                 TX_Service(10);
  26.                         }
  27.                 break;
  28.                 case 0x02://连接目标
  29.                         UART_Close();//连接目标的时候 自动关闭串口
  30.                         HID_TX_Data_Buff[0]=0x02;
  31.                         HID_TX_Data_Buff[1]=0xff;
  32.                         HID_TX_Data_Buff[1]=N76E003_ICE_Enter_ICE();
  33.                         TX_Service(2);
  34.                         if(HID_TX_Data_Buff[1]==0x02)//型号不对的机型 要退出ICE
  35.                         {
  36.                                 N76E003_ICE_Quit_ICE();
  37.                         }
  38.                 break;        
  39.                 case 0x03://断开连接
  40.                         HID_TX_Data_Buff[0]=0x03;
  41.                         TX_Service(1);//这里因为没有ask 所以先退出再执行操作
  42.                         N76E003_ICE_Quit_ICE();
  43.                 break;        
  44.                         case 0x04://读取 支持多包读取
  45.                         HID_TX_Data_Buff[0]=0x04;
  46.                         ICP_Read_Mulit_Package();        //多包传输        
  47.                 break;        
  48.                         case 0x05:
  49.                                 ICP_Write_Mulit_Package();
  50.                 break;        
  51.                         case 0x06://多扇区擦除
  52.                                 ((uint8_t*)&Now_Addr)[0]=HID_RX_Data_Buff[3];//计算地址
  53.                                 ((uint8_t*)&Now_Addr)[1]=HID_RX_Data_Buff[2];        
  54.                                 N76E003_ICE_Erase_APROM(Now_Addr,HID_RX_Data_Buff[1]);
  55.                                 HID_TX_Data_Buff[0]=0x06;
  56.                                 HID_TX_Data_Buff[1]=0x01;
  57.                                 TX_Service(2);
  58.                 break;                                
  59.                
  60.                 case 0x07://整片擦除
  61.                         HID_TX_Data_Buff[0]=0x07;
  62.                         if(HID_RX_Data_Buff[1]==0xC2)//符合规则
  63.                         {
  64.                                 HID_TX_Data_Buff[1]=0x01;
  65.                                 N76E003_ICE_Erase_Chip();//这个有点慢               
  66.                         }
  67.                         else
  68.                         {
  69.                                 HID_TX_Data_Buff[1]=0x00;
  70.                         }
  71.                         TX_Service(2);
  72.                 break;        
  73.                 case 0x08:
  74.                         HID_TX_Data_Buff[0]=0x08;
  75.                         N76E003_ICE_Read_Config(&HID_TX_Data_Buff[1]);
  76.                         TX_Service(5);
  77.                 break;
  78.                 case 0x09:
  79.                         HID_TX_Data_Buff[0]=0x09;
  80.                         cache=HID_RX_Data_Buff[1];
  81.                         cache+=HID_RX_Data_Buff[2];
  82.                         cache+=HID_RX_Data_Buff[3];
  83.                         cache+=HID_RX_Data_Buff[4];
  84.                         if(cache==HID_RX_Data_Buff[5])
  85.                         {
  86.                                  HID_TX_Data_Buff[1]=1;
  87.                                 N76E003_ICE_Write_Config(&HID_RX_Data_Buff[1]);
  88.                                 N76E003_ICE_Read_Config(&HID_TX_Data_Buff[2]);
  89.                         }
  90.                         else
  91.                         {
  92.                                 HID_TX_Data_Buff[1]=0;
  93.                                 HID_TX_Data_Buff[2]=cache;
  94.                         }
  95.                         TX_Service(6);
  96.                 break;
  97.                 case 0x0A:
  98.                         UART_Init();
  99.                 break;
  100.                 default:
  101.                         
  102.                 break;        
  103.         }
  104. }



  105. void ICP_Write_Mulit_Package(void)
  106. {
  107.     uint16_t Now_Addr;//当前读取地址
  108.     ((uint8_t*)&Now_Addr)[0]=HID_RX_Data_Buff[3];//计算地址
  109.     ((uint8_t*)&Now_Addr)[1]=HID_RX_Data_Buff[2];   
  110.     if(HID_RX_Data_Buff[0]==0x05)//单包直写
  111.     {
  112.         N76E003_ICE_Write_APROM(Now_Addr,&HID_RX_Data_Buff[4],HID_RX_Data_Buff[1]);
  113.         HID_TX_Data_Buff[0]=0x05;
  114.         HID_TX_Data_Buff[1]=0x01;
  115.         TX_Service(2);
  116.         return;        
  117.     }
  118.     else//复合包
  119.     {
  120.         Check_nums=HID_RX_Data_Buff[1];//记录检查数量
  121.         Check_addr=HID_RX_Data_Buff[2]&0x7f;//记录小地址
  122.         if(HID_RX_Data_Buff[4]==1)
  123.         {
  124.             Block_ALL_FF=TRUE;//默认都是对的
  125.             Block_Same=TRUE;
  126.             Write_To_Do=FALSE;//不执行
  127.             Write_Addr=Now_Addr&0xff80;//记录扇区地址        
  128.             Write_cmd=HID_RX_Data_Buff[0];
  129.         }
  130.         else if(HID_RX_Data_Buff[4]==3)
  131.         {
  132.             Write_To_Do=TRUE;//执行
  133.         }
  134.         memcpy(&ICP_Write_Buff[Check_addr],&HID_RX_Data_Buff[5],Check_nums);//吧数据搬运到128K缓存区
  135.         Write_Check_ASK=TRUE;//请求检查
  136.     }
  137. }

复制代码




作者: sstim    时间: 2019-4-24 21:48
非常感谢,学习一下




欢迎光临 数码之家 (https://www.mydigit.cn/) Powered by Discuz! X3.4