zoukankan      html  css  js  c++  java
  • 【应用笔记】【AN002】通过iTool2基于MinGW平台读写EEPROM

    为了增加大家 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:MinGWin;

    源文件组成

    代码基于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("╔════════════════╗
    ");
     33     printf("║                                ║
    ");
     34     printf("║  iTool2 I2C 功能测试程序 V%s  ║
    ",REV);
     35     printf("║                                ║
    ");
     36     printf("╠════════════════╣
    ");
     37     printf("║  Gingko Technology Co.,Ltd.    ║
    ");
     38     printf("╚════════════════╝
    
    ");
     39 
     40     if(usb.open(0) == -1){
     41         printf("# 错误! 未连接 iTool2!
    ");
     42         return -1;
     43     }else {
     44         printf("# 连接 iTool2 ............ 成功!
    
    ");
     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 字节随机数...... 
    
    ");
     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("
    ");
     71     }
     72     printf("
    # 把随机数写入eeprom...... 
    
    ");
     73     usb.write_eeprom(0,2,0,100,write_buffer);
     74 
     75     printf("# 从eeprom中读取数据...... 
    
    ");
     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("
    ");
     84     }
     85 
     86     printf("
    # 测试 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("
    
    ");
    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 *.*~
  • 相关阅读:
    python-scapy学习笔记-(1)
    python系统性能模块笔记
    Python爬虫总结
    pm2的的常用命令及用法
    Javascript的map与forEach的区别
    对MVVM思想的在认识
    RN的打包
    undefined与null的区别
    rem与em的区别
    JS的函数参数传递为值传递
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/4967917.html
Copyright © 2011-2022 走看看