【應用筆記】【AN002】通過iTool2基於MinGW平臺讀寫EEPROM

XiaomaGee發表於2015-11-16

為了增加大家 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可以通過乙太網自由獲取,其官方網址如下:

http://www.mingw.org

可以通過官網的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 *.*~

 

相關文章