En esta ocación vengo para empezar a desarrollar entre todos una librería de USB usando el lenguaje ensamblador para la familia de microcontroladores PIC18FXX5X.
La razón de esto , es porque hay muchos usuarios que son expertos manejando ASM pero no saben utilizar bien el lenguaje C o lenguajes de alto nivel. También otra razón es que quiero que todos entendamos de una manera más profunda el funcionamiento del módulo USB de la familia microchip...y luego de esto poder "tratar" de implementar la comunicación USB en cualquier microcontrolador...
El desarrollo de este hilo se hará de forma parecida al https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/ pero todos los desarrollos al igual que los diferentes programas de ejemplos se harán en ASM.
Para empezar a trabajar con el puerto USB del microcontrolador veremos todos los registros del micro asociados con este periférico , su funcionamiento y luego poco a poco comenzaremos a confeccionar los primeros programas.
Bueno para empezar veremos donde están hubicados los pines D- y D+ ( correspondientes a las señales de datos del puerto USB en el PIC18F2550 y en el PIC18F4550) , asi como también los otros pines que intervienen en su funcionamiento.
[/URL]
Breve descripción del funcionamiento del módulo USB:
La familia de dispositivos PIC18FX455/X550 contiene una interfaz serie compatible con el SIE (serial interface engine o máquina con comunicación serie en español) USB “full-speed” (2.0) y “de poca velocidad” (1.0) que permite la comunicación rápida entre cualquier dispositivo USB y el microcontrolador PIC®.
El SIE puede interconectarse directamente al USB, utilizando el transmisor - receptor interno, o puede conectarse a través un transmisor-receptor externo. El PIC tiene un regulador interno de 3,3V para alimentar el transmisor-receptor interno en aplicaciones de 5V.
Se han incluido algunas características especiales en el hardware para mejorar el funcionamiento. Se proporciona memoria de puerto dual en la memoria de datos del dispositivo (RAM del USB) para tener acceso directo a la memoria desde el núcleo del microcontrolador y desde el SIE. También se proporcionan unos buffer para que el programador elija libremente el uso de la memoria dentro del espacio de la RAM del USB. Existe un puerto paralelo para transmitir grandes cantidades de datos (SSP), para esto se ha proporcionado la ayuda de transferencia ininterrumpida de volúmenes de datos grandes, por ejemplo datos síncronos, a los buffer de memoria externos.
Bueno ahora veremos en detalle como se comunica la SIE con el exterior y las diferentes opciones a nivel conexionado del USB con el exterior:
Antes que nada veremos las notas a las referencias 2 y 3 que están dentro de la inmágen. Aclarar que estas notas son importantes para no cometer equivocaciones a la hora de programar el código que lo configura.
entonces:
Nota* 2:Las pull - ups externas son opcionales , pero si queremos usarlas hay que desactivar las propias resistencias de pull - up internas que tiene el microcontrolador. La activación o desactivación de estas resistencias se hace mediante el bit UPUEN...que se verá más adelante.
Nota* 3:El regulador de voltaje de 3.3v, nos provee de tensión al módulo USB en aplicaciones de 3.3v. En caso de tener una fuente externa de 3.3v conectada a Vusb, tenemos que desactivar el módulo interno del regulador.
Vemos en la inmágen los diferentes pines que según configuración de la SIE , podemos usar un transceptor externo, el fin de este tutorial no es el estudio de los módulos externos , por lo que se verá muy superficialmente.
Algo ¡ Muy importante ! que tenemos que ver es el puente bidireccional entre la SIE y el SSP...este puente nos va a permitir el transporte a alta velocidad de grandes flujos de datos en modo sincrono, por lo que se estudiará también en su momento.
Ver la siguiente inmágen en donde se muestra dicho puente:
Espero les sirva ...después sigo
Estado y control del módulo USB:
En total hay 22 registros para manejar las transacciones del USB. Los registros son:
• Registro de control del USB (UCON)
• Registro de configuración del USB (UCFG)
• Registro de estado de la transferencia del USB (USTAT)
• Registro de dirección de dispositivo USB (UADDR)
• Registros del número del frame (UFRMH: UFRML)
• Registros activadores de los Endpoints de 0 a 15 (UEPN)
El primer registro que estudiaremos será el UCON (registro de control del USB):
En la siguiente inmágen veremos como está constituido:
Este registro de control contiene los bits necesarios para determinar el comportamiento del bus durante las transferencias. El registro contiene los bits que gobiernan lo siguiente:
• Permiso del periférico principal del USB
• Reset de los punteros tipo ping-pong
• Control del modo al suspender
• Desactivar la transferencia de paquetes
El significado de los diferentes bits se muestra a continuación:
BIT7: Bit no implementado se lee como "0"
BIT6: El bit PPBRST, se encarga de controlar el estado del reset, cuando se utiliza el modo Doble - Buffering o modo Ping - Pong.Cuando se activa el bit PPBRST, todos los buffers Ping - Pong se fijan a los buffers intermedios. El bit PPBRST, tiene que borrarse por firmware.Este bit se ignora en los modos de buffer que no usen el buffer ping-pong.
BIT5: El bit SE0,se utiliza para indicar el estado del bus, si sólo se manda un cero.
Cuando se permite el módulo USB, este bit debe supervisarse para determinar si las líneas de datos han salido de una condición de single-ended cero (sólo se manda cero). Esto ayuda a distinguir el estado de ciclo inicial de la señal de reset del USB.
BIT4: El bit PKTDIS,es un flag que indica si el SIE ha inhabilitado la transmisión y la recepción de paquetes. Este lo bit activa el SIE cuando recibe un SETUP para permitir su procesamiento. Este bit no lo puede activar el microcontrolador, sólo borrar; al despejarlo el SIE continua la transmisión y/o recepción. Cualquier acontecimiento pendiente dentro del buffer intermedio todavía estará disponible, indicado dentro del registro USTAT en el buffer FIFO.
BIT3: El bit USBEN,la operación total del módulo USB se controla con este bit. Activar este bit setea el módulo y resetea todos los bits PPBI en el Buffer a ‘0’. Este bit también activa el regulador de tensión del chip y conecta las resistencias pull-up, si se permiten. Así, este bit puede utilizarse como una unión/separación al USB. Aunque se ignoran todos los estados y bits de control si este bit está borrado, el módulo necesita preconfigurarse antes de activar este bit.
BIT2: El bit RESUME,permite al periférico realizar un reinicio ejecutando la señal resume. Para generar un reinicio válido, por firmware se debe activar el RESUME durante 10ms y entonces borrar el bit.
BIT1: El bit SUSPND,coloca el módulo y soporte del circuito (es decir,regulador de tensión) en un modo de baja potencia. El reloj de entrada al SIE se desactiva. Este bit debe activarse por software dentro de la respuesta a una interrupción IDLEIF. Debe borrarse por firmware después de observar una interrupción ACTVIF. Cuando este bit está activo, sigue estando el dispositivo unido al bus pero las salidas del transmisor-receptor permanecen en reposo. La tensión en el pin VUSB puede variar dependiendo del valor de este bit. Activar este bit antes de un IDLEIF dará lugar a
comportamiento imprevisible del bus.
Nota:Cuando esté en el modo de suspensión, el bus del dispositivo USB se limita al 500μA de corriente. Ésta es la corriente completa cedida por el dispositivo PIC y su circuito de soporte. Hay que tener cuidado de ceder la corriente mínima cuando el dispositivo entre en el modo de suspensión.
BIT0: Bit no implementado se lee como "0"
Registro de configuración del USB:
Antes de comunicarse con el USB, se tiene que configurar el módulo del hardware interno y/o externo. La mayor parte de la configuración se realiza con el registro UCFG. El regulador de tensión del USB se maneja con la configuración de los registros.
El registro UFCG contiene la mayor parte de los bits que dirigen el comportamiento del módulo USB. Éstos incluyen:
• Velocidad del bus (“Alta velocidad” vs “Baja velocidad”)
• Permiso de las resistencias pull-up del chip
• Permiso del transmisor del chip
• Uso del buffer ping-pong
El registro UCFG también contiene dos bits que ayudan a probar el módulo, eliminando errores y certificaciones del USB. La salida de control de estos bits permite el monitor de estado y generación de patrones “de ojo”.
BIT 7: UTEYE: Bit de permiso del test patrón “de ojo” del USB.
1 = prueba del patrón “de ojo” permitido.
0 = prueba del patrón “de ojo” inhabilitado.
BIT 6: UOEMON: Bit de permiso del monitor OE del USB.
1 = señal del UOE* activa; indica los intervalos durante los cuales las líneas D+/D- están conduciendo.
0 = señales del UOE* inactivas.
BIT 4: UPUEN: Bit de permiso del pull-up del chip.
1 = Pull-up del chip permitido (pull-up en D+ con FSEN=1 o en D- con FSEN=0).
0 = Pull-up del chip desactivado.
BIT 3: UTRDIS: Bit inhabilitador del transmisor del chip
1 = Transmisor del chip inhabilitado; la interfaz digital del transmisor permitida.
0 = transmisor del chip activo.
BIT 2: FSEN: Bit de permiso del Full-Speed.
1 = dispositivo Full-speed: controla los flancos del transmisor; requiere un reloj de 48MHz.
0 = dispositivo de poca velocidad: controla los flancos del transmisor; requiere un reloj de 6MHz.
BIT 1-0 PPB1
PB0: Bits de configuración de los buffer ping-pong.
11 = buffers ping-pong permitidos en los End-Points 1 a 15.
10 = buffers ping-pong permitidos en todos los End-Points.
01 = buffer ping-pong permitido en los End-Points de salida 0.
00 = buffers ping-pong inhabilitados.
Nota 1:
1: Si se activa UTRDIS, la señal UOE* estará activa independiente del ajuste del bit UOEMON.
2: Los bits UPUEN, UTRDIS y FSEN no deben cambiarse mientras el módulo USB esté permitido. Estos valores se deben preconfigurar antes de permitir el módulo.
3: Este bit solamente es válido cuando el transmisor del chip está activo (UTRDIS = 0); si no, se ignora.
Nota 2: La velocidad del USB, la transmisión y las pull-up deben configurase solamente durante la fase de activación del módulo. No se recomienda cambiar estos ajustes mientras que el módulo esté funcionando.
Viendo un poco el registro UCFG, en donde se encuentra el bit UTEYE, que es un bit de control de estado del USB que vigila los errores y es un generador de patrones.
Luego tenemos al bit UOEMON. Este bit nos muestra cuando las lineas D+ y D- están conduciendo y lo que estos valores representan según el siguiente cuadro:
Ahora tenemos 2 bit que trabajan de forma conjunta FSEN y UPUEN, según sea su configuración activarán o desactivarán las Resistencias Pull - Up internas del módulo USB o configuraran el módulo USB para trabajar a full - speed o slow - speed.
Veamos el circuito lógico que realiza estas acciones y una pequeña tabla donde se muestran las posibles configuraciones.
Luego tenemos UTRDIS, que habilita o deshabilita el transmisor del chip, en caso de que el bit sea 0 , activamos el transceptor y los pines C4 y C5 son usados para conectar el dispostivo USB.
En caso de que el bit sea seteado a 1 , el transceptor es desactivado y las lineas C4 y C5 quedan para poder ser usadas como entradas digitales unicamente.
Por último tenemos los bits de configuración BIT 1-0 PPB1
PB0: que establecen la configuración del modo Ping - Pong.
La razón de esto , es porque hay muchos usuarios que son expertos manejando ASM pero no saben utilizar bien el lenguaje C o lenguajes de alto nivel. También otra razón es que quiero que todos entendamos de una manera más profunda el funcionamiento del módulo USB de la familia microchip...y luego de esto poder "tratar" de implementar la comunicación USB en cualquier microcontrolador...
El desarrollo de este hilo se hará de forma parecida al https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/ pero todos los desarrollos al igual que los diferentes programas de ejemplos se harán en ASM.
Para empezar a trabajar con el puerto USB del microcontrolador veremos todos los registros del micro asociados con este periférico , su funcionamiento y luego poco a poco comenzaremos a confeccionar los primeros programas.
Bueno para empezar veremos donde están hubicados los pines D- y D+ ( correspondientes a las señales de datos del puerto USB en el PIC18F2550 y en el PIC18F4550) , asi como también los otros pines que intervienen en su funcionamiento.

