網站導航:首頁開源項目 USB開源項目:Easy USB 51 Programer  

目錄導航

   
  1、項目簡介
USB開發基礎
1、USB接口的優點及開發難易度
2、USB設備的開發流程
3、USB接口芯片(USB控制器)的選擇
4、了解USB的通訊過程
5、USB命令(請求)和USB描述符
6、實例講解USB的枚舉(配置)過程
准備工作
1、需要哪些工具
2、電路原理圖
3、手工制作您的電路板
4、測試您的硬件
HID設備類
1、讓PC機找到我們的硬件
2、如何成爲一個HID設備(模擬鼠標)
3、如何成爲一個HID設備(模擬鍵盤)
4、如何與HID設備通訊(一)
5、如何與HID設備通訊(二)
6、51編程器的實現
Windows USB 驱动程序(自定义设备)
1、Windows驅動開發基礎
2、開發環境配置
3、第一个实例-Hello Wdm(一)
4、第一个实例-Hello Wdm(二)
5、真正的實例—驅動我們的實驗板
6、真正的實例—測試驅動程序
7、真正的實例—控制LED及讀取按鍵狀態
8、如何編寫應用程序
   

相关産品    淘寶網店
     
 

 
  更多...  
 
 
51編程器的實現 查看/参与此開源項目相关讨论
 

  這一節我們來實現一個比較實用的功能,那就是我們在項目簡介中提到的51編程器。

  通過前面的工作,實現編程器的功能其實已經非常簡單了,其工作原理就是上位機讀取HEX文檔,將其內容通過USB口發送給下位機主控芯片,主控芯片再根據目標單片機的寫時序將上位機傳過來的程序寫入即可。當然主機與設備間通訊需要事先定義好命令格式和數據格式。

一、HEX文件的格式

  要將HEX文件讀入並寫入目標芯片,必須弄清HEX文件的格式。

  Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。

記錄格式

  一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式。

:llaaaatt[dd...]cc

  每一組字母是獨立的一域,每一個字母是一個十六進制數字,每一域至少由兩個十六進制數字組成,下面是字節的描述.

  :冒号     是每一条Intel HEX记录的开始

  ll 是这条记录的长度域,他表示数据(dd)的字节数目。

  aaaa 是地址域,他表示数据的起始地址(如果是數據記錄,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址)

  tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型
  00 ----數據記錄      
  01 ----文件结束记录
  02 ----扩展段地址记录
  04 ----扩展线性地址记录

  dd   是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看ll域的说明。

  cc   是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对(不包括本效验字和冒号)所表示的十六进制数字(一对字母表示一个十六进制数,这样的一个十六进制数为一个字节)都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc。例如记录:
:0300000002005E9D
的校驗和:cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0x9D,用C語言的描述爲: 

 
  1. unsigned char cc;   
  2. cc=(unsigned char)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);   
  3. cc++;  

數據記錄

  Intel HEX文件由若干个數據記錄组成,一个數據記錄以一个回车和一个换行结束(回车为0x0D,换行为0x0A)

  比如下面的一条數據記錄

:10246200464C5549442050524F46494C4500464C33

10      是此行记录数据的字节数目
2462 是数据在内存<将要烧写的eprom地址>中的起始地址
00      是记录类型00(是一个數據記錄)
464C 到 464C 是数据
33      是此行记录的效验和

 擴展線性地址記錄(HEX86)

  擴展線性地址記錄也可稱爲32位地址記錄和HEX386記錄,這個紀錄包含高16(16-31位)位數據地址,這種擴展的線性記錄總是有兩個字節數據,像下面這樣:

:02000004FFFFFC

02   是记录的数据字节数目
0000  是地址域这在扩展地址记录中总是0000
04   是记录类型04(扩展地址记录)
FFFF   是高16位地址
FC     是记录效验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)

  当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,直到读到下一个扩展线性记录。

  绝对内存地址 = 數據記錄中的地址 + 移位后的扩展线性地址

扩展段地址记录 (HEX86)

  扩展段地址记录也被称为 HEX86记录,包含 4-19位的数据地址段,这个扩展段地址记录总是有两字节数据,如下:

:020000021200EA

