搜索
bottom↓
回复: 15

春节有空,整理了AVR的CAN Bootloaer,希望抛砖引玉,共同研究

[复制链接]

出0入0汤圆

发表于 2011-2-8 02:15:08 | 显示全部楼层 |阅读模式
论坛似乎没看到有人研究CAN Bootloaer,AVR在国内也没有CAN的技术支持,只好自己发狠了。好在小有成果,AT90CAN128已经可以使用了。
单片机的CAN Bootloaer代码请参考Atmel官网发布的GCC版的CAN_Libraries_and_Examples,我将在附件中给出。AVR这几天改版了,竟然把它弄没了,只有IAR版的。GCC版的CAN_Libraries_and_Examples基本不需要修改,可以直接使用,只要把其中的IO口修改到和你的PCB一致、把晶震定义修改就可以了。
上位机使用Atmel官网发布的FLIP3.4.2,下载地址:http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3886
我使用的数据线是SYS TEC的USB转CAN,感觉挺好用。问题是这个东西很贵,我在考虑使用普通的串口转CAN的数据线,这就需要自己写上位机软件了,可这是我的弱项,只好慢慢啃了。打算用VB,VC太费时间。
下面是我侦测出来的FLIP3.4.2和CAN Bootloaer之间的通讯协议,更新中……
同时请参考GCC_CAN_bootloader-rev-1.1.0.pdf的说明


一、上位机与bootloader连接:
Request--PC发送,Answer--bootloader回复
其中53 54是帧头,无实际含义,2、3字节代表CAN的ID(高位在前),4字节代表CAN的帧类型--00数据帧,5字节是CAN的数据长度,6字节开始是CAN的数据(不一定满8个字节)  

53 54 00 00 00 01 FF       Request: 0x0000((“CRIS”<<4)+0)--ID_SELECT_NODE, len--1, FF--Node, Open or close communication
53 54 00 00 00 02 04 00    Answer:  0x0000((“CRIS”<<4)+0)--ID_SELECT_NODE, len--2, 04--Boot loader Version, 00--Communication closed

53 54 00 00 00 01 FF       Request: 0x0000((“CRIS”<<4)+0)--ID_SELECT_NODE, len--1, FF--Node, Open or close communication
53 54 00 00 00 02 04 01    Answer:  0x0000((“CRIS”<<4)+0)--ID_SELECT_NODE, len--2, 04--Boot loader Version, 01--Communication opened

如果bootloader回复01--Communication opened,PC将连续读取单片机以下数据:

先选择目标:53 54 06 00 00 03 01 02 00        Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len--3, 01--Select Memory space, Memory space02--Signature, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len--1, 00--Selection OK
再操作地址:53 54 03 00 00 05 00 00 00 00 00  Request: 0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len--5, 00--Display(read)data, 0x0000--Start Address, 0x0000--End Address
回复数据:  53 54 03 00 00 01 1E              Answer:  0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len--n=1, Data Read---MANUF_ID---0x1E---ATMEL

先选择目标:53 54 06 00 00 03 01 02 00        Request: 02--Signature, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 01 00 01  Request: --Display(read)data, Address:0x0001
回复数据:  53 54 03 00 00 01 81              Answer:  FAMILY_CODE---0x81---AT90CANxxx family

先选择目标:53 54 06 00 00 03 01 02 00        Request: 02--Signature, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 02 00 02  Request: --Display(read)data, Address:0x0002
回复数据:  53 54 03 00 00 01 97              Answer:  PRODUCT_NAME---0x97---128 Kbytes of Flash

先选择目标:53 54 06 00 00 03 01 02 00        Request: 02--Signature, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 03 00 03  Request: --Display(read)data, Address:0x0003
回复数据:  53 54 03 00 00 01 00              Answer:  PRODUCT_REV---0x00---Rev 0

先选择目标:53 54 06 00 00 03 01 03 00        Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len--3, 01--Select Memory space, Memory space03--Boot Loader Information, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 00 00 00  Request: --Display(read)data, Address:0x0000
回复数据:  53 54 03 00 00 01 04              Answer:  Boot loader Version 04

先选择目标:53 54 06 00 00 03 01 05 00        Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len--3, 01--Select Memory space, Memory space05--Device registers, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 E2 00 E2  Request: --Display(read)data, Address:0x00E2--CANBT1
回复数据:  53 54 03 00 00 01 08              Answer:  CANBT1 = 0x08

