為了增加大家 DIY 的樂趣,XiaomaGee今天為大家只做了一篇使用iTool2內建的USB轉I2C來讀寫EEPROM的方法和程式碼。
iTool2簡介
iTool2為銀杏公司面向電子類研發工程師推出的一款多功能除錯工具箱,其具有使用方便、功能強大等諸多優點。本文利用iTool2內建的USB轉 I2C功能,基於MinGW32平臺完成對24XX系列的EEPROM的讀寫。
MinGW平臺
平臺簡介
MinGW是Minimalist GNU for Windows的縮寫。它是一個可自由使用和自由釋出的Windows特定標頭檔案和使用GNU工具集匯入庫的集合,允許你在GNU/Linux和Windows平臺生成本地的Windows程式而不需要第三方C執行時(C Runtime)庫。(摘自於百度百科)。
下載與安裝
MinGW可以通過乙太網自由獲取,其官方網址如下:
可以通過官網的Download 標籤下載MinGW最新的發行版的安裝工具。下面地址不保證長期有效:
http://nchc.dl.sourceforge.net/project/mingw/Installer/mingw-get-setup.exe
下載後執行可執行檔案,它便會自行下載並安裝MinGW32 工具集,預設資料夾為C盤根目錄下。
新增系統路徑
由於MinGW工具為命令列執行,並且沒有IDE,為了方便使用,一般需要把工具集加入到系統路徑裡面。具體方法為在“系統屬性”裡的“環境變數”功能裡的 Path 變數下加入如下路徑。(根據安裝目錄決定)
c:\MinGW\bin;
原始檔組成
程式碼基於MinGW開發平臺的,包含以下原始檔:
1、 ico.rc 可執行程式圖示資源描述
2、 itool2.ico 可執行程式圖示檔案
3、 main.c 主程式
4、 usb.c usb轉i2c功能底層程式碼
5、 usb.h usb轉 i2c 功能標頭檔案
6、 makefile makefile檔案
構建可執行檔案
若MinGW平臺安裝成功且路徑配置好,通過命令提示符進入原始檔資料夾後,可執行下面命令完成程式編譯。
出現上圖訊息即說明工程編譯構建成功。同時也會在本資料夾內產生一個名字為iTool2_eeprom.exe的可執行檔案,如下圖所示。
硬體連線
由於沒有定製化的硬體測試平臺,所以本技術筆記硬體需要自行搭建,且只適合有一定動手能力的朋友,硬體連線如下圖所示。
圖中8腳晶片實為24LC04B,與iTool2連線共有四根線,分別為I2C的SDA / SCL訊號線及3.3V / GND 供電線。
軟體流程圖
為了更好的對EEPROM 進行讀寫測試,本軟體按照如下流程圖進行測試。
首先產生100個位元組隨機數(以時間為種子);然後把100個位元組按順序寫入EEPROM中,寫入完成後再把100個位元組讀出來並與寫入的數值進行匹配,然後顯示匹配結果。
執行結果
相關資源及連線
1、iTool2簡易手冊:
http://files.cnblogs.com/files/xiaomagee/iTool2%E6%89%8B%E5%86%8CV1.0.pdf
2、iTool2 購買地址:
https://item.taobao.com/item.htm?id=19090288084
3、程式碼包下載:
http://pan.baidu.com/s/1mgixgDU
4、本文PDF 下載:
http://pan.baidu.com/s/1kTvqxBD
附錄:核心程式碼
usb.c:
1 /* 2 * USB.C 3 * 4 * CH341H Driver. 5 * Designed By XiaomaGee 2015.11.05 6 * 7 * 8 */ 9 10 //--------------include files----------------// 11 #include <stdio.h> 12 #include <stdlib.h> 13 #include "usb.h" 14 15 //--------------function prototype----------------// 16 17 FP1_FT ch341_open,ch341_get_descr,ch341_close,ch341_set_stream,ch341_write_eeprom,ch341_read_eeprom; 18 FP2_FT ch341_get_driver_ver; 19 FP3_FT ch341_get_device_name; 20 21 static int initialize_ch341(void); 22 static int open(unsigned long int); 23 static int close(unsigned long int); 24 static int set_stream(unsigned long int /* device_id */,unsigned long int /* mode */); 25 static int write_eeprom(unsigned long int /* device_id */,unsigned long int /* eeprom type */,unsigned long int /* address */,unsigned long int /* length */, unsigned char * /* buffer*/); 26 27 static int read_eeprom(unsigned long int /* device_id */,unsigned long int /* eeprom type */,unsigned long int /* address */,unsigned long int /* length */, unsigned char * /* buffer*/); 28 29 static unsigned long int get_driver_ver(unsigned long int); 30 static void * get_device_name(unsigned long int); 31 32 //--------------varitable-----------------// 33 HMODULE ch341_handle; 34 35 USB_T usb={ 36 .initialize=initialize_ch341, 37 .open = open, 38 .close = close, 39 .set_stream = set_stream, 40 .get_driver_ver = get_driver_ver, 41 .get_device_name = get_device_name, 42 .write_eeprom = write_eeprom, 43 .read_eeprom = read_eeprom 44 }; 45 46 //---------------function------------------// 47 /* 48 * write_eeprom 49 * 50 * 51 * 52 */ 53 static int write_eeprom(unsigned long int device_id ,unsigned long int type,unsigned long int address,unsigned long int length, unsigned char * buffer) 54 { 55 return ch341_write_eeprom(device_id,type,address,length,buffer); 56 } 57 /* 58 * read_eeprom 59 * 60 * 61 * 62 */ 63 static int read_eeprom(unsigned long int device_id ,unsigned long int type,unsigned long int address,unsigned long int length, unsigned char * buffer) 64 { 65 return ch341_read_eeprom(device_id,type,address,length,buffer); 66 } 67 68 /* 69 * open 70 * 71 * 72 * 73 */ 74 static int open(unsigned long int id) 75 { 76 return ch341_open(id); 77 } 78 79 /* 80 * close 81 * 82 * 83 * 84 */ 85 static int close(unsigned long int id) 86 { 87 int i; 88 89 i=ch341_close(id); 90 FreeLibrary(ch341_handle); 91 92 return i; 93 94 } 95 /* 96 * 97 * set_stream 98 * 99 * 100 * 101 */ 102 static int set_stream(unsigned long int id,unsigned long mode) 103 { 104 return ch341_set_stream(id,mode); 105 } 106 /* 107 * 108 * get_driver_ver 109 * 110 * 111 * 112 */ 113 114 static unsigned long int get_driver_ver(unsigned long int id) 115 { 116 return ch341_get_driver_ver(id); 117 } 118 /* 119 * get_device_name 120 * 121 * 122 * 123 */ 124 125 static void * get_device_name(unsigned long int id) 126 { 127 return ch341_get_device_name(id); 128 } 129 130 131 /* 132 * initialize 133 * 134 * 135 * 136 */ 137 138 139 static int initialize_ch341(void) 140 { 141 142 ch341_handle=LoadLibrary("CH341DLL.DLL"); 143 144 ch341_open=GetProcAddress(ch341_handle,"CH341OpenDevice"); 145 ch341_close=GetProcAddress(ch341_handle,"CH341CloseDevice"); 146 ch341_get_descr=GetProcAddress(ch341_handle,"CH341GetDeviceDescr"); 147 ch341_get_device_name=(FP3_FT)GetProcAddress(ch341_handle,"CH341GetDeviceName"); 148 ch341_get_driver_ver=(FP2_FT)GetProcAddress(ch341_handle,"CH341GetDrvVersion"); 149 150 ch341_set_stream=GetProcAddress(ch341_handle,"CH341SetStream"); 151 152 ch341_read_eeprom = GetProcAddress(ch341_handle,"CH341ReadEEPROM"); 153 ch341_write_eeprom = GetProcAddress(ch341_handle,"CH341WriteEEPROM"); 154 155 return 0; 156 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 #include <math.h> 5 #include <time.h> 6 #include "usb.h" 7 8 9 #define REV "0.1" 10 11 12 13 /* 14 * 15 * initialize 16 * 17 * 18 */ 19 20 21 int initialize(void) 22 { 23 int len=1000,ver=0; 24 char *p; 25 int i; 26 unsigned long int t; 27 unsigned char buf[2]; 28 29 usb.initialize(); 30 31 system("cls"); 32 printf("╔════════════════╗\r\n"); 33 printf("║ ║\r\n"); 34 printf("║ iTool2 I2C 功能測試程式 V%s ║\r\n",REV); 35 printf("║ ║\r\n"); 36 printf("╠════════════════╣\r\n"); 37 printf("║ Gingko Technology Co.,Ltd. ║\r\n"); 38 printf("╚════════════════╝\r\n\r\n"); 39 40 if(usb.open(0) == -1){ 41 printf("# 錯誤! 未連線 iTool2!\r\n"); 42 return -1; 43 }else { 44 printf("# 連線 iTool2 ............ 成功!\r\n\r\n"); 45 } 46 47 usb.set_stream(0,0x80); 48 49 return 0; 50 } 51 52 /* 53 * 54 * I2C test 55 * 56 */ 57 int i2c_test(void) 58 { 59 unsigned char write_buffer[100]; 60 unsigned char read_buffer[100]; 61 int i,j; 62 63 printf("# 產生 100 位元組隨機數...... \r\n\r\n"); 64 srand(time(NULL)); 65 for(i = 0 ; i < 100; i ++)write_buffer[i] = rand()%255; 66 67 //列印隨機數到螢幕 68 for(i = 0; i < 10; i ++){ 69 for(j = 0; j < 10; j ++)printf(" %02X",write_buffer[i*10 + j]); 70 printf("\r\n"); 71 } 72 printf("\r\n# 把隨機數寫入eeprom...... \r\n\r\n"); 73 usb.write_eeprom(0,2,0,100,write_buffer); 74 75 printf("# 從eeprom中讀取資料...... \r\n\r\n"); 76 memset(read_buffer,0,100); 77 78 usb.read_eeprom(0,2,0,100,read_buffer); 79 80 //列印隨機數到螢幕 81 for(i = 0; i < 10; i ++){ 82 for(j = 0; j < 10; j ++)printf(" %02X",read_buffer[i*10 + j]); 83 printf("\r\n"); 84 } 85 86 printf("\r\n# 測試 I2C 介面 .......... "); 87 88 if(memcmp(write_buffer,read_buffer,100) ==0)printf("成功!"); 89 else printf("失敗!"); 90 91 92 return 0; 93 } 94 95 96 /* 97 * 98 * 99 * main 100 * 101 * 102 */ 103 int main(int argc, char *argv[]) 104 { 105 if(initialize() == -1)goto end; 106 107 i2c_test(); 108 109 usb.close(0); 110 111 end: printf("\r\n\r\n"); 112 system("Pause"); 113 114 115 return 0; 116 }
makefile:
itool2_eeprom:main.o usb.o ico.o gcc -o itool2_eeprom main.o usb.o ico.o main.o:main.c gcc -c main.c usb.o:usb.c usb.h gcc -c usb.c ico.o:itool2.ico ico.rc windres -i ico.rc -O coff -o ico.o clean: del *.o itool2_eeprom.exe *.*~