基于CY7C68013A usb转mdio win10 64bit

article/2025/11/7 21:06:43

基于CY7C68013A usb转mdio win10 64bit


1、芯片简介:

目前市场上主流的实现USB通信的方案主要是基于stm32(基于目前比较流行的DAPLink方案)/ft232/ch341等,CY7C68013A芯片历史较久,价格也相对偏高但USB通信设计的方法应该都是一致的。

手上正好有一块下图的开发板:说明:图中蓝色的双刀按钮存在明显接触不良的现象,建议直接将其短路

说明:目前使用win10 64bit的机器开发上述开发板并未发现有任何驱动问题

CY7C68013A:可以简单理解为带有USB接口8051芯片

 

开发环境配置:

使用的还是2008年的版本

也有更新一点的版本:需要去官网查找,感觉用法应该差不多

建议默认安装在c盘,这样自带的示例可以直接在keil2中编译,不需要需改工程路径

   

2、USB 4种通信方式及端点配置:

     USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(Transaction),事务有四种类型,分别是Bulk Transaction、Control Transaction、Interrupt Transaction和Isochronous Transaction。

   可以看到内部空间划分如下:

   

端点配置:

   全速只用64字节,高速用512,一共支持12中配置模式如下:一般端点0用于控制,EP1用于中断,EP2468用于bulk,iso.

 

 12种配置方式:

 

3、实现方式:

    bulkloop入门

    使用的参考例程基于bulkloop修改而来:

    但没有使用bulk的通信模式,而是利用的control通信模式

    打开bulkloop的keil工程,这样的模板里我们只需要关注两个函数:

   TD_Init()函数,只执行一次,在末尾增加我们需要的初始化代码(比如Port的设置):

void TD_Init(void)             // Called once at startup
{// set the CPU clock to 48MHzCPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;// set the slave FIFO interface to 48MHzIFCONFIG |= 0x40;// default: all endpoints have their VALID bit set// default: TYPE1 = 1 and TYPE0 = 0 --> BULK  // default: EP2 and EP4 DIR bits are 0 (OUT direction)// default: EP6 and EP8 DIR bits are 1 (IN direction)// default: EP2, EP4, EP6, and EP8 are double buffered// we are just using the default values, yes this is not necessary...EP1OUTCFG = 0xA0;EP1INCFG = 0xA0;SYNCDELAY;                  EP2CFG = 0xA2;SYNCDELAY;                    EP4CFG = 0xA0;SYNCDELAY;                    EP6CFG = 0xE2;SYNCDELAY;                    EP8CFG = 0xE0;// out endpoints do not come up armed// since the defaults are double buffered we must write dummy byte counts twiceSYNCDELAY;                    EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.SYNCDELAY;                    EP2BCL = 0x80;SYNCDELAY;                    EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.SYNCDELAY;                    EP4BCL = 0x80;    // enable dual autopointer featureAUTOPTRSETUP |= 0x01;
//OEA=0x7F;IOA=0xFc;}

   TD_Poll()函数,会被一直循环,可以不断查询状态寄存器,根据其结果执行需要的功能,bulkloop便是基于此方式实现

void TD_Poll(void)              // Called repeatedly while the device is idle
{WORD i;WORD count;//if(!(EP2468STAT & bmEP2EMPTY)){ // check EP2 EMPTY(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is emptyif(!(EP2468STAT & bmEP6FULL)){  // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is fullAPTR1H = MSB( &EP2FIFOBUF );APTR1L = LSB( &EP2FIFOBUF );AUTOPTRH2 = MSB( &EP6FIFOBUF );AUTOPTRL2 = LSB( &EP6FIFOBUF );count = (EP2BCH << 8) + EP2BCL;// loop EP2OUT buffer data to EP6INfor( i = 0x0000; i < count; i++ ){// setup to transfer EP2OUT buffer to EP6IN buffer using AUTOPOINTER(s)EXTAUTODAT2 = EXTAUTODAT1;}////EP6BCH = EP2BCH;  SYNCDELAY;  EP6BCL = EP2BCL;        // arm EP6INSYNCDELAY;                    EP2BCL = 0x80;          // re(arm) EP2OUT}}if(!(EP2468STAT & bmEP4EMPTY)){ // check EP4 EMPTY(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is emptyif(!(EP2468STAT & bmEP8FULL)){  // check EP8 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is fullAPTR1H = MSB( &EP4FIFOBUF );APTR1L = LSB( &EP4FIFOBUF );AUTOPTRH2 = MSB( &EP8FIFOBUF );AUTOPTRL2 = LSB( &EP8FIFOBUF );count = (EP4BCH << 8) + EP4BCL;// loop EP4OUT buffer data to EP8INfor( i = 0x0000; i < count; i++ ){// setup to transfer EP4OUT buffer to EP8IN buffer using AUTOPOINTER(s)EXTAUTODAT2 = EXTAUTODAT1;}EP8BCH = EP4BCH;  SYNCDELAY;  EP8BCL = EP4BCL;        // arm EP8INSYNCDELAY;                    EP4BCL = 0x80;          // re(arm) EP4OUT}}
}

 

    上位机与固件修改:

    使用控制节点发送verdor req命令执行:简单测试并不需要编写上位机及驱动直接利用自带的开发工具即可

   固件:对DR_VendorCmnd()函数做修改来实现mdio的读写命令,该命令对应的操作按钮为:

     有一些命令似乎芯片默认已经使用,如下表,因此选择了0x20(仅测试返回固定值)开始,写0x21/读0x22

修改如下:

BOOL DR_VendorCmnd(void)
{WORD w0;WORD		addr, len, bc;WORD		ChipRev;WORD i;switch(SETUPDAT[1]){ //TPM handle new commandscase 0x20:*EP0BUF = 0x15;EP0BCH = 0;EP0BCL = 1; // Arm endpoint with # bytes to transferEP0CS |= bmHSNAK; // Acknowledge handshake phase of device requestbreak;case 0x21://write eth mdio*EP0BUF = SETUPDAT[2];*(EP0BUF+1) = SETUPDAT[3];*(EP0BUF+2) = SETUPDAT[4];*(EP0BUF+3) = SETUPDAT[5];*(EP0BUF+4) = SETUPDAT[6];*(EP0BUF+5) = SETUPDAT[7];*(EP0BUF+6) = g_data0;*(EP0BUF+7) = g_data0>>8;//w0 = 0;w0 = SETUPDAT[5];w0 = w0<<8;w0 = w0 + SETUPDAT[4];eth_mdio(1,SETUPDAT[2],SETUPDAT[3],w0);EP0BCH = 0;EP0BCL = 8; // Arm endpoint with # bytes to transferEP0CS |= bmHSNAK; // Acknowledge handshake phase of device requestbreak;case 0x22://read eth mdioeth_mdio(0,SETUPDAT[2],SETUPDAT[3],0);*EP0BUF = SETUPDAT[2];*(EP0BUF+1) = SETUPDAT[3];*(EP0BUF+2) = SETUPDAT[4];*(EP0BUF+3) = SETUPDAT[5];*(EP0BUF+4) = SETUPDAT[6];*(EP0BUF+5) = SETUPDAT[7];*(EP0BUF+6) = eth_mdio_rdata>>8;*(EP0BUF+7) = eth_mdio_rdata;//data0//*(EP0BUF+6) = g_data0;//*(EP0BUF+7) = g_data0>>8;EP0BCH = 0;EP0BCL = 8; // Arm endpoint with # bytes to transferEP0CS |= bmHSNAK; // Acknowledge handshake phase of device requestbreak;default:break;}return(FALSE); // no error; command handled OK
}

注意点:

最终实现接口如下:

读一个mdio地址

写一个mdio地址:

实际测试结果:和FPGA读出的数据一致,功能正常实现,基于此方案还可以类似开发spi/i2c等接口功能

    mdio时序:

    类似于i2c但又不是,所以直接使用gpio模拟实现,而没有使用i2c控制器

    简单概括就是下降沿写数据,上升沿读数据,由于我们的时钟不是一直有而是通过固定的循环模拟出来的,所以

    同时注意在读写的前后多插入一些时钟,手册要求至少32个时钟的Pre

    另外注意SDA的空闲状态默认设置为输入,68013芯片端口结构如下:(读写数据时需要切换端口的输入输出方向) /C:\Cypress\USB\doc\FX2LPEZ-USB_TRM.pdf

gpio-mdio example:其中PA7-SDA PA6-SCL

WORD eth_mdio_rdata = 0;
WORD g_data0;
//40kHz 
void eth_mdio(unsigned char wr,unsigned char phyaddr,unsigned char regaddr,WORD w0)
{WORD a=0;WORD data0;WORD data1;unsigned char b =0;unsigned char c = 0;unsigned char d = 0;unsigned char e =0;unsigned char f =0;unsigned char g =0;unsigned char t0;unsigned char t1;unsigned char t2;//wr+phyaddr+reg+data   or read +phyaddr+reg//PA7 SDA//PA6 SCL out OEA=0xFF;IOA=0xFe;//phyaddr = phyaddr & 0x1f;t1 = (phyaddr >> 1) & 0xf;if(wr == 1){t0 = 0x50+t1;}else {t0 = 0x60+t1;}if( (phyaddr & 0x01) == 0x1)t2 = 0x80;elset2 = 0;//regaddr = regaddr & 0x1f;regaddr = regaddr << 2;t2 = t2 + regaddr ;t2 = t2 | 0x02;//   data0 = t0;data0 = data0 <<8;data0 += t2;//g_data0 = data0;//f= 0;g= 0;for(a=0;a<500;a++){//if(b==0) IOA |= (1<<6);  //1else IOA &= (~(1<<6));   //0if(c) b = ~b;c = ~c;//if(e>=33){if( g==0 ){if(d == 1) //negedge out data{if(f == 14 ){if(wr ==0) OEA=0x7F;//IOA=0xFe;}else if(f == 15 ){if(wr ==0) g = 1;}else if(f == 16 ){if(wr ==1)  data0 = w0;}else ;//if( (data0 & 0x8000) == 0x8000)IOA |= (1<<7);  //1elseIOA &= (~(1<<7));//0 //data0 = data0 << 1;f = f+1;      }}else{// read dataif(d == 0){if( (IOA & 0x80) == 0x80 )data1 |= 0x0001;else data1 &= 0xfffe;//if(f < 31)data1  = data1 <<1;f = f+1;}}} //d= d+1;if(d == 4) {d =0;e = e+1;if(f == 32)  goto ENDA;}}ENDA:for(a=0,b=0,c=0;a<4*32;a++){//if(b==0) IOA |= (1<<6);  //1else IOA &= (~(1<<6));   //0if(c) b = ~b;c = ~c;}eth_mdio_rdata = data1;//OEA=0x7F;IOA=0xFF;}

 需要注意的是:对于keil2工具在做判断时不能写成

 if( (phyaddr & 0x01) )

 而应该

 if( (phyaddr & 0x01) == 0x1)

 个人觉得两者本身没有区别,但编译器存在bug只有第二种可正常执行。

 

4、操作步骤:

  

     首先断开外部E2PROM(也就是把J2接上使芯片识别不到,使用的24LC128的寻址为001,短上后就变成000),这是后板卡会被芯片按默认状态识别:

     当板卡被正常识别后如果需要固化到E2PROM我们还要再将J2拔掉(否则提示没有EEPROM),点击选择hex转换成iic文件来固化程序

  (c:\cypress\usb\bin\hex2bix -i -f 0xC2 -o bulkloop.iic bulkloop.hex)。

安装包配套资料还是比较全面的,我们主要用的就两个一个Download(选择hex,下载RAM中调试,只要不断电程序会一致保留)/一个Lg EEPROM(选择iic,固化程序,需要接上EEPROM)

  芯片启动方式说明:

 上电后芯片会检测EEPROM,如果第一个字节是0xc0就使用EEPROM中的VID/PID/DID,如果是0xc2就会将EEPROM加载到内部RAM执行,

否则使用内部的默认VID/PID/DID启动。

5、参考:

4种通信方式:

https://blog.csdn.net/clarkness/article/details/87349669

https://blog.csdn.net/kof2019/article/details/77774679

 

 


http://chatgpt.dhexx.cn/article/iiwaVyX9.shtml

相关文章

CY7C68013与FPGA接口的Verilog

USB(通用串行总线)是英特尔、微软、IBM、康柏等公司1994年联合制定的一种通用串行总线规范&#xff0c;它解决了与网络通信问题&#xff0c;而且端口扩展性能好、容易使用。最新的USB2.0支持3种速率&#xff1a;低速1.5 Mbit/s&#xff0c;全速12 Mbit/s&#xff0c;高速480 Mb…

CY7C68013A之LED闪烁

#include "fx2.h" #include "fx2regs.h"sbit LED_PIN IOD ^ 3;main() {unsigned long i 0;OED | 0x08; //PD3 Output Enable;while(TRUE){if( i > 50000 ){i 0;LED_PIN ~LED_PIN;}} } 程序下载 Download是将程序下载到RAM&#xff0c;Lg E…

CY7C68013与FPGA接口的Verilog_HDL实现

USB(通用串行总线)是英特尔、微软、IBM、康柏等公司1994年联合制定的一种通用串行总线规范&#xff0c;它解决了与网络通信问题&#xff0c;而且端口扩展性能好、容易使用。最新的USB2.0支持3种速率&#xff1a;低速1.5 Mbit/s&#xff0c;全速12 Mbit/s&#xff0c;高速480 Mb…

cy7c68013linux驱动,CY7C68013A USB Board教程2:CY7C68013A USB Board驱动安装

2、我们打开软件&#xff0c;看看可以怎么加载驱动&#xff1a; 3、这里面涉及到模块的VID和PID&#xff0c;具体怎么看呢&#xff0c;详见下图&#xff1a; 4、接着就是修改驱动文件上的VID和PID了&#xff0c;我们打开安装路径下的驱动目录&#xff0c;如下&#xff1a; 5、找…

FPGA----CY7C68013使用记录

一、CY7C68013简介 CY7C68013是Cypress公司的FX2系列芯片&#xff0c;是一款USB2.0芯片&#xff0c;最大传输速度60MByte/S &#xff0c;半双工通信方式。 功能引脚说明FD0~FD718~25数据线低字节FD8~FD1545~52数据线高字节 FIFOADDR0 FIFOADDR1 37 38 地址线&#xff0c;接收…

数字图像介绍

一、什么是数字图像 数字图像就是将图像用数字表示。 二、数字图像的起源 三、常见的成像方式 电磁波&#xff0c;最基本的单元叫做光子。 光子具有能量。能量E h*f。h是常数&#xff0c;f是频率。 又频率与波长成反比。 3.1 gama射线成像 在核聚变…

数字图像处理(1)——认识数字图像

目录 1、数字图像的构成 2、不同环境图像的存储方式 2.1、计算机中的颜色是离散的 2.2、MATLAB、OpenCV、Python中的图像都是什么 3、图像中的信息 4、数字图像处理的基本步骤 5、预备知识 5.1、邻接性、连通性、区域和边界 5.1.1 邻接性 5.1.2、连通性 5.1.3、区域…

数字图像相关(Digital Image Correlation, DIC)中的非线性优化方法IC-GN的数值解计算

目录 前言内容回顾一.IC-GN中增量 Δ P \Delta \boldsymbol P ΔP的数值解二.写在最后参考引用 前言 由于本人近期正在展开数字图像相关技术用于测量材料形变方向的研究&#xff0c;其中需要对别人现有算法的复现和调研&#xff0c;尽管其中很多算法都已经非常成熟&#xff0c…

数字图像处理:像素间的一些基本关系

图像分析的主要目的之一在于获取图像中感兴趣的目标并对目标之间的关系进行分析&#xff1b;目标是由图像中相关像素联合组成的&#xff1b;相关像素在空间的位置和属性都有密切关系&#xff0c;它们一半构成图像中连通组元&#xff1b;所以要分析像素之间的关系&#xff0c;不…

数字图像和数字图像处理

Digital Image Processing[数字图像和数字图像处理] 数字图像就是指代表图像的矩阵。 数字图像处理就是对图像矩阵进行各种数学运算。 在进行图像处理时需要一些数学基础,主要包括线性系统、傅立叶变换、沃尔什变换和小波变换等。 1. 景象&#xff1a;人眼所看到的外部世界。…

数字图像基本处理算法

数字图像基本处理算法 xizero00 常熟理工学院&#xff08;CIT&#xff09; 计算机科学与工程学院 下一代互联网实验室(NGIL Lab) Email:xizero00163.com 由于SIFT算法需要用到很多算法&#xff0c;所以这段时间研究了一下一些最基本的图像处理算法&#xff0c; 好了&…

图像理论知识_什么是数字图像处理?

数字图像处理&#xff0c;即数字&#xff0c;将图像转化为数字的形式&#xff0c;对图像做处理&#xff0c;我们平时所见到的图像&#xff0c;在计算机中都是一组数字&#xff0c;当通过相机捕获现实世界的景物时&#xff0c;相机会捕获现实世界的光源信号&#xff0c;并转化为…

数字图像简介及表示

数字图像处理 数字图像处理&#xff08;Digital Image Processing&#xff09;又称为计算机图像处理&#xff0c;是一种将图像信号数字化后利用计算进行处理的过程。图像 图像是三维世界在二维平面的表示&#xff0c;具体来说就是用光学器件对一个物体&#xff0c;一个人或是…

数字图像处理(入门篇)一 图像的数字化与表示

目录 1 人眼图像是如何形成的&#xff1f; 2 图像的感知与获取&#xff1f; 3 图像的数字化 4 数字图像的表示 1 人眼图像是如何形成的&#xff1f; 人眼近似为一个球体&#xff0c;物体的光线经过角膜和晶状体的折射&#xff0c;在视网膜上形成“倒立缩小”的实像。 视网膜…

数字图像处理——相关检测

原理&#xff1a;利用模板与图像做相关运算得到相关值矩阵&#xff0c;相关值最大的位置即检测出的目标位置。相关值计算公式&#xff1a; Matlab代码&#xff1a; clear,clc; car imread(car.png); mask imread(wheel.png); [h1,w1] size(car); [h2,w2] size(mask);car_e…

#DIC#数字图像相关

1.1DIC基本原理 在实验中DIC特指一种种光学测量技术&#xff0c;⽤于在整个⼒学试验过程中测量试样表⾯上不断变化的全场⼆维或三维坐标。测量出的坐标场可⽤于进⼀步导出位移、应变、应变率、速度和曲率等感兴趣量&#xff08;Quantities-of-Interest&#xff0c;QOI&#xff…

二维数字图像相关算法软件Ncorr的使用心得

二维数字图像相关(2D Digital Image Correlation)是一种非接触式的光学测量方法&#xff0c;常应用于图像分析处理上&#xff0c;它可以根据变形前后的2张或多张图像&#xff0c;求解出规定区域 近似的位移与应变情况。 Ncorr使用流程 Ncorr下载与编译1.下载2.编译 Ncorr通用DI…

数字图像相关(Digital Image Correlation, DIC)中的非线性优化方法(FA-GN与IC-GN)

目录 前言内容回顾一. 非线性优化数学模型二. 前向累加高斯-牛顿法——FA-GN&#xff08;Forward Additive Gauss-Newton method&#xff09;三. 逆合成高斯-牛顿法——IC-GN&#xff08;Inverse compositional Gauss-Newton method&#xff09;1.非线性优化数学模型变形2.数学…

利用图像来测量的技术——数字图像相关法(DIC)

数字图像相关法 数字图像相关法(digital image correlation method,DIC)是对未变形和变形状态下的试件图像进行计算机处理&#xff0c;获得全场位移的一种方法。也就是说你只需要提供两张图片——一张参考图片(refference image)和一张变形状态下的图片(current image)&#x…

Matlab实现二维数字图像相关(2D Digital Image Correlation, 2D-DIC)【ADIC2D代码复现及原理介绍】

目录 前言一.数字图像相关&#xff08;Digital Image Correlation&#xff09;二.相关运算1.数学模型2.形函数3.相关标准其他知识 三.ADIC2D代码解释1.ImgCorr2.SubCorr 四.写在最后参考引用 前言 由于本人近期正在展开数字图像相关技术用于测量材料形变方向的研究&#xff0c…