Autor Tema: Proyecto PicUSB  (Leído 510480 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Proyecto PicUSB
« Respuesta #510 en: 28 de Febrero de 2010, 15:27:37 »
¿Si declaraste correctamente el tamaño de los búfers para los endpoint? Ahí indicas el número máximo de bytes a recibir/enviar:

Código: C
  1. #define USB_EP1_TX_SIZE    3
  2. #define USB_EP1_RX_SIZE    3
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #511 en: 28 de Febrero de 2010, 15:48:09 »
¿Si declaraste correctamente el tamaño de los búfers para los endpoint? Ahí indicas el número máximo de bytes a recibir/enviar:

Código: C
  1. #define USB_EP1_TX_SIZE    3
  2. #define USB_EP1_RX_SIZE    3

Correcto es eso!!!  :-/ muchísimas gracias  :)
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado WOOD_girl

  • PIC12
  • **
  • Mensajes: 56
Re: Proyecto PicUSB
« Respuesta #512 en: 08 de Marzo de 2010, 13:53:27 »
hola, me gustaria saber si es posible transmitir 2000 bytes, yo solo he podido enviar 100 bytes por medio del modo bulk... es esto posible'???

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #513 en: 13 de Marzo de 2010, 04:27:29 »
Te refieres a paquetes? Pues lo maximo es 64 tanto para recibir o enviar. Ahora, si quieres enviar 2000 pues con un ciclo for puedes enviar hasta millones xD!


sAlu2.

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #514 en: 16 de Marzo de 2010, 08:03:21 »
Hola de nuevo!

A ver si alguien me pudiera ayudar. Me ha pasado que la función usb_put_packet me devuelve un 0, que según la propia librería, solo devuelve un cero si el buffer de salida esta lleno de la vez anterior. Sin embargo del PC los recibo perfectamente todas las veces. Como podéis ver uso el mismo método que en el proyecto que nos ocupa, solo que envío 10 bytes en vez de 1, alquilen sabe porque puede estar pasando esto? El micro utilizado es el PIC18F2550.

Muchas gracias!  ;-)

Código: [Seleccionar]
/*******************************************************************************
/* usb_put_packet(endpoint,*ptr,len,toggle)
/*
/* Input: endpoint - endpoint to send packet to
/*        ptr - points to data to send
/*        len - amount of data to send
/*        toggle - whether to send data with a DATA0 pid, a DATA1 pid, or toggle from the last DATAx pid.
/*
[b]/* Output: TRUE if data was sent correctly, FALSE if it was not.  The only reason it will
/*         return FALSE is if because the TX buffer is still full from the last time you
/*         tried to send a packet.[/b]
/*
/* Summary: Sends one packet out the EP to the host.  Notice that there is a difference
/*          between a packet and a message.  If you wanted to send a 512 byte message you
/*          would accomplish this by sending 8 64-byte packets, followed by a 0 length packet.
/*          If the last (or only packet) being sent is less than the max packet size defined
/*          in your descriptor then you do not need to send a 0 length packet to identify
/*          an end of message.
/*
/*          usb_puts() (provided in usb.c) will send a multi-packet message correctly.
/*
/********************************************************************************/

Código: [Seleccionar]
//////////////////////////////////////////////////////////////////////////////
//                   Definiciones y equivalencias para el USB
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    10                //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    14                //size to allocate for the rx endpoint 1 buffer

Código: [Seleccionar]
// Encendemos led rojo               
   LED_ON(LEDR);

// Inicializamos el USB
   usb_init();                     
// Habilita periferico usb e interrupciones
   usb_task(); 