Breve descripción del funcionamiento del módulo USB:
La familia de dispositivos PIC18FX455/X550 contiene una interfaz serie compatible con el SIE (serial interface engine o máquina con comunicación serie en español) USB “full-speed” (2.0) y “de poca velocidad” (1.0) que permite la comunicación rápida entre cualquier dispositivo USB y el microcontrolador PIC®.
El SIE puede interconectarse directamente al USB, utilizando el transmisor - receptor interno, o puede conectarse a través un transmisor-receptor externo. El PIC tiene un regulador interno de 3,3V para alimentar el transmisor-receptor interno en aplicaciones de 5V.
Se han incluido algunas características especiales en el hardware para mejorar el funcionamiento. Se proporciona memoria de puerto dual en la memoria de datos del dispositivo (RAM del USB) para tener acceso directo a la memoria desde el núcleo del microcontrolador y desde el SIE. También se proporcionan unos buffer para que el programador elija libremente el uso de la memoria dentro del espacio de la RAM del USB. Existe un puerto paralelo para transmitir grandes cantidades de datos (SSP), para esto se ha proporcionado la ayuda de transferencia ininterrumpida de volúmenes de datos grandes, por ejemplo datos síncronos, a los buffer de memoria externos.
Bueno ahora veremos en detalle como se comunica la SIE con el exterior y las diferentes opciones a nivel conexionado del USB con el exterior:

Antes que nada veremos las notas a las referencias 2 y 3 que están dentro de la inmágen. Aclarar que estas notas son importantes para no cometer equivocaciones a la hora de programar el código que lo configura.
entonces:
Nota* 2:Las pull - ups externas son opcionales , pero si queremos usarlas hay que desactivar las propias resistencias de pull - up internas que tiene el microcontrolador. La activación o desactivación de estas resistencias se hace mediante el bit UPUEN...que se verá más adelante.
Nota* 3:El regulador de voltaje de 3.3v, nos provee de tensión al módulo USB en aplicaciones de 3.3v. En caso de tener una fuente externa de 3.3v conectada a Vusb, tenemos que desactivar el módulo interno del regulador.
Vemos en la inmágen los diferentes pines que según configuración de la SIE , podemos usar un transceptor externo, el fin de este tutorial no es el estudio de los módulos externos , por lo que se verá muy superficialmente.
Algo ¡ Muy importante ! que tenemos que ver es el puente bidireccional entre la SIE y el SSP...este puente nos va a permitir el transporte a alta velocidad de grandes flujos de datos en modo sincrono, por lo que se estudiará también en su momento.
Ver la siguiente inmágen en donde se muestra dicho puente:

Espero les sirva ...después sigo

Estado y control del módulo USB:
En total hay 22 registros para manejar las transacciones del USB. Los registros son:
• Registro de control del USB (UCON)
• Registro de configuración del USB (UCFG)
• Registro de estado de la transferencia del USB (USTAT)
• Registro de dirección de dispositivo USB (UADDR)
• Registros del número del frame (UFRMH: UFRML)
• Registros activadores de los Endpoints de 0 a 15 (UEPN)
El primer registro que estudiaremos será el UCON (registro de control del USB):
En la siguiente inmágen veremos como está constituido:

