Thông báo

Collapse
No announcement yet.

usb hid 18f4550

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • usb hid 18f4550

    mình đang làm cái máy ghi âm với pic18f4550 nhưng vướng phải khó khăn khi report gói nhiều byte lên host. trong file usb_desc_hid.h mình đã khai báo:
    const char USB_CLASS_SPECIFIC_DESC[] = {
    6, 0, 0xff, // Usage Page = Vendor Defined
    0x09, 0x01, // Usage = Phone
    0xa1, 1, // Collection = Application

    0x19, 1, // Usage minimum
    0x29, 8, // Usage maximum
    0x15, 0x80, // Logical minimum (-128)
    0x25, 0x7F, // Logical maximum (127)
    0x75, 8, // Report size = 8 (bits)
    0x95, 64, // Report count
    0x81, 2, // Input (Data, Var, Abs)

    0x19, 1, // Usage minimum
    0x29, 8, // Usage maximum
    0x75, 8, // Report size = 8 (bits)
    0x95, 2, // Report count = 16 bits (2 bytes)
    0x91, 2, // Output (Data, Var, Abs)

    0xc0 // End Collection
    };

    trong hàm main mình gửi gói :
    a=usb_put_packet(1, out_data, 64, USB_DTS_TOGGLE);
    thì bị reset pipe liên tục, nếu gửi các gói 2,4,8 byte thì không có lỗi gì. HID ngắt 250ms, dùng USB Monitor để theo dõi. Mông các cao nhân PIC chỉ cách khắc phục. thanks.
    ! ! you can win if you want ! !

  • #2
    Em cũng gặp trường hợp tương tự, truyền mảng <8 bytes thì OK, lớn hơn là dở chứng, chẳng hiểu tại sao nữa

    Em làm bằng CDC và Custom Driver thì truyền mảng 64 byte lên thoải mái, còn HID thì chịu.

    Comment


    • #3
      To da lam voi lop HID roai (chip AT89C5131). Truyen nhan goi 64 bytes tot. Moi mot loi la toc do qua thap. Bay gio dung lop Custom Driver thi toc do cai thien hon nhieu.
      Ban co the tham :
      //Report Descriptor
      {
      0x05,0x01, //Usage Page
      0x09,0x00, //Usage (undefine)
      0xa1,0x01, //Colection (Application)
      0x05,0x00, //Usage_Page (undefine)
      0x19,0x00, //Usage Minimum (undefine)
      0x29,0x00, //Usage Maximum (undefine)
      0x75,0x08, //Report size 8 bits
      0x95,0x40, //Report Count 64 bytes
      0x81,0x00, //Input
      0x05,0x00, //Usage_Page (undefine)
      0x19,0x00, //Usage Minimum (undefine)
      0x29,0x00, //Usage Maximum (undefine)
      0x75,0x08, //Report size 8 bits
      0x95,0x1F, //Report Count 31 bytes (+ 1 byte 0x00)
      0x91,0x00, //Output
      0xc0 //End collection
      }

      Comment


      • #4
        hid , " hít heroin " , tôi có sưu tầm được cái này trên web , hi vọng bác Hít được phê hơn ...

        /////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        // PIC18F2550 USB HID

        #define __USB_PIC_PERIF__ 1

        #include <18F2550.h>
        #device ADC=8
        #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CP UDIV1,VREGEN
        #use delay(clock=48000000)

        #build(reset=0x1, interrupt=0x8) // Necessary for Bootloader
        #ORG 0x0F00,0x0FFF {} // Necessary for Bootloader

        #use rs232(stream=PC, baud=115200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

        // CCS Library dynamic defines
        #DEFINE USB_HID_DEVICE TRUE //Tells the CCS PIC USB firmware to include HID handling code.
        #define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for IN bulk/interrupt transfers
        #define USB_EP1_TX_SIZE 64 //allocate 64 bytes in the hardware for transmission
        #define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for OUT bulk/interrupt transfers
        #define USB_EP1_RX_SIZE 64 //allocate 64 bytes in the hardware for reception

        // CCS USB Libraries
        #include <pic18_usb.h> //Microchip 18Fxx5x hardware layer for usb.c
        #include <usb_desc_hid 8-byte.h> //USB Configuration and Device descriptors for this UBS device
        #include <usb.c> //handles usb setup tokens and get descriptor reports

        void usb_debug_task(void) {
        static int8 last_connected;
        static int8 last_enumerated;
        int8 new_connected;
        int8 new_enumerated;

        new_connected=usb_attached();
        new_enumerated=usb_enumerated();

        if (new_connected && !last_connected) {
        printf("\r\n\nUSB connected, waiting for enumaration...");}
        if (!new_connected && last_connected) {
        printf("\r\n\nUSB disconnected, waiting for connection...");}
        if (new_enumerated && !last_enumerated) {
        printf("\r\n\nUSB enumerated by PC/HOST");}
        if (!new_enumerated && last_enumerated) {
        printf("\r\n\nUSB unenumerated by PC/HOST, waiting for enumeration...");}

        last_connected=new_connected;
        last_enumerated=new_enumerated;
        }

        #INT_RDA
        void serial_isr() // Serial Interrupt
        {
        int8 uReceive;

        disable_interrupts(GLOBAL); // Disable Global Interrupts

        uReceive = fgetc(PC);

        switch (uReceive) {
        case 0x12: {
        if (fgetc(PC) == 0x34 & fgetc(PC) == 0x56 & fgetc(PC) == 0x78 & fgetc(PC) == 0x90) #asm reset #endasm
        }
        break;
        }

        enable_interrupts(GLOBAL); // Enable Global Interrupts
        }

        int calc_crc(int oldcrc, int newbyte) {
        // Please see: http://pdfserv.maxim-ic.com/arpdf/AppNotes/app27.pdf

        int shift_reg, data_bit, sr_lsb, fb_bit, j;
        shift_reg=oldcrc;
        for(j=0; j<8; j++) { // for each bit
        data_bit = (newbyte >> j) & 0x01;
        sr_lsb = shift_reg & 0x01;
        fb_bit = (data_bit ^ sr_lsb) & 0x01;
        shift_reg = shift_reg >> 1;
        if (fb_bit)
        shift_reg = shift_reg ^ 0x8c;
        }
        return(shift_reg);
        }

        #define theSampleSize 512

        #define usbConfirmAction 0
        #define usbCheckStatus 1
        #define usbReadRam 2
        #define usbWriteRam 3
        #define usbReadADC 4
        #define usbReadADCnTimes 5
        #define usbReadADCPeriod 6
        #define usbReadADCnTimesMS 7
        #define usbClearRam 8
        #define usbSetRamByte 9
        #define usbSetUseCRC 10
        #define usbClearUseCRC 11
        #define usbReadADCnTimesUS 12
        #define usbError 66

        void main() {
        int1 useCRC;
        int8 in_data[8];
        int8 out_data[8];
        int8 adcData[theSampleSize];
        int8 theCRC, tempADC;
        int16 n, approxUS, approxMS, period;

        SETUP_ADC_PORTS(AN0);
        SETUP_ADC(ADC_CLOCK_DIV_64);
        SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_1);
        SETUP_TIMER_1(T1_DISABLED);
        SETUP_TIMER_2(T2_DISABLED, 127, 1);
        SETUP_TIMER_3(T3_INTERNAL | T3_DIV_BY_8);
        SETUP_CCP1(CCP_OFF);
        SETUP_CCP2(CCP_OFF);
        enable_interrupts(INT_RDA);
        enable_interrupts(GLOBAL);

        usb_init();
        useCRC = true;
        set_adc_channel(0);
        delay_ms(1);

        while (TRUE) {
        usb_task();
        usb_debug_task();
        if (usb_enumerated()) {
        if (usb_kbhit(1)) {
        usb_get_packet(1, in_data, 8);

        if (useCRC) {
        theCRC = 0;
        theCRC = calc_crc(theCRC,in_data[0]);
        theCRC = calc_crc(theCRC,in_data[1]);
        theCRC = calc_crc(theCRC,in_data[2]);
        theCRC = calc_crc(theCRC,in_data[3]);
        theCRC = calc_crc(theCRC,in_data[4]);
        theCRC = calc_crc(theCRC,in_data[5]);
        theCRC = calc_crc(theCRC,in_data[6]);
        }
        else {
        theCRC = in_data[7];
        }

        if (theCRC = in_data[7]) {
        out_data[0] = 255;
        out_data[1] = 255;
        out_data[2] = 255;
        out_data[3] = 255;
        out_data[4] = 255;
        out_data[5] = 255;
        out_data[6] = 255;

        switch (in_data[0]) {
        case usbReadRam: {
        if (make16(in_data[1],in_data[2]) <= theSampleSize) {
        out_data[0] = usbConfirmAction;
        out_data[1] = usbReadRam;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        out_data[4] = adcData[make16(in_data[1],in_data[2])];
        }
        else {
        out_data[0] = usbError;
        out_data[1] = usbReadRam;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        }
        }
        break;
        case usbWriteRam: {
        if (make16(in_data[1],in_data[2]) <= theSampleSize) {
        adcData[make16(in_data[1],in_data[2])] = in_data[3];
        out_data[0] = usbConfirmAction;
        out_data[1] = usbWriteRam;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        out_data[4] = in_data[3];
        }
        else {
        out_data[0] = usbError;
        out_data[1] = usbWriteRam;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        out_data[4] = in_data[3];
        }
        }
        break;
        case usbReadADC: {
        tempADC = READ_ADC();
        out_data[0] = usbConfirmAction;
        out_data[1] = usbReadADC;
        out_data[2] = tempADC;
        }
        break;
        case usbReadADCnTimes: {
        if (make16(in_data[1],in_data[2]) <= theSampleSize) {
        set_timer3(0);
        for (n=0;n<make16(in_data[1],in_data[2]);n++)
        {
        adcData[n] = READ_ADC();
        }
        period = get_timer3(); // 1000/((clock/4)/8) for ms
        out_data[0] = usbConfirmAction;
        out_data[1] = usbReadADCnTimes;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        }
        else {
        out_data[0] = usbError;
        out_data[1] = usbReadADCnTimes;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        }
        }
        break;
        case usbReadADCPeriod: {
        out_data[0] = usbConfirmAction;
        out_data[1] = usbReadADCPeriod;
        out_data[2] = make8(period,1);
        out_data[3] = make8(period,0);
        }
        break;
        case usbReadADCnTimesUS: {
        if (make16(in_data[1],in_data[2]) <= theSampleSize) {
        approxUS = make16(in_data[3],in_data[4]);
        for (n=0;n<make16(in_data[1],in_data[2]);n++)
        {
        set_timer3(0);
        adcData[n] = READ_ADC();
        while (get_timer3() * 2/3 < approxUS); // 1000000/((clock/4)/8)
        }
        out_data[0] = usbConfirmAction;
        out_data[1] = usbReadADCnTimesUS;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        out_data[4] = in_data[3];
        out_data[5] = in_data[4];
        }
        else {
        out_data[0] = usbError;
        out_data[1] = usbReadADCnTimesUS;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        out_data[4] = in_data[3];
        out_data[5] = in_data[4];
        }
        }
        break;
        case usbReadADCnTimesMS: {
        if (make16(in_data[1],in_data[2]) <= theSampleSize) {
        approxMS = make16(in_data[3],in_data[4]);
        for (n=0;n<make16(in_data[1],in_data[2]);n++)
        {
        set_timer3(0);
        adcData[n] = READ_ADC();
        while (get_timer3() * 1/1500 < approxMS); // 1000/((clock/4)/8)
        }
        out_data[0] = usbConfirmAction;
        out_data[1] = usbReadADCnTimesMS;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        out_data[4] = in_data[3];
        out_data[5] = in_data[4];
        }
        else {
        out_data[0] = usbError;
        out_data[1] = usbReadADCnTimesMS;
        out_data[2] = in_data[1];
        out_data[3] = in_data[2];
        out_data[4] = in_data[3];
        out_data[5] = in_data[4];
        }
        }
        break;
        case usbClearRam: {
        for (n=0;n<512;n++)
        {
        adcData[n] = 0;
        }
        out_data[0] = usbConfirmAction;
        out_data[1] = usbClearRam;
        }
        break;
        case usbSetRamByte: {
        for (n=0;n<512;n++)
        {
        adcData[n] = in_data[1];
        }
        out_data[0] = usbConfirmAction;
        out_data[1] = usbSetRamByte;
        out_data[2] = in_data[1];
        }
        break;
        case usbSetUseCRC: {
        useCRC = true;
        out_data[0] = usbConfirmAction;
        out_data[1] = usbSetUseCRC;
        }
        break;
        case usbClearUseCRC: {
        useCRC = false;
        out_data[0] = usbConfirmAction;
        out_data[1] = usbClearUseCRC;
        }
        break;
        }
        if (useCRC) {
        theCRC = 0;
        theCRC = calc_crc(theCRC,out_data[0]);
        theCRC = calc_crc(theCRC,out_data[1]);
        theCRC = calc_crc(theCRC,out_data[2]);
        theCRC = calc_crc(theCRC,out_data[3]);
        theCRC = calc_crc(theCRC,out_data[4]);
        theCRC = calc_crc(theCRC,out_data[5]);
        theCRC = calc_crc(theCRC,out_data[6]);
        out_data[7] = theCRC;
        }

        usb_put_packet(1, out_data, 8, USB_DTS_TOGGLE);
        }

        delay_ms(1);
        }
        }
        }
        }
        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

        Comment


        • #5
          cái của bác QD là hàng 8 byte mà. với lại tính crc như thế thì lâu vãi,chỉ cần xor là ổn rồi...hàng 64 byte hid mới khó. hình như khai báo class như trong cái example là win kô chấp nhận >8 byte. Dùng cái usb monitor thấy nó report được 64 byte nhưng nếu dùng hàm usb_put_packet với số byte>8 thì nó reset pipe ngay. thank to PTH, mình sẽ thử dùng CDC.
          ! ! you can win if you want ! !

          Comment


          • #6
            Hic. Thực ra dùng HID truyền report 64 byte rất dễ. mình vừa test lại, chương trình bị lỗi chỗ khác. Nếu bạn muốn dùng giao tiếp usb, thì có lẽ đơn giản nhất là phần firm sửa đổi cái file ex_usb_hid.c, sửa một tý trong file usb_desc_hid.h (phần report và string), code trên PC dùng EasyHID (nhớ chỉnh lại BUFFER_IN_SIZE tăng thêm 1 byte vì byte đầu tiên BufferIn[0] is the report ID). CCS và EasyHID là một sự kết hợp hoàn hảo cho PIC8F4550.
            ! ! you can win if you want ! !

            Comment


            • #7
              có ai biết viết driver cho USB thế nào không nhỉ? Tui nghe nhiều người bảo là viết bằng VB và VC. Nhưng khó quá. Tui đã tìm hiểu nhiều về nó. Nhưng không có code nào để xem cách viết thế nào. Ai có code thì có thể up lên cho mọi người xem với được không?


              Tại sao Việt Nam lại phát triển chậm. Một lý do đó là: bảo mật

              Comment


              • #8
                Chú ý về USB HID
                - On slow speed devices the max packet size is 8.
                - On a full speed device the max packet size is 64.

                Email:
                Phone: 0905.034.086

                Comment

                Về tác giả

                Collapse

                anhtuan133 Tìm hiểu thêm về anhtuan133

                Bài viết mới nhất

                Collapse

                Đang tải...
                X