// Esperamos hasta que el PicUSB sea configurado por el host
   usb_wait_for_enumeration();     

 // Encendemos led verde y apagamos el rojo,
 // es indicador de que el USB comienza a funcionar
   LED_OFF(LEDR);
   LED_ON(LEDV1);                   
   
   while (TRUE)
   {
      if(usb_enumerated()) // Si el USB está configurado
      {
         if (usb_kbhit(1)) // Si el endpoint de salida contiene datos del host
         {
// Cojemos el paquete de tamaño 14 bytes del EP1 y almacenamos en recibeUSB
            usb_get_packet(1, recibeUSB, 14);

// Almacenamos datos y los enviamos a las mesas.
            if (modo == 0)
            {
               LED_OFF(LEDV2);
               LED_ON(LEDV3);
               LED_OFF(LEDV4);
               
               StatusEnvio=FALSE;
               ReEnvio    =TRUE;
               EnvioDatos(); // función que envía datos a través del modulo MRF24J40MA
             
               SPIreload();
            }

// Los datos recibidos via inalambrica son enviados al PC
            if (modo == 1)
            { 
               LED_OFF(LEDV2);
               LED_OFF(LEDV3);
               LED_ON(LEDV4);
               
// Enviamos el paquete de tamaño 10 bytes del EP1 al PC               
               uno=usb_put_packet(1, enviaUSB, 10, USB_DTS_TOGGLE);
               
               if (uno==0)
               { // Encendemos led verde2 para indicar que ha habido un fallo
               LED_ON(LEDV2);
               LED_OFF(LEDV3);
               LED_ON(LEDV4);
               }
               
// Se recarga el modulo MRF24J40MA para que vuelva a recibir datos.
               SPIreload();
               
            }
         }
      }
   }
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Proyecto PicUSB
« Respuesta #515 en: 16 de Marzo de 2010, 14:24:45 »
Veo que la salida de usb_put_packet la asignas a un led. Es altamente probable que no veas que el led está prendido porque sucede muy rápido. Métele un delay de 100ms y verás que sí prende.

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #516 en: 16 de Marzo de 2010, 15:44:20 »
Gracias por tu contestación migsantiago, pero sigue sin funcionar :(

Creo que me he explicado muy, mal mea culpa  :oops: :oops: Espero dejarlo mas claro ahora.  :oops:

Del Pc al aparato llega todo bien y siempre. ejecutando un programa en C# igual al del ejemplo, pero para 14 bytes en ligar de 3

Del aparato al PC solo funciona bien la primera vez. La otra devuelve un 0 incluso cuando le aplico los 100ms. Lo mismo para este caso 10 bytes en vez de 1.

Código: [Seleccionar]
uno=usb_put_packet(1, enviaUSB, 10, USB_DTS_TOGGLE);
     
               delay_ms(100);
               
               if (uno==0)
               { // Encendemos led verde2 para indicar que ha habido un fallo
               LED_ON(LEDV2);
               LED_OFF(LEDV3);
               LED_ON(LEDV4);

Me da la sensacion de que necesita resetearlo o algo, por que el fallo se produce cuando el buffer tx esta lleno de la vez anterior...

Estoy buscando alguna instrucción que haga esto y me estoy leyendo todo el post en este tema, hasta ahora nada ha funcionado voy por la pagina 15  :P ya queda menos.

Muchas gracias  :)
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Proyecto PicUSB
« Respuesta #517 en: 16 de Marzo de 2010, 19:31:16 »
Ah entonces no has modificado el archivo usb_desc_scope.h.

También en ése hay que asignar tamaño de endpoints.

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #518 en: 16 de Marzo de 2010, 21:07:24 »
Ah entonces no has modificado el archivo usb_desc_scope.h.

También en ése hay que asignar tamaño de endpoints.

Gracias por tu pronta respuesta! :)
Te comento el caso es que solo afecta al TX, el RX funciona perfectamente.... este es el código que tengo de esa librería, supongo que tendré que cambiar algo de esto. Si me pudieras decir el que, te lo agradeceria mucho!  :-/