Este registro de control contiene los bits necesarios para determinar el comportamiento del bus durante las transferencias. El registro contiene los bits que gobiernan lo siguiente:
• Permiso del periférico principal del USB
• Reset de los punteros tipo ping-pong
• Control del modo al suspender
• Desactivar la transferencia de paquetes
El significado de los diferentes bits se muestra a continuación:
BIT7: Bit no implementado se lee como "0"
BIT6: El bit PPBRST, se encarga de controlar el estado del reset, cuando se utiliza el modo Doble - Buffering o modo Ping - Pong.Cuando se activa el bit PPBRST, todos los buffers Ping - Pong se fijan a los buffers intermedios. El bit PPBRST, tiene que borrarse por firmware.Este bit se ignora en los modos de buffer que no usen el buffer ping-pong.
BIT5: El bit SE0,se utiliza para indicar el estado del bus, si sólo se manda un cero.
Cuando se permite el módulo USB, este bit debe supervisarse para determinar si las líneas de datos han salido de una condición de single-ended cero (sólo se manda cero). Esto ayuda a distinguir el estado de ciclo inicial de la señal de reset del USB.
BIT4: El bit PKTDIS,es un flag que indica si el SIE ha inhabilitado la transmisión y la recepción de paquetes. Este lo bit activa el SIE cuando recibe un SETUP para permitir su procesamiento. Este bit no lo puede activar el microcontrolador, sólo borrar; al despejarlo el SIE continua la transmisión y/o recepción. Cualquier acontecimiento pendiente dentro del buffer intermedio todavía estará disponible, indicado dentro del registro USTAT en el buffer FIFO.
BIT3: El bit USBEN,la operación total del módulo USB se controla con este bit. Activar este bit setea el módulo y resetea todos los bits PPBI en el Buffer a ‘0’. Este bit también activa el regulador de tensión del chip y conecta las resistencias pull-up, si se permiten. Así, este bit puede utilizarse como una unión/separación al USB. Aunque se ignoran todos los estados y bits de control si este bit está borrado, el módulo necesita preconfigurarse antes de activar este bit.
BIT2: El bit RESUME,permite al periférico realizar un reinicio ejecutando la señal resume. Para generar un reinicio válido, por firmware se debe activar el RESUME durante 10ms y entonces borrar el bit.
BIT1: El bit SUSPND,coloca el módulo y soporte del circuito (es decir,regulador de tensión) en un modo de baja potencia. El reloj de entrada al SIE se desactiva. Este bit debe activarse por software dentro de la respuesta a una interrupción IDLEIF. Debe borrarse por firmware después de observar una interrupción ACTVIF. Cuando este bit está activo, sigue estando el dispositivo unido al bus pero las salidas del transmisor-receptor permanecen en reposo. La tensión en el pin VUSB puede variar dependiendo del valor de este bit. Activar este bit antes de un IDLEIF dará lugar a
comportamiento imprevisible del bus.
Nota:Cuando esté en el modo de suspensión, el bus del dispositivo USB se limita al 500μA de corriente. Ésta es la corriente completa cedida por el dispositivo PIC y su circuito de soporte. Hay que tener cuidado de ceder la corriente mínima cuando el dispositivo entre en el modo de suspensión.
BIT0: Bit no implementado se lee como "0"
Registro de configuración del USB:
Antes de comunicarse con el USB, se tiene que configurar el módulo del hardware interno y/o externo. La mayor parte de la configuración se realiza con el registro UCFG. El regulador de tensión del USB se maneja con la configuración de los registros.
El registro UFCG contiene la mayor parte de los bits que dirigen el comportamiento del módulo USB. Éstos incluyen:
• Velocidad del bus (“Alta velocidad” vs “Baja velocidad”)
• Permiso de las resistencias pull-up del chip
• Permiso del transmisor del chip
• Uso del buffer ping-pong
El registro UCFG también contiene dos bits que ayudan a probar el módulo, eliminando errores y certificaciones del USB. La salida de control de estos bits permite el monitor de estado y generación de patrones “de ojo”.

