切换到宽版
爱科技/爱创意/爱折腾;电子/数码爱好者的家!欢迎访问新版数码之家网站
  • 7001阅读
  • 16回复

单片机+CH340自制DS2431编程器,开放上位机和下位机代码 [复制链接]

上一主题 下一主题
离线胡奚曷
 

发帖
4596
M币
15799
专家
32
粉丝
161
只看楼主 正序阅读 我要置顶 楼主  发表于: 2017-06-30
1、概述
有朋友找我复制DS2431的程序。
1.1、DS2431
DS2431 是一款 1024 位 1-Wire® EEPROM芯片,由四个存储器页组成,每页 256 位。数据先被写入一个
8 字节暂存器中,经校验无误后复制到EEPROM存储器。其特点在于,四个存储器页相互独立,可以单独
设置写保护或EPROM仿真模式,在EPROM仿真模式下,所有位的状态只能从 1变成 0。DS2431通过一根
1-Wire总线进行通信。通信采用Dallas Semiconductor标准的 1-Wire协议。每个器件都有唯一 的、不能更改
的 64 位ROM地址码,该地址码由工厂光刻写入芯片。在一个多点的 1-Wire网络环境中,该地址码用于
对器件进行寻址。——节选自DS2431 spec.
1.2、应用
附件/PC板识别
医疗传感器校准数据存储
模拟传感器校准,包括 IEEE-P1451.4智能传感器
墨盒/碳粉打印盒识别
消费类产品的售后管理——节选自DS2431 spec.
1.3、加密原理
DS2431的资源包括64位的ROM ID,和1024位的ROM空间,因此可以对ID和ROM进行运算,即ID = F(ROM),
其中F就是加密函数。这样一来,即使复制了ROM数据也没有用,因为ROM ID是唯一的。除非能破解加密函数。
看来用直接复制的方法可能性不大,但是可以用MCU模拟ROM,模拟ROM的通信,ROM ID和ROM数据,这样
可以做到完全复制。
1.4、多余的话
虽然不一定能用,但是编程器还是要做的,DS2431比较冷门,TB上也有1-wire编程器卖,比较贵……
1.5、参考资料
官方手册
CH341界面
C#十六进制显示界面http://download.csdn.net/detail/crystal_lz/8155323

2、需求分析
略,边做边想

3、硬件设计
3.1、硬件框图




3.2、芯片选型
串口使用CH340便宜、稳定、简单
MCU使用的是飞思卡尔MC9S12G64 封装是QFP-32因此调试工具是BDM
大家可以根据需要把代码移植到熟悉的单片机上
3.3、原理图
略,没有画
3.4、实物图
需要特别说明的:DS2431的IO用1K上拉到5V,图中MCU和CH340已经做到一起了,
2个芯片都在下面,上面8脚的是CAN收发器,与主题无关


注意芯片有个空脚



4、界面设计
4.1、参考界面
参考论坛风铃夜思雨的作品,实现其部分功能即可。


4.2、设计界面(仿)
使用了上面的图标,HEX控件则使用了CSDN上下载的
图中进度条只是摆设,没有实现功能。
IDE则是VS2013



5、协议设计
本文为了偷懒,做的非常简单,无法称之为设计,通信格式如下


检验和就是累加,有兴趣的兄弟可以改为CRC

6、代码设计
其实代码也没有什么设计,想到什么写什么,下面是几个主要功能模块
6.1、自动识别串口端口
实现原理比较简单:枚举已知串口,发送读ID命令,等待响应ID是否是指定ID
由于代码控件不好使,所以直接截图


6.2、自动识别设备
override windows消息
在插上或移除设备后,可以重新识别


识别到之后,Detect按键有效,状态改为:Device state: Detect ROM


6.3、文件保存和打开
系统有对应的对话框控件,用BinaryRead读取文件到数组中


用BinaryWrite写入到文件中,其中如果有ROM ID则文件名用ROM ID


6.4、HexBox使用
将控件拖到form中,然后设置一下属性,form load时,全部填入0xFF

6.5、串口通信
太长了,就不介绍了e

7、MCU代码设计
IDE是CodeWarrior 5.1
bus clock为24M
串口波特率为1.5M

CH340 支持常用通讯波特率:50、75、100、110、134.5、150、300、600、900、1200、
1800、2400、3600、4800、9600、14400、19200、28800、33600、38400、56000、57600、76800、115200、
128000、153600、230400、460800、921600、1500000、2000000 等——节选自CH340 spec.
波特率尽量用上面的,这样误差小
7.1、工程界面
重点是ds2431和com


7.2、DS2431驱动程序
ds2431.c和ds2431.h
程序是网上找的,不方便发外链,其中用到的延时是真实的2倍
代码在附件中
7.3、Com程序,负责通信部分
收到数据,检查校验和,查找命令对应的函数