02          是記錄中的數據字節數目
0000     是地址域,在擴展段地址記錄中,這個域總是0000
02         是記錄類型02(擴展段地址的標示)
1200     是该段的地址
EA        是效验和,计算如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h)

  当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从Intel HEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录。

绝对内存地址 = 數據記錄中的地址 + 移位后的扩展段地址

文件結束記錄(EOF)

  一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01。
  一個EOF記錄總是這樣:

:00000001FF

00  是記錄中數據字節的數目
0000 這個地址對于EOF記錄來說無任何意義
01  記錄類型是01(文件結束記錄標示)
FF  是效驗和,計算如下:
01h + NOT(00h + 00h + 00h + 01h)

二、定義主機與設備間命令和數據格式

  設備端已經定義了每幀數據長度爲64個字節。我們定義每幀前5個字節爲命令(主機發給設備)或狀態應答(設備發給主機),後面緊跟數據(若此幀傳送了數據)。命令(或狀態應答)均爲ASCII字符,下面分別進行介紹:                                                                                                                                                                             

1、“SETIC”

  • 方向:主機->設備
  • 功能:設定目標芯片型號
  • 數據:ASCII字符編碼,代表芯片型號,以NULL表示結尾
  • 應答:無應答

2、“ERASE”

  • 方向:主機->設備
  • 功能:擦除目標芯片
  • 數據:無
  • 應答:應答“OKAY_”(見第8項),若主機沒有收到任何應答則證明通訊失敗

3、“WRITE” 

  • 方向:主機->設備
  • 功能:向目標芯片中寫入程序或數據
  • 數據:第6和第7兩位表示要寫入的起始地址(第6位爲地址低爲,第7位爲地址高位);第8位爲數據長度;第9位開始是要寫入的數據
  • 應答:應答“OKAY_”(見第8項),若主機沒有收到任何應答則證明通訊失敗

4、“READ_”

  • 方向:主機<=>設備
  • 功能:主機發給設備時表示向目標芯片中讀取程序或數據,設備發給主機進表示讀取到的程序或數據
  • 數據:第6和第7兩位表示要讀取的起始地址(第6位爲地址低爲,第7位爲地址高位);第8位爲數據長度;第9位開始是要寫入(或已讀取到)的數據
  • 應答:和主機發給設備的格式一樣

5、“ENCPT”

  • 方向:主機->設備
  • 功能:加密目標芯片
  • 數據:無
  • 應答:應答“OKAY_”(見第8項),若主機沒有收到任何應答則證明通訊失敗

6、“ICOK_”

  • 方向:主機->設備
  • 功能:查詢目標芯片是否准備好
  • 數據:無
  • 應答:若目標芯片准備好應答“OKAY_”(見第8項),否則應答“ERROR”(見第7項)

7、“ERROR”

  • 方向:設備->主機
  • 功能:出錯
  • 數據:從第6位開始以NULL表示結尾的ASCII字符編碼,表示出錯信息

8、“OKAY_”

  • 方向:設備->主機
  • 功能:表示操作成功
  • 數據:無

 9、“TEST_”

  • 方向:主機->設備
  • 功能:表示對硬件進行測試(設置ZIP鎖緊各引腳狀態)
  • 數據:從第6位開始的六個字節,前5個字節代表ZIP鎖各引腳的狀態爲高或低,低位先發送,最低位對應ZIP1,個別位無意義,最後一個字節最低位爲1代表第1腳拉到12V,最高位爲1代表第31腳拉到12V

  目前已通過對AT89C2051、AT89C4051、AT89C51、AT89C52、AT89S51、AT89S52的測試,理論上這一套程序也能支持AT89C1051、AT89C55、AT89S53、AT89LV51、AT89LV52,我們下一步的工作將會對這些芯片進行測試。由于主控芯片(AT89C52)程序空間大小的限制,若還需要支持更多的芯片,可以選擇程序空間大一點的CPU,如AT89C55。希望廣大網友積極參與,使其支持更多的芯片。

這是上位機程序界面:

下載上位機程序

下載上位機源代碼(VC6)

下載下位機源代碼

 
 
 
本站程序由百合電子工作室開發和維護
Copyright @ baihe electric studio
渝ICP備09006681號-4