吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4186|回复: 23
上一主题 下一主题
收起左侧

[C&C++ 原创] 使用Ai8051模拟fx2lafw设备制作简易逻辑分析仪(抛砖引玉)

[复制链接]
跳转到指定楼层
楼主
苏紫方璇 发表于 2025-7-12 23:25 回帖奖励
本帖最后由 苏紫方璇 于 2025-9-21 12:28 编辑

最近在学习USB通信相关的知识,联想到Ai8051有usb,也有40M主频,能不能模拟网上24M那种赛普拉斯单片机的逻辑分析仪呢。
试了一下还真行,虽然性能差了不是一星半点,但是真能跑。
先放张能跑的图,上位机使用的是开源的pulseView


通过抓包和查看fx2lafw固件的源码可以知道,sigrok使用libusb,通过厂商描述符与下位机通信。
设备描述符,配置描述符和字符串照抄源码即可,由于成品逻辑分析仪是高速设备,所以对应的端点描述符最大包要从512改为64
setup相关配置照抄USBCDC官方例程即可。
需要添加的是厂商描述符的处理,
固件中相关源码
[C] 纯文本查看 复制代码
BOOL handle_vendorcommand(BYTE cmd)

{

        /* Protocol implementation */

        switch (cmd) {

        case CMD_START:

                /* Tell hardware we are ready to receive data. */

                vendor_command = cmd;

                EP0BCL = 0;

                SYNCDELAY();

                return TRUE;

        case CMD_GET_FW_VERSION:

                send_fw_version();

                return TRUE;

        case CMD_GET_REVID_VERSION:

                send_revid_version();

                return TRUE;

        }



        return FALSE;

}

这里cmd是一个结构体
[C] 纯文本查看 复制代码
struct cmd_start_acquisition {

        uint8_t flags;

        uint8_t sample_delay_h;

        uint8_t sample_delay_l;

};

flags是为30M主频还是48M主频,sample_delay是主频/采样率-1,我这里固定主频为40M,将他的采样率转化为40M的定时器计数
[C] 纯文本查看 复制代码
void cmd_start_over()

{

        //还原采样率

        u32 u32Samplerate;

        //接收采样率 单位Hz   定时器设置值

        u16 u16Delay;

        //未添加错误处理


        u16Delay=cmdStartInfo.sample_delay_h;

                u16Delay<<=8;

                u16Delay+=cmdStartInfo.sample_delay_l;

                u16Delay++;

        //1<<6

        if(cmdStartInfo.flags==0x40)//48M基准

        {

                //delay = SR_MHZ(48) / samplerate - 1;

                u32Samplerate=48000000UL/u16Delay;


        }

        else//30M基准  0<<6

        {

                u32Samplerate=30000000UL/u16Delay;

        }


                //初始化缓存

        Buffer_Init();

        //启动定时器

        Timer0_Start(u32Samplerate);

}



//启动定时器

void Timer0_Start(uint32_t xHz)                //可配置频率@40.000MHz

{

    uint32_t reload;

    

    AUXR |= 0x80;                        //定时器时钟1T模式

    TMOD &= 0xF0;                        //设置定时器模式

    

    // 计算重载值

    // 系统时钟频率为40MHz,1T模式下每个时钟周期为1/40MHz = 0.025us

    // 定时周期 = 1/xHz 秒 = (1/xHz)*1000000 us

    // 需要的时钟周期数 = (定时周期)/0.025 = (1000000/xHz)/0.025 = 40000000/xHz

    // 由于定时器是16位向上计数,重载值 = 65536 - (40000000/xHz)

    reload = 65536UL - (40000000UL / xHz);

    

    TL0 = reload;                        //设置定时初始值低字节

    TH0 = reload >> 8;                //设置定时初始值高字节

    

    TF0 = 0;                                //清除TF0标志

    TR0 = 1;                                //定时器0开始计时

    ET0 = 1;                                //使能定时器0中断

}


定时器启动后就开始进行采样,采样数据8通道占1个字节,0通道是bit0,7通道是bit7。
Ai8051有一个32K大小的xdata内存,尽可能分一个大的环形缓冲区,一个指针读,一个指针写,到达末尾就返回初始,这样可以最大限度利用缓冲区。
[C] 纯文本查看 复制代码
//定时器中断,填入数据

void Timer0_Isr(void) interrupt 1

{

        BYTE xdata *nextPtr = wPtr + 1;

    if (nextPtr >= bufferEnd) {  // 指针回绕

        nextPtr = RxBuffer;

    }

    if (nextPtr == rPtr) {  // 缓冲区满

        //memOver=1;

                Timer0_Stop();

    }

    *wPtr = P1;

        u16Remain--;//剩余空间-1

        u16Available++;

    wPtr = nextPtr;//指针+1

}

在主循环中,只需要不停的发送这些数据就可以了。

//判断usb空闲

                if(!UsbInBusy)

                {

                        //已用空间达到64

                        if(u16Available>=64)

                        {

                                //发送数据

                                EUSB =0;

                                UsbInBusy=1;

                                usb_write_reg(INDEX, 2);

                                for(i=0;i<64;i++)

                                {

                                        usb_write_reg(FIFO2, *rPtr);  //发送接收到的数据

                                        rPtr++;

                                        if (rPtr >= bufferEnd) {  // 指针回绕

                                                rPtr = RxBuffer;

                                        }

                                }

                                u16Remain+=64;//剩余空间+64

                                u16Available-=64;

                                usb_write_reg(INCSR1, INIPRDY);

                                while (usb_read_reg(INCSR1) & INIPRDY);

                                usb_write_reg(INCSR1, INIPRDY);  

                                EUSB = 1;

                        }

                }

               