Código: [Seleccionar]
   char const USB_CONFIG_DESC[] = {
   //config_descriptor for config index 1
         USB_DESC_CONFIG_LEN,     //length of descriptor size
         USB_DESC_CONFIG_TYPE,         //constant CONFIGURATION (0x02)
         USB_TOTAL_CONFIG_LEN,0,  //size of all data returned for this config
         1,      //number of interfaces this device supports
         0x01,                //identifier for this configuration.  (IF we had more than one configurations)
         0x00,                //index of string descriptor for this configuration
         0xC0,                //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 reserved and bit7=1
         0x32,                //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)

   //interface descriptor 0 alt 0
         USB_DESC_INTERFACE_LEN,  //length of descriptor
         USB_DESC_INTERFACE_TYPE,      //constant INTERFACE (0x04)
         0x00,                //number defining this interface (IF we had more than one interface)
         0x00,                //alternate setting
         2,       //number of endpoints, not counting endpoint 0.
         0xFF,                //class code, FF = vendor defined
         0xFF,                //subclass code, FF = vendor
         0xFF,                //protocol code, FF = vendor
         0x00,                //index of string descriptor for interface

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor
         USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
         0x81,              //endpoint number and direction (0x81 = EP1 IN)
         0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
         USB_EP1_TX_SIZE,0x00,         //maximum packet size supported
         0x01,              //polling interval in ms. (for interrupt transfers ONLY)

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor
         USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
         0x01,              //endpoint number and direction (0x01 = EP1 OUT)
         0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
         USB_EP1_RX_SIZE,0x00,         //maximum packet size supported
         0x01,              //polling interval in ms. (for interrupt transfers ONLY)

  };
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Proyecto PicUSB
« Respuesta #519 en: 16 de Marzo de 2010, 22:13:42 »
Tu archivo de descriptores está correcto.

Habría que revisar cómo defines la variable enviaUSB en el programa del pic. También hay que revisar la librería que usas en C#.

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #520 en: 17 de Marzo de 2010, 04:23:44 »
Bien gracias me alivia saber que a eso no hay que meterle mano :)

Seguiré investigando, ya comentare cual era el fallo.  :g)
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #521 en: 18 de Marzo de 2010, 13:56:19 »
Mu bien ya funciona!! no se como, pero el fallo estaba en la aplicación, poniendo las mismas funciones que en el programa de J1M y simplemente modificando los valores de los arrays. Supongo que el PC con la otra aplicación que tengo por aquí, hecha con objetos (aunque a mi juicio hace exactamente lo mismo) no liberaba el buffer TX del PIC en su comunicación con este, por la razón que fuera, que no he conseguido localizar y el PIC mostraba que ya no podía mandar mas al PC. En fin lo importante es que funciona!!! Del programa del PIC que publique antes no he cambiado ni una coma.
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #522 en: 23 de Marzo de 2010, 14:41:15 »
Hola de nuevo... retomo este asunto porque aunque conseguí hacerlo funcionar con el programa original ligeramente modificado, no lo puedo copipastear asi como asi en mi proyecto y por mas que lo miro no logro encontrar ni la diferencia ni el fallo...