void Com_process(void)
{
    signed char ind;
    if(sci_ReceiveOk == true)
    {
        chsum = Com_getCheck(sci_ReceiveBuffer,sci_ReceiveBuffer[1]);
        if(chsum == 0xFF)
        {
            ind = getIndex(sci_ReceiveBuffer[0], strMsg, STR_MSG_LENGTH);
            if(ind >= 0)
            {
                (*strMsg[ind].fuc)();
            }
        }
        sci_ReceiveOk = false;
    }
}

7.4、串口接收数据
根据CMD和长度来判断接收完成,缺点是没有超时处理,一旦出错就完了

void Sci_receive(byte u8_channel, byte u8_data)
{
    switch(u8_channel)
    {
        case 0:
            #if defined(__USE_SCI0__)          
            switch(status)
            {
                case ST_HEAD:
                    sci_ReceiveOk = false;
                    indexOfReceive = 0;
                    if(u8_data & 0x50)
                    {
                        sci_ReceiveBuffer[indexOfReceive++] = u8_data;
                        status = ST_LENGTH;
                        //CANRIER_RXFIE = 0;/* disable CANrx interrupt */
                    }
                break;
                case ST_LENGTH:
                    if(u8_data > 3)
                    {
                        sci_ReceiveBuffer[indexOfReceive++] = u8_data;
                        status = ST_DATA;
                    }
                    else
                        status = ST_HEAD;
                break;
                case ST_DATA:
                    sci_ReceiveBuffer[indexOfReceive++] = u8_data;
                    if(indexOfReceive > (sci_ReceiveBuffer[1] - 2))
                    {
                        status = ST_CHECKSUM;
                    }
                break;
                case ST_CHECKSUM:
                    sci_ReceiveBuffer[indexOfReceive++] = u8_data;
                    status = ST_HEAD;
                    sci_ReceiveOk = true;
                    //CANRIER_RXFIE = 1; /* enable CANrx interrupt*/
                break;
            }
            #endif
            break;
        case 1:
            #if defined(__USE_SCI1__)


            #endif
            break;
        case 2:
            #if defined(__USE_SCI2__)
            #endif
            break;
    }
}
7.5、代码移植建议


8、使用方法
8.1、将串口插入电脑、然后打开软件,出现Detect按钮即识别到编程器


8.2、点击Detect识别ROM,识别到之后,编程相关按钮有效


8.3、打开bin文件


8.4、点击Auto按钮,出现如下对话框则成功



9、代码文件
9.1、单片机工程文件


9.2、上位机工程文件
VS2013


10、扩展应用
CH340支持与3.3V的单片机通信,因此CH340+MCU可以做成SPI flash编程器。
这里有SPI Flash的驱动代码
但是flash的容量比较大,读写时间长,上位机需要做开个Thread处理,串口协议也不能太简单


11、更新记录
11.1、2017.7.8更新添加9.2的上位机附件

[ 此帖被胡奚曷在2017-07-08 08:42重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖提到的人: @风铃夜思雨
本帖最近打赏记录:共3条打赏M币+37
M币换购:工善必利器,您的拆机好伴侣~数码之家X22精密型螺丝刀套装(拆客必备系列)
 
工欲善其事,必先利其器
离线elecfunwb

发帖
1539
M币
4506
专家
8
粉丝
15
只看该作者 16楼 发表于: 2018-09-02
HEX显示控件是这个开源项目吗?
http://hexbox.sourceforge.net/
离线frival

发帖
75
M币
17
专家
1
粉丝
8
只看该作者 15楼 发表于: 2018-09-02
一直找到风铃夜思雨编程器HEX编辑界面的控制,没想到这里碰到了,我找了N个都没有这个效果好看,最后也就这个样子了。
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线ehenyuanyi

发帖
1
M币
850
专家
0
粉丝
1
只看该作者 14楼 发表于: 2018-09-02
没有电路图!高手才能玩!我只能玩成品
离线zlj613
发帖
37
M币
-434
专家
0
粉丝
2
只看该作者 13楼 发表于: 2017-07-08
加油加油加油加油!
离线胡奚曷

发帖
4596
M币
15799
专家
32
粉丝
161
只看该作者 12楼 发表于: 2017-07-08
回 风铃夜思雨 的帖子
风铃夜思雨:没事, 用吧, 不就个图标嘛...... (2017-07-07 15:39) 回 风铃夜思雨 的帖子

谢谢

已经更新了上位机代码
工欲善其事,必先利其器

发帖
49673
M币
5881
专家
11
粉丝
152
只看该作者 11楼 发表于: 2017-07-07
没事, 用吧, 不就个图标嘛......
离线ljb250013335
发帖
1
M币
476
专家
0
粉丝
0
只看该作者 10楼 发表于: 2017-07-06
很不错,谢谢分享~
离线qq1329491328

发帖
36
M币
955
专家
3
粉丝
4
只看该作者 9楼 发表于: 2017-07-02
不错,那你很棒棒
离线函兮

发帖
292
M币
3176
专家
4
粉丝
24
只看该作者 8楼 发表于: 2017-07-01
小项目,大学问,谢谢分享

内容来自Android手机客户端

生命不息,折腾不止。
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个