BIT 7: UTEYE: Bit de permiso del test patrón “de ojo” del USB.
1 = prueba del patrón “de ojo” permitido.
0 = prueba del patrón “de ojo” inhabilitado.
BIT 6: UOEMON: Bit de permiso del monitor OE del USB.
1 = señal del UOE* activa; indica los intervalos durante los cuales las líneas D+/D- están conduciendo.
0 = señales del UOE* inactivas.
BIT 4: UPUEN: Bit de permiso del pull-up del chip.
1 = Pull-up del chip permitido (pull-up en D+ con FSEN=1 o en D- con FSEN=0).
0 = Pull-up del chip desactivado.
BIT 3: UTRDIS: Bit inhabilitador del transmisor del chip
1 = Transmisor del chip inhabilitado; la interfaz digital del transmisor permitida.
0 = transmisor del chip activo.
BIT 2: FSEN: Bit de permiso del Full-Speed.
1 = dispositivo Full-speed: controla los flancos del transmisor; requiere un reloj de 48MHz.
0 = dispositivo de poca velocidad: controla los flancos del transmisor; requiere un reloj de 6MHz.
BIT 1-0 PPB1
11 = buffers ping-pong permitidos en los End-Points 1 a 15.
10 = buffers ping-pong permitidos en todos los End-Points.
01 = buffer ping-pong permitido en los End-Points de salida 0.
00 = buffers ping-pong inhabilitados.
Nota 1:
1: Si se activa UTRDIS, la señal UOE* estará activa independiente del ajuste del bit UOEMON.
2: Los bits UPUEN, UTRDIS y FSEN no deben cambiarse mientras el módulo USB esté permitido. Estos valores se deben preconfigurar antes de permitir el módulo.
3: Este bit solamente es válido cuando el transmisor del chip está activo (UTRDIS = 0); si no, se ignora.
Nota 2: La velocidad del USB, la transmisión y las pull-up deben configurase solamente durante la fase de activación del módulo. No se recomienda cambiar estos ajustes mientras que el módulo esté funcionando.
Viendo un poco el registro UCFG, en donde se encuentra el bit UTEYE, que es un bit de control de estado del USB que vigila los errores y es un generador de patrones.
Luego tenemos al bit UOEMON. Este bit nos muestra cuando las lineas D+ y D- están conduciendo y lo que estos valores representan según el siguiente cuadro:

Ahora tenemos 2 bit que trabajan de forma conjunta FSEN y UPUEN, según sea su configuración activarán o desactivarán las Resistencias Pull - Up internas del módulo USB o configuraran el módulo USB para trabajar a full - speed o slow - speed.
Veamos el circuito lógico que realiza estas acciones y una pequeña tabla donde se muestran las posibles configuraciones.

Luego tenemos UTRDIS, que habilita o deshabilita el transmisor del chip, en caso de que el bit sea 0 , activamos el transceptor y los pines C4 y C5 son usados para conectar el dispostivo USB.
En caso de que el bit sea seteado a 1 , el transceptor es desactivado y las lineas C4 y C5 quedan para poder ser usadas como entradas digitales unicamente.
Por último tenemos los bits de configuración BIT 1-0 PPB1
Última edición por un moderador: