pic18-usb

2020-02-09 11:24发布

avr都有很多搞USB的文章,咱们pic专区也不能闲着啊,有没有哪位高手用pic18f2550做过,能不能资源共享一下啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
headwolf_83
1楼-- · 2020-02-09 16:11
直接去下MCHP的协议栈好了,里面已经很详细了。拿过来直接用。上位机,下位机都做了。
li4512369
2楼-- · 2020-02-09 17:51
 精彩回答 2  元偷偷看……
li4512369
3楼-- · 2020-02-09 18:00
补充一下:用官方自带的PDFSUSB程序功能完全实现
headwolf_83
4楼-- · 2020-02-09 19:53
MCHP的DEMO有很多,有HID的,有自自己搞驱动的,你首先要弄清楚你的DEMO是什么类型的固件。
li4512369
5楼-- · 2020-02-09 23:42
问题已经搞定了,已经能够接收上位机发送的指令了,但是用我的LABVIEW程序却无法读取下位机的数据,其显示“设置不对”(搞了好久还是搞不定)。猜测可能是上位机程序的问题,再请各位指点一二,附上我更改的下位机程序和上位机程序:

1:下位机程序的更改:(参见user.c)
*****************************************************************************/
void ServiceRequests(void)
{
    byte index;
   
    if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)))     //如果USB总线接收到数据
    {
        counter = 0;
        switch(dataPacket.CMD)                          //判断数据包的CMD字节位
        {
                           case 0x00:                            //如果CMD为0那么就将0x00
                dataPacket._byte[2] = 0x00;              //和0x01发送给上位机
                dataPacket._byte[3] = 0x01;             //并且送数据包的大小4个字节
                counter=0x04;

            case 0x01:                      //如果CMD为1那么就判断ID这个字节

                counter = 0x01;        
                if(dataPacket.ID == 0)      //如果ID为0那么就LED3和LED4关闭

                {
                    mLED_3_Off();mLED_4_Off();
                }
                else if(dataPacket.ID == 1)      //如果ID为1那么就。。。。。。

                {
                    mLED_3_Off();mLED_4_On();
                }
                else if(dataPacket.ID == 2)
                {
                    mLED_3_On();mLED_4_Off();
                }
                else if(dataPacket.ID == 3)
                {
                    mLED_3_On();mLED_4_On();
                }
                else
                    counter = 0x00;
                break;
           
            case 0x02:                    //RD_POT
                //ReadPOT();
                                //dataPacket._byte[1] = ADRESL;
                //dataPacket._byte[2] = ADRESH;
                                dataPacket._byte[1] = 0xff;       //将0xff和0x00发送给主机
                dataPacket._byte[2] = 0x00;
                counter=0x04;
                break;
               
           /* case RESET:
                Reset();
                break;
             */   
            default:
                break;
        }//end switch()
        if(counter != 0)      //在USB总线空闲的时候将datapacket+比特数发送给主机
        {
            if(!mUSBGenTxIsBusy())
               {
                   USBGenWrite((byte*)&dataPacket,counter);
               }
        }//end if
    }//end if

}//end ServiceRequests


2上位机程序:
我才用的是labview软件自带的USB测试程序进行的部分更改,从从机设备的识别和对LED的控制都能实现了,可是就是主机发送指令给单片机要读取数据却不能实现,具体如下:

当发送设置如下图1所示时,LED3和LED4都关闭更改发送的数据可实现LED3和LED4的组合控制,证明数据的接收时没有问题的

但是当我对其发送0x00或者512让从机发送数据给主机读取,甚至不管发送什么数据只要点击“Bulk in”时就会报错(图2):

这个问题着实把我给难住了,希望高手指点一二,甚是感激。


(原文件名:1.JPG)


(原文件名:2.JPG)

我的整个开发文件夹ourdev_585682MG6DWP.rar(文件大小:1.06M) (原文件名:Demo.rar)
li4512369
6楼-- · 2020-02-10 05:07
我打算用最便宜的方式做一个300KHz~900MHz的扫频仪(信号输出锁相),射频部分的电路已经没有什么问题了。数据传输之前用串口做了一下,还是可以的只是觉得显示刷新率不是那么的尽如人意(MCU是PIC16F877A),所以才打算用USB来传输数据,现在USB功能已经有雏形了,正在画PCB等弄得差不多了传上来与大家分享。在此对headwolf_83 表示感谢!

一周热门 更多>