#pragma NOIV // Do not generate interrupt vectors
#include "fx2.h"
#include "fx2regs.h"
#include "fx2sdly.h" // SYNCDELAY macro
#include "fx2lafw.h"
const char code EPCS_Offset_Lookup_Table[] =
{
0, // EP1OUT
1, // EP1IN
2, // EP2OUT
2, // EP2IN
3, // EP4OUT
3, // EP4IN
4, // EP6OUT
4, // EP6IN
5, // EP8OUT
5, // EP8IN
};
// macro for generating the address of an endpoint's control and status register (EPnCS)
#define epcs(EP) (EPCS_Offset_Lookup_Table[(EP & 0x7E) | (EP > 128)] + 0xE6A1)
extern BOOL GotSUD; // Received setup data flag
extern BOOL Rwuen;
extern BOOL Selfpwr;
DWORD G_u32_Cnt = 0;
BYTE Configuration; // Current configuration
BYTE AlternateSetting; // Alternate settings
BYTE vendor_command;
BOOL enum_high_speed = FALSE;
BOOL DR_GetDescriptor(void);
BOOL DR_SetConfiguration(void);
BOOL DR_GetConfiguration(void);
BOOL DR_SetInterface(void);
BOOL DR_GetInterface(void);
BOOL DR_GetStatus(void);
BOOL DR_ClearFeature(void);
BOOL DR_SetFeature(void);
BOOL DR_VendorCmnd(void);
void TD_Poll(void) // Called repeatedly while the device is idle
{
if(G_u32_Cnt < 60000)
{
G_u32_Cnt ++;
}
else
{
G_u32_Cnt = 0;
if(EP2468STAT & bmEP6EMPTY) /* 如果 INEP2FIFO 为空 PA1-LED就翻转 */
{
PA1 = ~PA1;
}
if(!(EP2468STAT & bmEP2FULL)) /* 如果 INEP6FIFO 不满 PA0-LED就翻转 */
{
PA0 = ~PA0;
}
}
}
void DSLogic_Init(void)
{
//设置8051的工作频率为48MHz
CPUCS = 0x12; // CLKSPD[1:0]=10, for 48MHz operation, output CLKOUT
SYNCDELAY;
//Slave使用内部48MHz的时钟
IFCONFIG = 0xE3; //对从设备 FIFO 接口进行配置,使之使用 48 MHz 的内部时钟
SYNCDELAY;
/***************************************************
配置变址寻址方式
PINFLAGSAB = 0x00
PINFLAGSCD = 0x00
报告当前FIFO数据端口(由FIFOADR[I:0]引脚选择)的的状态
FLAGA报告"可编程级"状态
FLAGB报告"满"状态为 0 非满为1 FLAGB 报告“已满”状态
FLAGC报告"空"状态为 0 非空为1 FLAGC 报告“空”状态
外部主服务器通常监视
OUT 端点的“空”标志 (EF)
IN 端点的完整 (FF) 标志
***************************************************/
#if 0
PINFLAGSAB = 0x00;
SYNCDELAY;
PINFLAGSCD = 0x00;
SYNCDELAY;
#else
PINFLAGSAB = 0xE0; /* FLAGB 被配置为 EP6 OUT FIFO 的空标志 EP2EF 非空为1 PC发送数据到CY7C68013->FPGA(MCU) Check 此标志为1则按照时序进行读取 */
SYNCDELAY;
PINFLAGSCD = 0x08; /* FLAGC 被配置为 EP2 IN FIFO 的满标志 EP6FF 非满为1 PC从CY7C68013读取数据<-FPGA(MCU) Check 此标志为1则按照时序进行写入 */
SYNCDELAY;
#endif
FIFOPINPOLAR = 0x00; //Slave FIFO标志位低电平有效
PORTACFG |= 0x80; // FLAGD, set alt. func. of PA7 pin
/*********************************************************************************
从属FIFO控制引脚为
SLOE(输出使能)
SLRD(读)
SLWR(写)
PKTEND(包结束)
"读"和"写"来自外部主控制器的外引线;外部主控制器从OUT端点读,向IN端点写。
读:
在同步方式下(IFCONFIG.3=0),当FIFO指针在SLRD有效时,IFCLK的每一个上升沿累加。
在异步方式下(IFCoNFIG.3=1),FIFO指针在每次SLRD激活到撤销激活变化时累加。
SLOE引脚提供FD输出使能信号。默认情况下,SLOE和SLRD低电平有效。
写:
在同步方式下(IFCONFIG.3=O),当SLWR被激活时,FD总线上的数据在每个时钟信号IFCLK上升沿来到时被写入FIFO(并且FIFO指针被加1)。
在异步方式下(IFCONFIG.3=1),FD总路线上的数据在每次SLWR激活到撤销激活变化时被写入FIFO(并且FIFO指针被加1)。
默认情况下,SLWR低电平有效。
如果FIFO被设置为允许零长度包(EPXFIFOCFG.2=1),则可激活PKTEND脚,当FIFO为空时,提交零长度包。
PKTEND默认为低电平有效
*********************************************************************************/
SYNCDELAY;
EP6CFG = 0xA0; // OUT, 512-bytes, 4x, bulk
SYNCDELAY;
EP2CFG = 0xE0; // IN, 512-bytes, 4x, bulk
SYNCDELAY;
EP4CFG = 0x02; //禁止EP4
SYNCDELAY;
EP8CFG = 0x02; //禁止EP8
SYNCDELAY;
//复位FIFO
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions
SYNCDELAY; // see TRM section 15.14
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY; //
FIFORESET = 0x04; // reset, FIFO 4
SYNCDELAY; //
FIFORESET = 0x06; // reset, FIFO 6
SYNCDELAY; //
FIFORESET = 0x08; // reset, FIFO 8
SYNCDELAY; //
FIFORESET = 0x00; // deactivate NAK-ALL
SYNCDELAY;
// 分别将端点 2 FIFO 和端点 6 配置为自动输出模式和自动输入模式 同时使用8位接口
EP6FIFOCFG = 0x00; // AUTOOUT=0, WORDWIDE=0
// core needs to see AUTOOUT=0 to AUTOOUT=1 switch to arm endp's
SYNCDELAY; //
EP6FIFOCFG = 0x10; // AUTOOUT=1, WORDWIDE=0
SYNCDELAY; //
EP2FIFOCFG = 0x0C; // AUTOIN=1, ZEROLENIN=1, WORDWIDE=0
SYNCDELAY;
OEA|=0x03; //Declare PA.1 PA.0 as output
SYNCDELAY;
IOA|=0x01; //output 0 on PA.1 1 on PA.0
SYNCDELAY;
}
void DSLogic_Poll(void)
{
struct cmd_start *cmd;
switch(vendor_command)
{
case CMD_START:
{
if ((EP0CS & bmEPBUSY) != 0)
break;
if (EP0BCL == sizeof(struct cmd_start))
{
cmd = (struct cmd_start *)EP0BUF;
if (cmd->flags & CMD_START_FLAGS_SAMPLE_16BIT)
EP2FIFOCFG = bmAUTOIN | bmWORDWIDE;
else
EP2FIFOCFG = bmAUTOIN;
SYNCDELAY;
/* Set IFCONFIG to the correct clock source. */
if (cmd->flags & CMD_START_FLAGS_CLK_48MHZ)
{
IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE | bmBIT1 | bmBIT0;
}
else
{
IFCONFIG = bmIFCLKSRC | bmIFCLKOE | bmBIT1 | bmBIT0;
}
}
vendor_command = 0;
break;
}
default:
vendor_command = 0;
break;
}
TD_Poll();
}
//-----------------------------------------------------------------------------
// Device Request hooks
// The following hooks are called by the end point 0 device request parser.
//-----------------------------------------------------------------------------
BOOL DR_GetDescriptor(void)
{
void *dscr_ptr;
switch(SETUPDAT[3])
{
case GD_DEVICE: // Device
SUDPTRH = MSB(pDeviceDscr);
SUDPTRL = LSB(pDeviceDscr);
break;
case GD_CONFIGURATION: // Configuration
SUDPTRH = MSB(pConfigDscr);
SUDPTRL = LSB(pConfigDscr);
break;
case GD_STRING: // String
if(dscr_ptr = (void *)EZUSB_GetStringDscr(SETUPDAT[2]))
{
SUDPTRH = MSB(dscr_ptr);
SUDPTRL = LSB(dscr_ptr);
}
else
EZUSB_STALL_EP0(); // Stall End Point 0
break;
case GD_DEVICE_QUALIFIER: // Device Qualifier
SUDPTRH = MSB(pDeviceQualDscr);
SUDPTRL = LSB(pDeviceQualDscr);
break;
case GD_OTHER_SPEED_CONFIGURATION: // Other Speed Configuration
SUDPTRH = MSB(pOtherConfigDscr);
SUDPTRL = LSB(pOtherConfigDscr);
break;
default: // Invalid request
EZUSB_STALL_EP0(); // Stall End Point 0
}
return(TRUE);
}
BOOL DR_SetConfiguration(void) // Called when a Set Configuration command is received
{
Configuration = SETUPDAT[2];
return(TRUE); // Handled by user code
}
BOOL DR_GetConfiguration(void) // Called when a Get Configuration command is received
{
EP0BUF[0] = Configuration;
EP0BCH = 0;
EP0BCL = 1;
return(TRUE); // Handled by user code
}
BOOL DR_SetInterface(void) // Called when a Set Interface command is received
{
AlternateSetting = SETUPDAT[2];
return(TRUE); // Handled by user code
}
BOOL DR_GetInterface(void) // Called when a Set Interface command is received
{
EP0BUF[0] = AlternateSetting;
EP0BCH = 0;
EP0BCL = 1;
return(TRUE); // Handled by user code
}
BOOL DR_Get
没有合适的资源?快使用搜索试试~ 我知道了~
fx2lafw逻辑分析仪KEIL源码
共18个文件
h:7个
inc:2个
c:2个
需积分: 5 2 下载量 60 浏览量
2024-06-25
10:25:28
上传
评论
收藏 5.07MB RAR 举报
温馨提示
基于官方的linux平台的sigrok-firmware-fx2lafw源码修改为keil版本的软件源码,支持PulseView 的8通道48M采集。FX2使用的是同步slavefifo模式 ,此代码使用时一定要 FIFOADR0 拉低 FIFOADR1 拉低 SLRD 拉高关闭读 SLOE 拉高关闭读数据总线 SLWR 拉低使能写 具体方法请参考博文 https://blog.csdn.net/zhye3690592/article/details/139952096
资源推荐
资源详情
资源评论
收起资源包目录
fx2lafw_8CH_Firmware.rar (18个子文件)
fx2lafw_8CH_Firmware
src
fw.c 6KB
periph.c 13KB
dscr.a51 7KB
prj
usb.uvproj 15KB
zadig-2.8.exe 5.01MB
Lib
EZUSB.LIB 26KB
USBJmpTb.OBJ 2KB
output
Hex2bix.exe 40KB
usb.iic 2KB
Inc
fx2regs.inc 21KB
fx2sdly.h 6KB
Fx2.h 13KB
syncdly.h 8KB
lp.h 14KB
lpregs.h 30KB
lpregs.inc 20KB
fx2regs.h 31KB
fx2lafw.h 1KB
共 18 条
- 1
资源评论
滴水的风
- 粉丝: 68
- 资源: 57
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功