先选择目标:53 54 06 00 00 03 01 05 00        Request: 05--Device registers, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 E3 00 E3  Request: --Display(read)data, Address:0x00E3--CANBT2
回复数据:  53 54 03 00 00 01 0C              Answer:  CANBT2 = 0x0C

先选择目标:53 54 06 00 00 03 01 05 00        Request: 05--Device registers, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 E4 00 E4  Request: --Display(read)data, Address:0x00E4--CANBT3
回复数据:  53 54 03 00 00 01 37              Answer:  CANBT3 = 0x37

先选择目标:53 54 06 00 00 03 01 04 00        Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len--3, 01--Select Memory space, Memory space04--Boot Loader Configuration, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 00 00 00  Request: 0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len--5, 00--Display(read)data, 0x0000--Start Address, 0x0000--End Address--BSB_DEFAULT in boot_conf[0]
回复数据:  53 54 03 00 00 01 FF              Answer:  BSB = 0xFF

先选择目标:53 54 06 00 00 03 01 04 00        Request: 04--Boot Loader Configuration, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 02 00 02  Request: --Display(read)data, Address:0x0002--EB_DEFAULT in boot_conf[2]
回复数据:  53 54 03 00 00 01 FF              Answer:  EB = 0xFF

先选择目标:53 54 06 00 00 03 01 04 00        Request: 04--Boot Loader Configuration, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 01 00 01  Request: --Display(read)data, Address:0x0001--SSB_DEFAULT in boot_conf[1]
回复数据:  53 54 03 00 00 01 FF              Answer:  SSB = 0xFF

先选择目标:53 54 06 00 00 03 01 04 00        Request: 04--Boot Loader Configuration, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 08 00 08  Request: --Display(read)data, Address:0x0008--SA_H_DEFAULT(Start Application Word Address H) in boot_conf[8]
回复数据:  53 54 03 00 00 01 00              Answer:  SA_H = 0x00

先选择目标:53 54 06 00 00 03 01 04 00        Request: 04--Boot Loader Configuration, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
再操作地址:53 54 03 00 00 05 00 00 09 00 09  Request: --Display(read)data, Address:0x0009--SA_L_DEFAULT(Start Application Word Address L) in boot_conf[9]
回复数据:  53 54 03 00 00 01 00              Answer:  SA_L = 0x00

先选择目标:53 54 06 00 00 03 01 00 00        Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len--3, 01--Select Memory space, Memory space00--Flash Memory, Page00
回复OK:    53 54 06 00 00 01 00              Answer:  --Selection OK
准备Flash Memory操作

说明文档ourdev_614828XDS64J.pdf(文件大小:668K) (原文件名:GCC_CAN_bootloader-rev-1.1.0.pdf)
单片机bootloader代码ourdev_614829OOJ23B.zip(文件大小:7.40M) (原文件名:AT90CAN3264128 Software Library-can_bootloader-2007.zip)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-2-8 11:48:00 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-2-9 20:04:57 | 显示全部楼层
今天搞了一个上位机软件,实际是利用pei99888发布的VB软件修改而来。在此特别感谢pei99888先生!
只做了实现上面连接功能的简单修改,很不完善,其中许多是不需要的。也请对VB熟悉的TX不吝指教,谢谢!


(原文件名:TT截图未命名.JPG)

点击此处下载 ourdev_615043YAOKUR.rar(文件大小:9K) (原文件名:CAN_BootLoader.rar)

前面少传了一个说明文件,这里补上:
点击此处下载 ourdev_615136RT0J1Y.pdf(文件大小:250K) (原文件名:AT90CAN128-64-32_CAN Library.pdf)

出0入0汤圆

发表于 2011-2-9 20:32:12 | 显示全部楼层
zan

出0入0汤圆

发表于 2011-2-9 20:36:40 | 显示全部楼层
先顶一下

出0入0汤圆

 楼主| 发表于 2011-2-10 16:21:09 | 显示全部楼层
二、启动应用程序(单片机无回复):
2.1、跳转到地址启动应用程序
53 54 04 00 00 04 03 01 00 00  Request: 0x0004((“CRIS”<<4)+4)--ID_START_APPLI, len=4, 03 01 -- Start Application at W-Add., 00 00(0x0000--Jump W-Add.。该地址是前面连接时读取的Start Application Word Address)

2.2、复位启动应用程序
53 54 04 00 00 02 03 00        Request: 0x0004((“CRIS”<<4)+4)--ID_START_APPLI, len=2, 03 00 -- Start Application with reset

出0入0汤圆

发表于 2011-2-10 20:20:50 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-2-12 15:47:54 | 显示全部楼层
三、空检测:
3.1、存储器空
选择页面:53 54 06 00 00 03 02 00 00        Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len=3, 02--Select Page, Memory space00--Flash Memory, Page00
回复OK:  53 54 06 00 00 01 00              Answer:  0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len=1, 00--Selection OK
检测操作:53 54 03 00 00 05 80 00 00 FF FF  Request: 0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len=5, 80---Blank check, 0x0000--Start Address, 0xFFFF--End Address
回复成功:53 54 03 00 00 00                 Answer:  0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len=0, Blank check OK
选择页面:53 54 06 00 00 03 02 00 01        Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len=3, 02--Select Page,Memory space00--Flash Memory, Page01
回复OK:  53 54 06 00 00 01 00              Answer:  0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len=1, 00--Selection OK
检测操作:53 54 03 00 00 05 80 00 00 DF FF  Request: 0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len=5, 80--Blank check, 0x0000--Start Address, 0xDFFF--End Address
回复成功:53 54 03 00 00 00                 Answer:  0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len=0, Blank check OK

3.2、存储器不空
选择页面:53 54 06 00 00 03 02 00 00
回复OK:  53 54 06 00 00 01 00
检测操作:53 54 03 00 00 05 80 00 00 FF FF
回复不空:53 54 03 00 00 02 00 00           Answer:  0x0003((“CRIS”<<4)+3)--ID_DISPLAY_DATA, len=2--Error on Blank check, 0x0000--1st Failed Address

注:
1、前面已经存在“目标选择”和“回复OK”:
   选择目标:53 54 06 00 00 03 01 00 00 --- Select Memory space, Memory space00, Page00
   回复OK:  53 54 06 00 00 01 00       --- Selection OK
2、操作Flash Memory时,在选择目标后还要选择页面;
3、页面2的结束地址是0xDFFF,对应8K字节的BootLoader;
4、检测完成后因未改变已经选择的目标存储器,不需要再“目标选择”;
5、如果存储器不空,只回复第一个检测到的地址。

出0入0汤圆

发表于 2011-2-14 11:10:25 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-2-16 11:16:55 | 显示全部楼层
四、擦除:
先选择目标:53 54 06 00 00 03 01 00 00  Request: 0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len=3, 01--Select Memory space, Memory space00--Flash Memory, Page00
回复OK:    53 54 06 00 00 01 00        Answer:  0x0006((“CRIS”<<4)+6)--ID_SELECT_MEM_PAGE, len=1, 00--Selection OK
再执行擦除:53 54 01 00 00 03 80 FF FF  Request: 0x0001((“CRIS”<<4)+1)--ID_PROG_START, len=3, 80 FF FF -- Erasing
回复成功:  53 54 01 00 00 01 00        Answer:  0x0001((“CRIS”<<4)+1)--ID_PROG_START, len=1, 00

回复成功这条在GCC_CAN_bootloader-rev-1.1.0.pdf里竟然没有找到,其它版本的说明里也没有,很奇怪。但实际上是可用的,已经过验证。

出0入0汤圆

发表于 2011-4-6 20:48:55 | 显示全部楼层
厉害,建议阿莫给加个酷

出0入0汤圆

发表于 2011-4-6 22:55:45 | 显示全部楼层
楼主高手,COOL!

出0入0汤圆

发表于 2011-4-12 18:47:07 | 显示全部楼层
mark,有空研究下,期待楼主继续~~~~~

出0入0汤圆

 楼主| 发表于 2011-12-16 22:02:16 | 显示全部楼层
因为我今年忙另外一个项目,难道有时间继续研究.

后来把AES加密代码添加进去了,实际就是引用了shao的代码。

可惜shao的上位机代码是用delphi写的,我不懂。默认的加密是PC128,用起来挺麻烦。等有时间我再研究。

希望有更多的人一起研究CAN bootloader。

不知道是否有人使用C++或者VB写过AES加密。

出0入0汤圆

发表于 2019-2-11 14:57:01 | 显示全部楼层
先顶一下

出0入0汤圆

发表于 2020-5-23 13:48:11 | 显示全部楼层
顶一下,学习学习!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 18:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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