Autor Tema: Conectividad CAN en PIC32  (Leído 10226 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Conectividad CAN en PIC32
« en: 25 de Marzo de 2011, 07:19:28 »
Tengo el encargo de desarrollar un proyecto basado en PIC32 que, entre otras funciones, debe operar con sus dos buses CAN.
Como dicen en mi tierra, "caballo grande, ande o no ande", así que voy a usar un PIC32MX795F512L cuyas principales características son:
  • 512KB de memoria de programa
  • 128KB de RAM
  • 8 canales DMA
  • USB on the Go
  • Ethernet
  • RTCC
  • 2 buses CAN2.0B con 1024 buffers
  • 6 UART

Pero tengo dos handicap importantes que superar:
- nunca he tocado un PIC32
- nunca he tocado un bus CAN

Ya he leído por completo el hilo del querido Marcos, Mis experiencias con el BUS CAN y resulta realmente clarificador. Lectura obligada y recomendada.

También he comprado el hardware que utilizaré para las pruebas:

Por supuesto, he instalado MPLAB C32 como herramienta de desarrollo, y CanKing como herramienta de diagnósticos.

Ahora me queda hincarle el diente a todo este material. Voy despacio porque tengo otros frentes que atender, pero iré poniendo aquí mis progresos. Por supuesto, toda aportación y ayuda será bienvenida y convenientemente agradecida.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Conectividad CAN en PIC32
« Respuesta #1 en: 25 de Marzo de 2011, 13:17:40 »
Bienvenido al mundo CAN, Manolo !!

Si puedes hacerlo, para ayudar mejor, seria bueno saber que debe poder hacer el PIC32 con sus dos buses CAN.
Me refiero a que no es lo mismo recibir un mensaje en un puerto y reenviarlo por el otro (una especie de Gateway), o tener que procesar cada trama recibida en ambos puertos y sacarlas por ethernet, por ejemplo.

Buena suerte y aqui estaremos para ayudar con lo poco que conocemos, ya que seguramente saldremos fortalecidos de este proyecto. :-/ :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Conectividad CAN en PIC32
« Respuesta #2 en: 25 de Marzo de 2011, 13:21:39 »
Pues mi labor termina diseñando una librería que permita utilizarlo, desarrollando una herramienta que será de propósito general. Será cosa de mi cliente utilizarlo de una manera o de otra.
De todas formas, entiendo que si consigo hacer funciones de inicialización, lectura y escritura en el bus, lo demás será sencillo. Por cierto, persigo conseguir que la lectura se haga por interrupción; todos los ejemplos que he visto hasta ahora lo hacen por polling.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Conectividad CAN en PIC32
« Respuesta #3 en: 25 de Marzo de 2011, 13:49:23 »
Entiendo.
Para ayudarte mas prometo cambiar algunos de mis proyectos a lectura por interrupcion, en CCS por supuesto, pero lo mas ANSI C que consiga hacerlo, asi puedes portarlo con los minimos cambios.
De paso aprendo a hacerlo yo tambien, no?? :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Conectividad CAN en PIC32
« Respuesta #4 en: 13 de Julio de 2011, 12:33:33 »
Por prioridades laborales he tenido mucho tiempo abandonado el proyecto y esta mañana he vuelto a retomarlo.
Tras una dura pelea he conseguido ver vivo por primera vez a mi bus CAN.
Es poca cosa, pero me ha emocionado bastante verlo latir.

Tengo conectados dos de los pines CAN de un PIC32 a un módulo MCP2551. Este driver está conectado a un bus CAN, en cuyo otro extremo hay un monitor de tramas (MCP2515 CAN Bus Monitor Demo Board).
He cargado el ejemplo PIC32 CAN TX RX Code Example y tras probar distintas configuraciones hasta dar con la correcta he visto las tramas en el monitor. De hecho, en ese ejemplo se enciende o apaga un led según se le envíe un 1 o un 0 a determinado ID, y también he probado esto con éxito.

Ahora que ya está vivo, voy a intentar ir complicando poco a poco la cosa.

Seguiré informando

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Conectividad CAN en PIC32
« Respuesta #5 en: 13 de Julio de 2011, 15:14:23 »
Bien Manolo !!

Ya estaba por preguntarte si avanzaste algo o no.

Me alegro mucho que parpadees tu primer led a través del bus, parecerá poco pero yo se que no es asi, je..je.. :D :D

Seguramente habrás utilizado la velocidad de 125 Kpbs, que es el standard de los ejemplos de Microchip.
Cuando pruebas y antes de avanzar, intenta probar el mismo ejemplo con las demás velocidades, eso te hará tomar firmeza en los conceptos.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Conectividad CAN en PIC32
« Respuesta #6 en: 13 de Julio de 2011, 15:17:51 »
Efectivamente, acertaste, estoy usando 125Kbps.

Probaré otras velocidades, pero antes quiero conseguir que funcione con ID extendido, que todavía no lo hace.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Conectividad CAN en PIC32
« Respuesta #7 en: 13 de Julio de 2011, 16:15:20 »
Por cierto, Marcos, el ejemplo que estoy usando tiene un montón de funciones de alto nivel que no encuentro explicadas en ningún documento de Microchip. ¿Es posible que tú tengas algún doc donde vengas explicadas?


Código: C
  1. CANEnableModule(CAN1,TRUE);
  2.  
  3.         CANSetOperatingMode(CAN1, CAN_CONFIGURATION);
  4.         while(CANGetOperatingMode(CAN1) != CAN_CONFIGURATION);                 
  5.  
  6.         /* Step 2: Configure the CAN Module Clock. The
  7.          * CAN_BIT_CONFIG data structure is used
  8.          * for this purpose. The propagation segment,
  9.          * phase segment 1 and phase segment 2
  10.          * are configured to have 3TQ. The
  11.      * CANSetSpeed function sets the baud.*/
  12.        
  13.         canBitConfig.phaseSeg2Tq            = CAN_BIT_3TQ;
  14.         canBitConfig.phaseSeg1Tq            = CAN_BIT_3TQ;
  15.         canBitConfig.propagationSegTq       = CAN_BIT_3TQ;
  16.         canBitConfig.phaseSeg2TimeSelect    = TRUE;
  17.         canBitConfig.sample3Time            = TRUE;
  18.     canBitConfig.syncJumpWidth          = CAN_BIT_2TQ;
  19.  
  20.     CANSetSpeed(CAN1,&canBitConfig,SYSTEM_FREQ,CAN_BUS_SPEED);
  21.  
  22.         /* Step 3: Assign the buffer area to the
  23.      * CAN module.
  24.      */
  25.  
  26.         CANAssignMemoryBuffer(CAN1,CAN1MessageFifoArea,(2 * 8 * 16));  
  27.  
  28.         /* Step 4: Configure channel 0 for TX and size of
  29.      * 8 message buffers with RTR disabled and low medium
  30.      * priority. Configure channel 1 for RX and size
  31.      * of 8 message buffers and receive the full message.
  32.      */
  33.  
  34.     CANConfigureChannelForTx(CAN1, CAN_CHANNEL0, 8, CAN_TX_RTR_DISABLED, CAN_LOW_MEDIUM_PRIORITY);
  35.     CANConfigureChannelForRx(CAN1, CAN_CHANNEL1, 8, CAN_RX_FULL_RECEIVE);
  36.        
  37.         /* Step 5: Configure filters and mask. Configure
  38.      * filter 0 to accept SID messages with ID 0x201.
  39.      * Configure filter mask 0 to compare all the ID
  40.      * bits and to filter by the ID type specified in
  41.      * the filter configuration. Messages accepted by
  42.      * filter 0 should be stored in channel 1. */
  43.  
  44.     CANConfigureFilter      (CAN1, CAN_FILTER0, IDCAN1/*0x201*/, CAN_SID);    
  45.     CANConfigureFilterMask  (CAN1, CAN_FILTER_MASK0, 0x7FF, CAN_SID, CAN_FILTER_MASK_IDE_TYPE);
  46.     CANLinkFilterToChannel  (CAN1, CAN_FILTER0, CAN_FILTER_MASK0, CAN_CHANNEL1);
  47.     CANEnableFilter         (CAN1, CAN_FILTER0, TRUE);
  48.        
  49.         /* Step 6: Enable interrupt and events. Enable the receive
  50.      * channel not empty event (channel event) and the receive
  51.      * channel event (module event).
  52.      * The interrrupt peripheral library is used to enable
  53.      * the CAN interrupt to the CPU. */
  54.  
  55.     CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);
  56.     CANEnableModuleEvent (CAN1, CAN_RX_EVENT, TRUE);
  57.  
  58.     /* These functions are from interrupt peripheral
  59.      * library. */
  60.    
  61.     INTSetVectorPriority(INT_CAN_1_VECTOR, INT_PRIORITY_LEVEL_4);
  62.     INTSetVectorSubPriority(INT_CAN_1_VECTOR, INT_SUB_PRIORITY_LEVEL_0);
  63.     INTEnable(INT_CAN1, INT_ENABLED);
  64.  
  65.         /* Step 7: Switch the CAN mode
  66.          * to normal mode. */
  67.  
  68.         CANSetOperatingMode(CAN1, CAN_NORMAL_OPERATION);
  69.         while(CANGetOperatingMode(CAN1) != CAN_NORMAL_OPERATION);

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Conectividad CAN en PIC32
« Respuesta #8 en: 13 de Julio de 2011, 18:40:40 »
Podrás pasarme el código completo??
No veo la parte de configuración que indique si usa modo estándar o extendido, aunque por el tamaño del ID que usa en el filtro parece estándar, me gustaría observarlo mas.

Que vuelteros que son para programar los de Mchip!!
Estoy seguro que cada función son 30 o 40 lineas... :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Conectividad CAN en PIC32
« Respuesta #9 en: 14 de Julio de 2011, 00:17:28 »
Aquí está el código del ejemplo que estoy probando.


Ya conseguí que un módulo envíe un ID extendido; lo que aún no tengo resuelto es la recepción.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Conectividad CAN en PIC32
« Respuesta #10 en: 14 de Julio de 2011, 01:07:06 »
Bien, encontré un ejemplo que utiliza Extended ID tanto para enviar como para recibir. Lo he probado y funciona estupendamente.
Está aquí disponible para descargar.

Ahora me pondré a pelear con distintas velocidades.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Conectividad CAN en PIC32
« Respuesta #11 en: 14 de Julio de 2011, 08:16:06 »
Sigo sin ver la diferencia, no encuentro la diferencia entre trama estándar y extendida.

Por cierto, si usas modo extendido, puedes leer tramas estándar de otro envío, pero al revés no funciona.

Si me dices que PIC32 utilizas bajo la hoja de datos así leo bien como es la configuración de estos módulos Can.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Conectividad CAN en PIC32
« Respuesta #12 en: 14 de Julio de 2011, 11:57:17 »
Yo sí la vi, o al menos eso creo.

Así se inicia el módulo para recibir tramas usando Extended ID:
Código: C
  1. CANConfigureFilter      (CAN1, CAN_FILTER0, 0x8004001, CAN_EID);    
  2.     CANConfigureFilterMask  (CAN1, CAN_FILTER_MASK0, 0x3FFFFFFF, CAN_EID, CAN_FILTER_MASK_IDE_TYPE);
  3.     CANLinkFilterToChannel  (CAN1, CAN_FILTER0, CAN_FILTER_MASK0, CAN_CHANNEL1);
  4.     CANEnableFilter         (CAN1, CAN_FILTER0, TRUE);

mientras que se inicia de esta otra manera si no vas a usar Extended ID:
Código: C
  1. CANConfigureFilter      (CAN1, CAN_FILTER0, 0x201, CAN_SID);    
  2.     CANConfigureFilterMask  (CAN1, CAN_FILTER_MASK0, 0x7FF, CAN_SID, CAN_FILTER_MASK_IDE_TYPE);
  3.     CANLinkFilterToChannel  (CAN1, CAN_FILTER0, CAN_FILTER_MASK0, CAN_CHANNEL1);
  4.     CANEnableFilter         (CAN1, CAN_FILTER0, TRUE);


Luego, para transmitir usando Extended ID:

Código: C
  1. message->messageWord[0] = 0;
  2.         message->messageWord[1] = 0;
  3.         message->messageWord[2] = 0;
  4.         message->messageWord[3] = 0;
  5.  
  6.         message->msgSID.SID     = 0x200;                /* Send message to CAN2.                                */
  7.         message->msgEID.EID     = 0x4002;               /* Send message to CAN2.                                */
  8.         message->msgEID.IDE     = 1;                    /* IDE = 1 means Extended ID message.   */
  9.         message->msgEID.RTR     = 0;                    /* Not an RTR message.                  */
  10.         message->msgEID.DLC     = 1;                    /* Send one byte of data.                               */
  11.         message->data[0]        = LED5Status;   /* This is the payload.                                 */


y para transmitir normal:
Código: C
  1. message->messageWord[0] = 0;
  2.         message->messageWord[1] = 0;
  3.         message->messageWord[2] = 0;
  4.         message->messageWord[3] = 0;
  5.  
  6.         message->msgSID.SID    = 0x202;      
  7.         message->msgEID.IDE    = 0;        
  8.         message->msgEID.DLC    = 1;        
  9.         message->data[0]        = LED5Status;


El PIC que estoy usando es un PIC32MX795F512L

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Conectividad CAN en PIC32
« Respuesta #13 en: 14 de Julio de 2011, 12:07:56 »
Puede ser, yo buscaba en otro lado...
Voy a ver la hoja de datos...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Conectividad CAN en PIC32
« Respuesta #14 en: 16 de Noviembre de 2011, 16:16:52 »
esto tiene tiempo, pero lo conseguiste al final??

Hay varias configuraciones para CAN, que lea solo standard, o que lea ambos, ahora los filtros los configuras de tal forma que el mensaje extendido que te interese lo aceptas, y el standard que te interesa igual. Yo nunca he usado extendido, porque con el standard tienes hasta 2048 mensajes, y superar eso dificil xD

Mirate la configuracion para ponerlo como dual (ext y std).


 

anything