El tema sigue siendo el mismo: con el mismo programa en el PIC18F2550 y el mismo driver instalado en el PC, podemos enviar cuantas veces queramos los datos del micro al PC y del PC al micro que llegan bien. Osea la única diferencia es la aplicación, pero esta provoca un fallo en el micro haciendo que esta función uno=usb_put_packet(1, enviaUSB, 10, USB_DTS_TOGGLE); devuelva 0 y se observe que no le llegan los datos al PC. Es el que expongo a continuación: (Esta en C# igual que el original)
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices; // Clase para importar DLL

using PVOID = System.IntPtr;
using DWORD = System.UInt32;

namespace FFTM.BusinessLayer.USB
{
    unsafe public class USB
    {
        #region Variables
        void* myOutPipe;
        void* myInPipe;

        #endregion

        #region Constantes
        private static string vid_pid_norm = "vid_04d8&pid_0011";

        string out_pipe = "\\MCHP_EP1";
        string in_pipe = "\\MCHP_EP1";

        private const uint MESSAGE_OUT_LENGTH = 14;
        private const uint MESSAGE_IN_LENGTH  = 9;
        #endregion

        #region Properties
        #endregion

        #region Funciones importadas de la DLL: mpusbapi.dll
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDLLVersion();
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID);
        [DllImport("mpusbapi.dll")]
        private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern bool _MPUSBClose(void* handle);
        #endregion

        #region Constructor
        public USB ()
        {

        }
        #endregion

        #region Methods
        #region Public
        public void OpenPipes()
        {
            DWORD selection = 0;

            myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0);
            myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0);
        }

        public void ClosePipes()
        {
            _MPUSBClose(myOutPipe);
            _MPUSBClose(myInPipe);
        }

        /// <summary>
        /// Esta es la funcion que se usa para enviar los datos por usb al
        /// interface Zigbee
        /// </summary>
        /// <param name="SendData">Array to send</param>
        /// <param name="SendLength">length of the packet to send</param>
        public void SendPacket(USBOutMessage outMessage)
        {
            byte[] messageStream = getOutMessageArray(outMessage);

            fixed (byte* SendData = messageStream)
            {
                DWORD SendLength = MESSAGE_OUT_LENGTH;

                uint SendDelay = 1000;

                DWORD SentDataLength;

                OpenPipes();
                _MPUSBWrite(myOutPipe, (void*)SendData, SendLength, &SentDataLength, SendDelay);
                ClosePipes();
            }
        }
        // esta es la funcion que se usa para recibir los datos por usb al interface Zigbee
        public USBInMessage ReceivePacket()
{
            USBInMessage inMessage = null;

            fixed (byte* ReceiveData = new byte[MESSAGE_IN_LENGTH])
            {
                DWORD ReceiveLength = MESSAGE_IN_LENGTH;

                uint ReceiveDelay = 1000;

                DWORD ExpectedReceiveLength = ReceiveLength;

                OpenPipes();
                _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectedReceiveLength, &ReceiveLength, ReceiveDelay);
                ClosePipes();

                inMessage = getInMessage(ReceiveData);
            }

            return inMessage;
        }

Este es el código que si que funciona, pero yo no soy capaz de ver la diferencia, por favor si a alguien le ha pasado algo parecido, comentemelo por favor muchas gracias!
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices; // Clase para importar DLL

using PVOID = System.IntPtr;
using DWORD = System.UInt32;

namespace PicUSB
{
    unsafe public class PicUSBAPI
    {
        #region Definición de los Strings: EndPoint y VID_PID
        string vid_pid_norm = "vid_04d8&pid_0011";

        string out_pipe = "\\MCHP_EP1";
        string in_pipe = "\\MCHP_EP1";
        #endregion

        #region Funciones importadas de la DLL: mpusbapi.dll
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDLLVersion();
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID);
        [DllImport("mpusbapi.dll")]
        private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern bool _MPUSBClose(void* handle);
        #endregion

        void* myOutPipe;
        void* myInPipe;

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new PicUSB());
        }

        public void OpenPipes()
        {
            DWORD selection = 0;

            myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0);
            myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0);
        }

        public void ClosePipes()
        {
            _MPUSBClose(myOutPipe);
            _MPUSBClose(myInPipe);
        }

        private void SendPacket(byte* SendData, DWORD SendLength)
        {
            uint SendDelay = 1000;

            DWORD SentDataLength;

            OpenPipes();
            _MPUSBWrite(myOutPipe, (void*)SendData, SendLength, &SentDataLength, SendDelay);
            ClosePipes();
        }

        private void ReceivePacket(byte* ReceiveData, DWORD *ReceiveLength)
{
uint ReceiveDelay=1000;

DWORD ExpectedReceiveLength = *ReceiveLength;

OpenPipes();
            _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectedReceiveLength, ReceiveLength, ReceiveDelay);
            ClosePipes();
        }


Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Proyecto PicUSB
« Respuesta #523 en: 23 de Marzo de 2010, 15:34:03 »
¿Esto no debería ser de 10?

Código: [Seleccionar]
        private const uint MESSAGE_IN_LENGTH  = 9;

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Proyecto PicUSB
« Respuesta #524 en: 24 de Marzo de 2010, 05:42:59 »
¿Esto no debería ser de 10?

Código: [Seleccionar]
        private const uint MESSAGE_IN_LENGTH  = 9;

Muchas gracias por tu rápida respuesta migsantiago, eso seguro que es un fallo, que joer que despiste pero lo he probado y sigue fallando... aunque es una buena linea de investigacion, seguire trabajando con ello, muchas gracias de nuevo  :)
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW