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

 /*
* USB.C
*
* CH341H Driver.
* Designed By XiaomaGee 2015.11.05
*
*
*/ //--------------include files----------------//
#include <stdio.h>
#include <stdlib.h>
#include "usb.h" //--------------function prototype----------------// FP1_FT ch341_open,ch341_get_descr,ch341_close,ch341_set_stream,ch341_write_eeprom,ch341_read_eeprom;
FP2_FT ch341_get_driver_ver;
FP3_FT ch341_get_device_name; static int initialize_ch341(void);
static int open(unsigned long int);
static int close(unsigned long int);
static int set_stream(unsigned long int /* device_id */,unsigned long int /* mode */);
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*/); 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*/); static unsigned long int get_driver_ver(unsigned long int);
static void * get_device_name(unsigned long int); //--------------varitable-----------------//
HMODULE ch341_handle; USB_T usb={
.initialize=initialize_ch341,
.open = open,
.close = close,
.set_stream = set_stream,
.get_driver_ver = get_driver_ver,
.get_device_name = get_device_name,
.write_eeprom = write_eeprom,
.read_eeprom = read_eeprom
}; //---------------function------------------//
/*
* write_eeprom
*
*
*
*/
static int write_eeprom(unsigned long int device_id ,unsigned long int type,unsigned long int address,unsigned long int length, unsigned char * buffer)
{
return ch341_write_eeprom(device_id,type,address,length,buffer);
}
/*
* read_eeprom
*
*
*
*/
static int read_eeprom(unsigned long int device_id ,unsigned long int type,unsigned long int address,unsigned long int length, unsigned char * buffer)
{
return ch341_read_eeprom(device_id,type,address,length,buffer);
} /*
* open
*
*
*
*/
static int open(unsigned long int id)
{
return ch341_open(id);
} /*
* close
*
*
*
*/
static int close(unsigned long int id)
{
int i; i=ch341_close(id);
FreeLibrary(ch341_handle); return i; }
/*
*
* set_stream
*
*
*
*/
static int set_stream(unsigned long int id,unsigned long mode)
{
return ch341_set_stream(id,mode);
}
/*
*
* get_driver_ver
*
*
*
*/ static unsigned long int get_driver_ver(unsigned long int id)
{
return ch341_get_driver_ver(id);
}
/*
* get_device_name
*
*
*
*/ static void * get_device_name(unsigned long int id)
{
return ch341_get_device_name(id);
} /*
* initialize
*
*
*
*/ static int initialize_ch341(void)
{ ch341_handle=LoadLibrary("CH341DLL.DLL"); ch341_open=GetProcAddress(ch341_handle,"CH341OpenDevice");
ch341_close=GetProcAddress(ch341_handle,"CH341CloseDevice");
ch341_get_descr=GetProcAddress(ch341_handle,"CH341GetDeviceDescr");
ch341_get_device_name=(FP3_FT)GetProcAddress(ch341_handle,"CH341GetDeviceName");
ch341_get_driver_ver=(FP2_FT)GetProcAddress(ch341_handle,"CH341GetDrvVersion"); ch341_set_stream=GetProcAddress(ch341_handle,"CH341SetStream"); ch341_read_eeprom = GetProcAddress(ch341_handle,"CH341ReadEEPROM");
ch341_write_eeprom = GetProcAddress(ch341_handle,"CH341WriteEEPROM"); return ;
}
 #include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include "usb.h" #define REV "0.1" /*
*
* initialize
*
*
*/ int initialize(void)
{
int len=,ver=;
char *p;
int i;
unsigned long int t;
unsigned char buf[]; usb.initialize(); system("cls");
printf("╔════════════════╗\r\n");
printf("║ ║\r\n");
printf("║ iTool2 I2C 功能测试程序 V%s ║\r\n",REV);
printf("║ ║\r\n");
printf("╠════════════════╣\r\n");
printf("║ Gingko Technology Co.,Ltd. ║\r\n");
printf("╚════════════════╝\r\n\r\n"); if(usb.open() == -){
printf("# 错误! 未连接 iTool2!\r\n");
return -;
}else {
printf("# 连接 iTool2 ............ 成功!\r\n\r\n");
} usb.set_stream(,0x80); return ;
} /*
*
* I2C test
*
*/
int i2c_test(void)
{
unsigned char write_buffer[];
unsigned char read_buffer[];
int i,j; printf("# 产生 100 字节随机数...... \r\n\r\n");
srand(time(NULL));
for(i = ; i < ; i ++)write_buffer[i] = rand()%; //打印随机数到屏幕
for(i = ; i < ; i ++){
for(j = ; j < ; j ++)printf(" %02X",write_buffer[i* + j]);
printf("\r\n");
}
printf("\r\n# 把随机数写入eeprom...... \r\n\r\n");
usb.write_eeprom(,,,,write_buffer); printf("# 从eeprom中读取数据...... \r\n\r\n");
memset(read_buffer,,); usb.read_eeprom(,,,,read_buffer); //打印随机数到屏幕
for(i = ; i < ; i ++){
for(j = ; j < ; j ++)printf(" %02X",read_buffer[i* + j]);
printf("\r\n");
} printf("\r\n# 测试 I2C 接口 .......... "); if(memcmp(write_buffer,read_buffer,) ==)printf("成功!");
else printf("失败!"); return ;
} /*
*
*
* main
*
*
*/
int main(int argc, char *argv[])
{
if(initialize() == -)goto end; i2c_test(); usb.close(); end: printf("\r\n\r\n");
system("Pause"); return ;
}

 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 *.*~

【应用笔记】【AN002】通过iTool2基于MinGW平台读写EEPROM的更多相关文章

  1. 搭建基于MinGW平台的《OpenGL蓝皮书(OpenGL SuperBibe 5th)》示例代码编译环境

    副标题:搭建基于MinGW平台的<OpenGL超级宝典>(OpenGL蓝皮书第5版)GLTools 编译环境.示例代码:Triangle.cpp @ SB5.zip 以下内容以及方法均参考 ...

  2. APPCAN学习笔记001---app高速开发AppCan.cn平台概述

    1.APPCAN学习笔记---app高速开发AppCan.cn平台概述 1. 平台概述 技术qq交流群:JavaDream:251572072 AppCan.cn开发平台是基于HTML5技术的跨平台移 ...

  3. 基于java平台的常用资源整理

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  4. 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

    1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...

  5. 基于Linux平台的libpcap源码分析和优化

    目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1        数据包基本捕包流程... 2 2.2        libpcap捕包过程... ...

  6. 这里整理了基于java平台的常用资源

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  7. 基于微软平台IIS/ASP.NET开发的大型网站有哪些呢?

    首先说明一下,本文绝不是要说Microsoft平台多么好,多么牛.只是要提醒一些LAMP/JAVA平台下的同志们,微软平台不至于像你们说的,和想象的那么不堪!只是你们自己不知道而已.同时,也希望广大M ...

  8. 基于android平台的斗地主AI

    本软件是基于android平台的斗地主AI,我们在源代码的基础之上,旨在改进AI的算法,使玩家具有更丰富的体验感,让NPC可以更为智能. (一)玩法解析: (1)发牌和叫牌:一副扑克54张,先为每个人 ...

  9. 一个基于.NET平台的自动化/压力测试系统设计简述

    AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...

随机推荐

  1. ScrollView与TableView实现选择效果

    在cocos2dx中,ScrollView与TableView都可以实现选择效果,其中ScrollView较为原始,TableView的格子大小可以不与winSize一样大. ScrollView实现 ...

  2. [转]ThreadPoolExecutor线程池的分析和使用

    1. 引言 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第 ...

  3. html select 下拉箭头隐藏

    html select 下拉箭头隐藏 <!DOCTYPE html> <html> <head lang="en"> <meta char ...

  4. html 表单 dom 注意跟表单的name值一致

    html 表单 dom 注意跟表单的name值一致 <script type="text/javascript"> function checkForm() { var ...

  5. hdu 2184 01背包变形

    转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686 题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和fu ...

  6. loj 1221(spfa判正环)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25957 思路:由于路线为一个环,将路径上的权值改为c-p*d,那么 ...

  7. CC2540开发板学习笔记(九)—— BLE协议简介

    一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...

  8. IDEA中如何使用Maven进行打包。 IDEA版本是14

    说实话,找了好半天的资料,也许是我的IDEA版本太高了网上资料稀缺,所以愣是没有找到打包的方法,只是自己瞎琢磨了,还好搞出来了,记录一下. 说文字说一下大概流程,其实很简单: 创建配置文件->创 ...

  9. ModifyInfo.aspx.cs代码

    涉及修改密码,提交请求 操作,修改数据库内容 using System; using System.Collections.Generic; using System.Linq; using Syst ...

  10. Ubuntu 安装Redis体验

      背景:由于之前一直没有试过Linux的环境,今天加了内存之后,虚拟机开了3G,速度大大提高,对照博客试一下安装Redis的过程.   体验: 下载源码,解压,编译 $ wget http://do ...