代码比较简单,基本上就是拿官方例程改了改,不过现在的版本还有很大问题
可能是有丢包或者其他情况,500K和1M采的数据完全不可用,降到250K才可用,并且受到通信速度和算法垃圾的影响,1M采样率只能采30ms,500K采样率可采120ms,250K及以下可以长时间采集
就这样吧,抛砖引玉,等一个感兴趣的大佬来优化了

最后,使用方法和网上卖的那种简易逻辑分析仪一样,源码见附件
25.7.13
调整了定时器0的中断优先级
在P01增加了一个100K占空比50%的pwm测试波形
修复了P35没有时钟输出的bug
目前来说500K虽然只能112ms,还比较稳定,可用
fx2lafw模拟.7z (78.75 KB, 下载次数: 6)

参考文档、视频
Ai8051产品规格书
上位机通信源码
https://github.com/sigrokproject ... rc/hardware/fx2lafw
下位机固件源码
https://github.com/sigrokproject ... fx2lafw/tree/master
USB拓展库及使用示例 | 本贴 咨询 USB,基本帮您把USB程序开发完成
https://www.stcaimcu.com/thread-16791-1-1.html
STC的usb课程
https://www.bilibili.com/video/BV1T8411r7ua
沁恒的usb课程
https://www.bilibili.com/video/BV1sy4y1n7d9



免费评分

参与人数 8威望 +2 吾爱币 +108 热心值 +6 收起 理由
wangxb2555 + 1 我很赞同!
klmytwb + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fiscivaj + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Lankunu + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhangkialinag + 1 + 1 用心讨论,共获提升!
fengbolee + 2 + 1 用心讨论,共获提升!
wushaominkk + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| 苏紫方璇 发表于 2025-7-15 23:01 |楼主
wushaominkk 发表于 2025-7-15 21:26
最好把抓包的思路也补充一下

抓包这个还是简单的,软件为主看协议数据传递,硬件为辅看具体的通信收发回复的时序修bug。软件上可以使用wireshark抓usb通信包,要注意,安装的时候勾选usb抓包插件才会有,硬件我选择了用手里的梦源逻辑分析仪,将usb中间d+和d-引出进行数据采集。
推荐
 楼主| 苏紫方璇 发表于 2025-8-6 13:55 |楼主

这种图一乐的东西就别想那么多了,只测试过1M,不是很稳也没查是电平翻转还是数据传输的问题,缩到250k可以steam模式可以长时间采集。
沙发
m_h 发表于 2025-7-13 00:57
协议不对称导致 高的抓不了?

点评

不是,高的是用内存抓的,和协议没关系,怀疑是usb通讯代码有问题造成发送的不完全  详情 回复 发表于 2025-7-13 01:16
3#
 楼主| 苏紫方璇 发表于 2025-7-13 01:16 |楼主
m_h 发表于 2025-7-13 00:57
协议不对称导致 高的抓不了?

不是,高的是用内存抓的,和协议没关系,怀疑是usb通讯代码有问题造成发送的不完全
4#
孤狼微博 发表于 2025-7-13 04:58
牛逼,最高支持多少M新买了个24M8路的

点评

自制这个就是仿的你那个,别想了性能超级垃圾,你那个核心支持usbdma和端口gpif直连,这个啥也不支持,目前状态最多250K  详情 回复 发表于 2025-7-13 11:03
5#
m_h 发表于 2025-7-13 10:30
苏紫方璇 发表于 2025-7-13 01:16
不是,高的是用内存抓的,和协议没关系,怀疑是usb通讯代码有问题造成发送的不完全

所以 没打算在linux试试吗?

点评

不试了,换个核心就能解决一切问题,主要是学习usb通信玩的  详情 回复 发表于 2025-7-13 11:04
6#
 楼主| 苏紫方璇 发表于 2025-7-13 11:03 |楼主
孤狼微博 发表于 2025-7-13 04:58
牛逼,最高支持多少M新买了个24M8路的

自制这个就是仿的你那个,别想了性能超级垃圾,你那个核心支持usbdma和端口gpif直连,这个啥也不支持,目前状态最多250K
7#
 楼主| 苏紫方璇 发表于 2025-7-13 11:04 |楼主
m_h 发表于 2025-7-13 10:30
所以 没打算在linux试试吗?

不试了,换个核心就能解决一切问题,主要是学习usb通信玩的
8#
guohuanxian 发表于 2025-7-13 12:59
嵌入式开发有福气了!8051在学校学习的
9#
孤狼微博 发表于 2025-7-14 23:20
苏紫方璇 发表于 2025-7-13 11:03
自制这个就是仿的你那个,别想了性能超级垃圾,你那个核心支持usbdma和端口gpif直连,这个啥也不支持,目 ...

没想到咱论坛也有玩这个的,像大佬学习

点评

论坛玩这个的应该也不少,我是小白,也就抄抄别人的项目做点东西玩玩  详情 回复 发表于 2025-7-15 01:49
10#
 楼主| 苏紫方璇 发表于 2025-7-15 01:49 |楼主
孤狼微博 发表于 2025-7-14 23:20
没想到咱论坛也有玩这个的,像大佬学习

论坛玩这个的应该也不少,我是小白,也就抄抄别人的项目做点东西玩玩
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-15 00:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表