Qué es CAN y cómo funciona el módulo del - Server Die

Qué es CAN y cómo funciona el
módulo del microcontrolador
dsPIC30F4013
Grupos 03-04
Relación de alumnos que han participado:
Alepuz Soriano, Héctor Nazario
Giménez Espinosa de los Monteros, Héctor
Jordá Fernández, Jorge Manuel
Ripoll Gisbert, Felipe
Saval Sendra, Pablo Miguel
Serrano Reche, Juan
Talens Noguera, Juan Vicente
1
Índice
1. INTRODUCCIÓN
1.1. Motivación histórica .................................................. pag. 4
1.2. Características básicas del bus CAN ....................... pag. 7
1.3. Competencia y futuro ............................................. pag. 10
1.4. Campos de aplicación .............................................. pag. 13
1.5. Ejemplo de aplicación práctica: Domótica ................ pag. 14
2. TRANSMISIÓN DE DATOS
2.1. Arquitectura de capas
2.1.1. Capa física................................................. pag.
2.1.2. Capa de enlace de datos ........................... pag.
2.2. Estructura de un nodo CAN.................................... pag.
2.3. Formato de codificación y sincronización de datos...pag.
2.4. Tramas
2.4.1. Tipos de tramas ......................................... pag.
2.4.2. Trama de datos ......................................... pag.
2.4.3. Trama remota ............................................ pag.
2.4.4. Trama de error........................................... pag.
2.4.5. Trama de sobrecarga ................................ pag.
2.4.6. Espacio entre tramas................................. pag.
2.5. Acceso múltiple y abitraje de acceso al bus ........... pag.
2.6. Detección de errores
2.6.1. Detección de errores ................................. pag.
2.6.2. Aislamiento de nodos defectuosos ............ pag.
2.7. Especificaciones..................................................... pag.
2.8. Implementaciones .................................................. pag.
18
21
22
23
24
25
27
28
30
30
31
33
34
35
35
3. CAN DEL MICRO dsPIC30F4013
3.1. Características básicas ........................................... pag.
3.2. Transceptor (transceiver) ........................................ pag.
3.3. Modos de funcionamiento ....................................... pag.
3.4. Recepción de mensajes .......................................... pag.
3.5. Transmisión de mensajes........................................ pag.
3.6. Temporización y sincronización de bits
3.6.1. Temporización de bits................................ pag.
3.6.2. Sincronización de bits................................ pag.
3.6.3. Parámetros del tiempo de bit nominal ....... pag.
3.7. Programación
3.7.1. MPLAB ...................................................... pag.
3.7.2. Funciones .................................................. pag.
3.7.3. Ejemplo de aplicación de código ............... pag.
39
41
43
46
48
51
52
53
55
56
69
4. ANEXO: Dispositivos CAN ....................................................... pag. 72
5. BIBLIOGRAFÍA......................................................................... pag. 80
2
1. INTRODUCCIÓN
3
1.1. Motivación histórica
El sistema de bus serie CAN, siglas cuyo significado en castellano es “Control
de Área de Red”, nació en febrero de 1986, cuando el grupo “Robert Bosch
GmbH” (más conocido como “Bosch” a secas) lo presentó en el congreso de la
“Sociedad de Ingeniería de la Automoción”. Desde entonces, CAN se ha
convertido en uno de los protocolos líderes en la utilización del bus serie.
Razones
A comienzos de los 80, los ingenieros de Bosch evaluaron el posible uso de los
sistemas de bus serie existentes en los coches de pasajeros, pero ninguno de
los protocolos de red disponibles satisfacían los requisitos de estos.
El ingeniero Uwe Kiencke fue quien inició el desarrollo del
nuevo sistema en 1983.
Este protocolo de bus serie se ideó principalmente para aportar mayor
funcionalidad, seguridad y fiabilidad, junto a una mayor eficiencia en el gasto
del combustible, ya que la reducción del peso y la complejidad de los
automóviles a través de la reducción del cableado iban a favorecer este hecho.
Ingenieros de “Mercedes-Benz” pronto se involucraron en las primeras fases de
creación del nuevo sistema, y pronto lo hizo también “Intel” como potencial
vendedor de semiconductores. El profesor Wolfhard Lawrenz de la universidad
de ciencias aplicadas de Brunswick-Wolfenbüttel, Alemania, fue quién dio al
nuevo protocolo de red el nombre de “Controller Area Network” (CAN).
A mediados de 1987, “Intel” presentó el primer chip de controlador CAN: el
82526. Poco tiempo después, “Semiconductores Philips” presentaría el
82C200. Estos dos antepasados primigenios de los controladores CAN
actuales eran completamente distintos en cuanto a filtros de aceptación y
control de mensajes:
Intel adoptó el concepto de FullCAN; este requería menos carga de la CPU del
microcontrolador que la implementación BasicCAN elegida por Philips. Pero por
otra parte, el dispositivo de FullCAN era limitado con respecto al número de los
mensajes que podían ser recibidos. Además, el controlador de BasicCAN
requería menos silicio, lo que abarataba aun más su coste. Actualmente, los
términos ‘BasicCAN’ y ‘FullCAN’ han quedado obsoletos.
4
Estandardización
La especificación CAN (versión 2.0) de “Bosch” fue sometida a la
estandardización internacional a comienzos de los 90.
Concretamente en Noviembre de 1993, después de diversos
conflictos políticos, se publicó el estándar ISO 11898, que definía
además una capa física para velocidades de hasta 1 Mbit/s.
Paralelamente, un formato de CAN ‘tolerante a fallos’ se incluyó en la ISO
11519-2. En 1995, el estándar se amplió con la descripción del identificador
CAN de 29 bits.
Desafortunadamente, todas las especificaciones y estandarizaciones
publicadas acerca de CAN contenían errores o estaban incompletas. Para
evitar incompatibilidades, “Bosch” se cercioró, y sigue haciéndolo, de que todos
los micros CAN cumplen con el modelo de referencia que ellos definieron.
De todas formas, las especificaciones CAN han sido revisadas y
estandarizadas con el tiempo en diferentes secciones: la norma ISO 11898-1
describe la 'capa de transmisión de datos CAN'; la ISO 11898-2 la ‘capa física
CAN no tolerante a fallos'; y la ISO 11898-3 la ‘capa física CAN tolerante a
fallos’. Los estándares de ISO 11992 (referente a la interfaz para camiones y
remolques) e ISO 11783 (referente a la maquinaria agrícola y forestal) definen
los perfiles del uso de CAN basados en el US-protocol J1939.
Pioneros
A pesar de que CAN surgió con la idea de ser utilizado en coches de pasajeros,
un gran número de las primeras aplicaciones llegarían desde otros segmentos
de mercado distintos:
Entre otros, el fabricante finlandés de ascensores “Kone”, fue uno de los
primeros en aprovecharse de sus ventajas.
La oficina de ingeniería Suiza “Kyaser” lo introdujo a los fabricantes de
maquinaria textil del país, que acabaron fundando el ‘Grupo de usuarios textiles
CAN’, bajo el liderazgo de ‘Lars-Berno Frediksson’.
En Holanda, “Sistemas médicos Philips” lo utilizó para las redes internas de sus
máquinas de Rayos X. La ‘especificación para mensajes de Philips’ (PMS),
desarrollada principalmente por Tom Suters, representó la primera capa de
aplicación para redes CAN.
También se sucedieron todo tipo de propuestas académicas, como por
ejemplo, la creación a finales de los 80 de un sistema de bus basado en CAN,
para vehículos agrícolas (LBS).
5
Ya en 1992, Mercedes-Benz implantó CAN en sus automóviles de clase alta. Y
aunque en un principio el bus se limitaba a interconectar las unidades de
control electrónico que cuidaban del control del motor, pronto conectarían
además las unidades de control necesarias para los componentes electrónicos.
Para ello, se implementaron dos sistemas de bus CAN separados físicamente,
y conectados a través de ‘gateways’. Actualmente, muchos otros fabricantes de
coches como ”BMW”, “Renault”, “Fiat”, “Saab”, “Volkswagen” o “Volvo”, han
seguido su ejemplo y suelen implementar dos redes CAN en sus coches.
En Marzo de ese mismo año, usuarios internacionales y
grupos de fabricantes fundaron oficialmente la organización
'CAN en la Automoción’ (CiA).
La primera publicación técnica, que trataba acerca de la capa física, fue emitida
solo unas semanas después: ‘CiA’ recomendaba utilizar solamente
transceptores CAN que cumplieran la normativa ISO 11898. A día de hoy, son
los transceptores RS485 los utilizados más comúnmente.
Otra de las primeras tareas de la CiA fue la especificación de la ‘capa de
aplicación CAN’ (CAL), que se desarrolló a partir del material existente de los
“Sistemas médicos de Philips” y de “STZP”.
Capas de aplicación
Desde 1993, dentro del alcance del proyecto ‘ASPIC’, un consorcio europeo
liderado por “BOSCH”, desarrolló un prototipo conocido como CANopen para
las redes internas de las celdas de producción. En 1995, se publicó el perfil
totalmente revisado de las comunicaciones de CANopen, que en el plazo de
cinco años ya se había convertido en la red integrada estandarizada más
importante de Europa, puesto que ofrecía una gran flexibilidad y un gran
número de opciones de configuración, así como diversos perfiles de dispositivo,
interfaz y uso.
Actualmente, CANopen se sigue utilizando especialmente en Europa:
máquinas de moldeado por inyección en Italia, máquinas expendedoras en
Inglaterra, grúas en Francia, control de maquinaria en Austria, o maquinaria de
fabricación de relojes en Suiza... Mientras que en Estados Unidos CANopen se
abre camino en el ámbito de los toros mecánicos y las máquinas clasificadoras.
Poco después de aquello, a comienzos de 1994, “Allen-Bradley” desarrolló la
tecnología DeviceNet, enfocada esencialmente a la automatización de las
fábricas. Pronto ganaría adeptos en Estados Unidos debido sobretodo a su
funcionamiento “plug & play” (enchufar y listo).
6
Pero no fueron las únicas. Desde el momento de la creación de CAL, se fue
sucediendo la creación de diferentes estándares que definían la capa de
aplicación; algunos son muy específicos y están relacionados casi
exclusivamente con sus campos de aplicación. Dejando de lado las 3
mencionadas anteriormente, entre los protocolos de alto nivel y las capas de
aplicación más utilizadas cabe mencionar: SDS, OSEK y CANKingdom.
Por una parte, SDS (Smart Distributed System), fue creado por Honeywell
durante la gestación de DeviceNet, y de hecho era muy similar a este, así que
no entraremos en detalle. OSEK, que estaba basado además en TCP/IP y
algoritmos DSP, rápidamente enfocaría su aplicación a una gran cantidad de
usos en los turismos. Mientras que CANKingdom se enfocó a aplicaciones con
una necesidad alta de aplicaciones en tiempo real, como pueda ser por ejemplo
la electrónica marítima.
Ya por último, en el año 2000, ISO formó un grupo de trabajo que agrupaba
empleados de “Bosch”, académicos y expertos de la industria de los
semiconductores, que definió un nuevo protocolo basado en CAN, el llamado
TTCAN (Time-tiggered communication on CAN). Esta extensión permitía tanto
la transmisión de mensajes simultáneos, como la implementación de un bucle
cerrado para el control del bus. Y gracias a que el protocolo del bus no fue
modificado, este tipo de mensajes podían seguir siendo enviados con el mismo
sistema físico de bus.
7
1.2. Características básicas del bus CAN
•
Económico y sencillo: Dos de las razones que motivaron su desarrollo
fueron precisamente la necesidad de economizar el coste monetario y el
de minimizar la complejidad del cableado, por parte del sector
automovilístico.
•
Estandarizado: Se trata de un estándar definido en las normas ISO
(Internacional Organization for Standardization), concretamente la ISO
11898, que se divide a su vez en varias partes, cada una de las cuales
aborda diferentes aspectos de CAN.
•
Medio de transmisión adaptable: El cableado, como ya hemos dicho, es
muy reducido a comparación de otros sistemas. Además, a pesar de que
por diversas razones el estándar de hardware de transmisión sea un par
trenzado de cables, el sistema de bus CAN también es capaz de trabajar
con un solo cable. Esta particularidad es empleada en diversos tipos de
enlaces, como los enlaces ópticos o los enlaces de radio.
•
Estructura definida: La información que circula entre las unidades a
través de los dos cables (bus) son paquetes de bits (0’s y 1’s) con una
longitud limitada y con una estructura definida de campos que
conforman el mensaje.
•
Programación sencilla.
•
Número de nodos: Es posible conectar hasta 110 dispositivos en una
sola red CAN.
•
Garantía de tiempos de latencia: CAN aporta la seguridad de que se
transmitirá cierta cantidad de datos en un tiempo concreto, es decir, que
la latencia de extremo a extremo no excederá un nivel específico de
tiempo. Además, la transmisión siempre será en tiempo real.
•
Optimización del ancho de banda: Los métodos utilizados para distribuir
los mensajes en la red, como el envío de estos según su prioridad,
contribuyen a un mejor empleo del ancho de banda disponible.
•
Desconexión autónoma de nodos defectuosos: Si un nodo de red cae,
sea cual sea la causa, la red puede seguir funcionado, ya que es capaz
de desconectarlo o aislarlo del resto. De forma contraria, también se
pueden añadir nodos al bus sin afectar al resto del sistema, y sin
necesidad de reprogramación.
•
Velocidad flexible: ISO define dos tipos de redes CAN: una red de alta
velocidad (de hasta 1 Mbps) definida por la ISO 11898-2, y una red de
baja velocidad tolerante a fallos (menor o igual a 125 Kbps) definida por
la ISO 11898-3.
8
•
Relación velocidad-distancia: Al punto anterior habría que añadir que la
velocidad también depende de la distancia hasta un máximo de 1000
metros (aunque podemos aumentar la distancia con bridges o
repetidores), como podemos corroborar en la siguiente tabla
comparativa:
Velocidad
(Kbps)
1000
800
500
250
125
50
20
10
Tiempo de bit
(µS)
1
1.25
2
4
8
20
50
100
Longitud máxima de bus
(m)
30
50
100
250
500
1000
2500
5000
Además podemos hablar de otras características técnicas en las que
profundizaremos más adelante:
•
Orientado a mensajes: Se trata de un protocolo orientado a mensajes, y
no a direcciones, es decir, la información que se va a intercambiar se
descompone en mensajes, a los cuales se les asigna un identificador y
son encapsulados en tramas para su transmisión. Cada mensaje tiene
un identificador único dentro de la red, a partir del cual los nodos
deciden aceptar o no dicho mensaje. Además están priorizados.
•
Multidifusión (multicast): Permite que todos los nodos puedan acceder al
bus de forma simultánea con sincronización de tiempos.
•
Medio compartido (broadcasting): La información es enviada en la red a
todos los destinos de forma simultánea. Así que los destinos habrán de
saber si la información les concierne o deben rechazarla.
•
Detección y señalización de errores: CAN posee una gran capacidad de
detección de errores, tanto temporales, como permanentes, lograda a
través de cinco mecanismos de detección, 3 al nivel de mensaje y 2 a
nivel de bit. Los errores además pueden ser señalizados.
•
Retransmisión automática de tramas erróneas: Junto a la detección y
señalización de errores la retransmisión automática de tramas erróneas
aporta la integridad de los datos. Además ambos procesos son
transparentes al usuario.
•
Jerarquía multimaestro: CAN es un sistema multimaestro en el cual
puede haber más de un maestro (o master) al mismo tiempo y sobre la
misma red, es decir, todos los nodos son capaces de transmitir, hecho
que permite construir sistemas inteligentes y redundantes.
9
1.3. Competencia y futuro
Realmente CAN se encuentra en una posición privilegiada en el mercado.
El siguiente gráfico traza una comparativa entre diferentes tecnologías respecto
al coste por nodo.
Vemos que J1850, pero sobretodo LIN, que tiene una mayor presencia en la
industria, son opciones más económicas, ¿pero hasta qué punto son estas
tecnologías competidoras de CAN?
En la siguiente tabla, se exponen las diferentes características de LIN y CAN (y
de cómo extra el I2C de “Philips”), para detallar la similitud entre ellas:
CAN
Compañía que lo desarrolló
Bosh
1Mb/s
Velocidad
Tamaño de datos
Prioridad de mensajes
Garantía de latencia
Flexibilidad en la configuración
Sistema Multimaestro
Detección y señalización de
errores
Retransmisión de tramas
LIN
Open source
20 Kb/s
I2C
64bits
Si
Si
Si
Si
Si
8bits
No
***
***
No
Si
Philips
0.1Mb/s /
0.4Mb/s
8bits
No
No
Si
Si
Si
automática
No
programable
Se puede llegar a la conclusión fácilmente, de que cada una va a ser útil en un
ámbito de manufactura distinto, ya que sus características son distintas.
La diferencia principal, además de la económica, va a resultar ser la velocidad.
10
Dentro de la industria automovilística por ejemplo, CAN es empleado como bus
de comunicaciones para los elementos más importantes de este, que van a
requerir una seguridad y velocidad mayores. Para otro tipo de visicitudes, como
los elevalunas eléctricos por ejemplo, que tienen mucha menos importancia
que la que puedan tener los frenos o el estado del motor, se emplea el bus LIN.
Uso general del bus CAN en los coches:
Uso general del bus LIN en los coches:
En definitiva, más que competir, lo que hacen es repartirse el pastel, ya que al
tener diferentes características, el fabricante va a poder adaptarse en todo
momento de la mejor forma a las exigencias del mercado, eligiendo uno u otro
para cada necesidad.
11
Ya que otro grupo de la clase ha optado por hacer un trabajo acerca de
Ethernet, vamos a nombrar algunas de las diferencias más importantes que
hay entre estos, aunque no sean competidores directos:
CAN – Ethernet
Aun cuando las similitudes entre CAN y Ethernet son obvias, CAN posee algún
beneficio clave cuando se compara con el protocolo Ethernet. El esquema de
arbitraje que usa el protocolo CAN es de bit inteligente no destructivo. Esto
significa que se comparan los mensajes con cada bit en un momento
determinado, pero el mensaje con la prioridad más alta no se destruye y se
retransmite; sólo el mensaje que no gana el arbitraje de bus se detiene y se
retransmite. Éste es un punto importante que ayuda a minimizar el tiempo de
fuera de servicio del bus y aumentan al máximo uso eficaz del ancho de banda
disponible.
Otra ventaja importante del arbitraje del bit inteligente no destructivo, que usa
CAN, es el hecho que esto da al bus características muy predecibles. Con
Ethernet, ambos transmisores se detienen cuando se detecta una colisión y
una cantidad de tiempo aleatorio se permite pasar antes de que ambos
prueben de la retransmisión. Con este elemento aleatorio de tiempo eliminado
de la función del bus, es posible lograr casi el 100% de eficacia en términos de
utilización del ancho de banda.
Futuro
A día de hoy, el futuro de CAN se prevé esperanzador, ya que incluso las
estimaciones más conservadoras coinciden en que la presencia de CAN en el
mercado y en diversos campos de la industria, va a seguir en aumento durante
los próximos diez o quince años.
12
1.4. Campos de aplicación
El 80% de las aplicaciones modernas del bus CAN se pueden encontrar en la
ingeniería del automóvil y otro tipo de vehículos como autobuses, trenes y
aviones. En el caso de los automóviles por ejemplo, CAN es el encargado de la
comunicación y automatización del sistema de freno, los faros, el ABS, o el
ordenador de abordo, del cual vemos su esquema en el siguiente gráfico:
Sin embargo, también se puede encontrar el bus CAN en aplicaciones de
diversa índole debido a su naturaleza, que le aporta robustez, economía y un
altísimo grado de seguridad y fiabilidad; entre las más comunes:
Control y automatización industrial:
- Redes entre diversas máquinas y elementos de las mismas.
- Redes de supervisión.
- Redes de seguridad.
Control y automatización de edificios:
- Control de ascensores, puertas mecánicas, aspersores y diversos
elementos mecánicos.
- Control de iluminación.
Aplicaciones específicas:
- Control de máquinas expendedoras (en Inglaterra está muy
extendido su uso).
- Control de equipamiento médico.
- Control de sistemas automáticos de almacenaje.
- Control de electrodomésticos.
13
1.5. Ejemplo de aplicación práctica: Domótica
La línea que vamos a tratar, permite una gran versatilidad de interconexionado
de los módulos que la componen, ya que la topología en la que se basa el
sistema de instalación es en modo árbol. Esta característica facilita las posibles
ampliaciones del sistema y en consecuencia reduce el coste de instalación
porque el cableado y el tiempo necesario para la instalación, es menor que en
las instalaciones convencionales.
Se trata de un sistema modular distribuido. Modular, porque el sistema consta
de distintos módulos que permiten una fácil instalación y configuración.
Distribuido, porque cada Controlador Inteligente (CI) es capaz de tomar sus
propias decisiones y actuar en consecuencia, es decir, no existe una única
unidad central; además la pérdida de comunicación entre módulos no impide el
desarrollo de las decisiones locales.
La instalación consta como mínimo de un controlador inteligente. Este CI
controla los distintos elementos que se conectan directamente a él (como
sondas de temperatura, lectores de llaves, etc...) y es el encargado de
gestionar el bus principal (bus CAN) que es el bus que utilizan los distintos CI
para comunicarse entre sí (comunicación principal). También se encarga de
controlar al bus local (bus I2C4H) transmitiendo las órdenes procedentes de
otros CI a los distintos módulos de ampliación que se le pueden conectar y de
reenviar la información captada por estos módulos al resto de CI si procede
(comunicación local).
CI
Dimensiones:
4 módulos DIN
Frontal:
LED de estatus de alimentación
7 LED's de reconocimiento de nodo
de expansión Botón de RESET
Entradas / Salidas:
1 entrada de bus CAN
1 entrada para 5 sondas de
temperatura
1 entrada para 2 receptores IR
1 salida para 4 emisores de IR
1 salida de bus IEE para nodos de
expansión
Comunicaciones externas:
Puerto RS-232
14
La comunicación principal basada en CAN, aprovecha todas las características
de este ya explicadas a lo largo del trabajo: comunicación tipo "broadcast",
donde todos los CI están escuchando y si el mensaje les afecta toman la
decisión de actuar o no, por lo que no hay posibilidad de colisión; la cabecera
de los mensajes está compuesta por un nivel de prioridad de tal forma que es
el mensaje de menor prioridad el que cede el bus al mensaje de mayor
prioridad.
El bus local I2C4H actúa de forma parecida con la diferencia de que si que
existe una dirección de remitente y de destino en los mensajes, también el flujo
de información es menor a nivel local y el CI gestiona este tráfico.
Por otra parte, encontramos el derivador, elemento que hace de ladrón entre
los distintos CI, y que incorpora la alimentación al bus principal y permite la
activación de la resistencia final de línea en cada una de las terminaciones.
Derivador
Dimensiones:
2 módulos DIN
Lateral:
Interruptor final de bus
Entradas / Salidas:
3 conectores bus CAN, configurable
según topología
1 entrada alimentación 24 VCD
1 entrada para línea de teléfono
1 entada aux.
1 salida de bus IEE para nodos de
expansión
Comunicaciones externas:
No
Vamos a ver algunos ejemplos de montaje:
Este es un ejemplo típico de vivienda con un único CI y dos ampliaciones, una
para ocho entradas y ocho salidas en modo encendido y apagado y una
segunda ampliación para el control de cuatro zonas reguladas.
15
En este otro ejemplo de topología podemos ver una instalación típica para un
adosado con tres CI, uno por planta de la vivienda, uno de los cuales (el
primero de ellos) se encontraría al límite de su capacidad; podría ser el que se
encontrara en la primera planta del adosado, por ser esta planta la que
mayores controles requiere.
Para una mejor compresión en este ejemplo solo se han representado los CI y
no sus respectivos módulos de ampliación. Este sería un ejemplo de aplicación
en un edificio de oficinas, residencia o en un hotel, donde tenemos distintas
plantas que controlar. En función de la totalidad de elementos que vamos a
controlar dispondremos de una mayor o menor cantidad de CI por planta.
16
2. TRANSMISIÓN
DE DATOS
17
2.1. Arquitectura de capas
Las implementaciones hardware de CAN cubren de forma estandarizada las
capas físicas y de enlace del modelo de comunicaciones OSI (Open Systems
Interconection), mientras diversas soluciones de software no estandarizadas
cubren la capa de aplicación.
Las estandarizaciones ISO (International Standard Organization), a diferencia
de las normas BOSCH, especifican también el medio de comunicación. Por lo
tanto una implementación CAN a partir de las especificaciones de BOSCH no
siempre será compatible con las normas ISO.
2.1.1. Capa física
La capa física de CAN, es responsable de la transferencia de bits entre los
distintos nodos que componen la red. Define aspectos como niveles de señal,
codificación, sincronización y tiempos en que los bits se transfieren al bus.
En la especificación original de CAN , la capa física no fue definida, permitiendo
diferentes opciones para la elección del medio y niveles eléctricos de
transmisión. Las características de la señales eléctricas en el bus, fueron
establecidas más tarde por el ISO 11898 para las aplicaciones de alta
velocidad y, por el estándar ISO 11519 para las aplicaciones de baja velocidad
18
•
Estándar 11519
Los nodos conectados en este bus interpretan dos niveles lógicos
denominados: Dominante y Recesivo.
-
Dominante: la tensión diferencial (CAN_H - CAN_L) es del orden de
2.0 V con CAN_H = 3.5V y CAN_L = 1.5V (nominales).
-
Recesivo: la tensión diferencial (CAN_H - CAN_L) es del orden de 5V
con CAN_H = 0V y CAN_L = 5V (nominales).
A diferencia del bus de alta velocidad, el bus de baja velocidad requiere dos
resistencias en cada transceptor: RTH para la señal CAN_H y RTL para la
señal CAN_L. Esta configuración permite al transceptor de bus de baja
velocidad (fault-tolerant) detectar fallas en la red. La suma de todas las
resistencias en paralelo, debe estar en el rango de 100-500.
Red Bus CAN de Baja Velocidad ( Fault Tolerant).
19
•
Estándar 11898
Los nodos conectados en este bus interpretan los siguientes niveles lógicos:
-
Dominante: la tensión diferencial (CAN_H - CAN_L) es del orden de
2.0 V con CAN_H = 3.5V y CAN_L = 1.5V (nominales).
-
Recesivo: la tensión diferencial (CAN_H - CAN_L) es del orden de 0V
con CAN_H = CAN_L = 2.5V (nominales).
El par de cables trenzados (CAN_H y CAN_L) constituyen una transmisión de
línea. Si dicha transmisión de línea no está configurada con los valores
correctos, cada trama transferida causa una reflexión que puede originar fallos
de comunicación. Como la comunicación en el bus CAN fluye en ambos
sentidos, ambos extremos de red deben de estar cerrados mediante una
resistencia de 120. Ambas resistencias deberían poder disipar 0.25 w. de
potencia.
Red Bus CAN de Alta Velocidad.
20
2.1.2. Capa de enlace de datos
La capa de enlace de datos es responsable del acceso al medio y el control
lógico y está dividida a su vez en dos niveles.
-
El subnivel LLC (Logical Link Control): Gestiona el filtrado de los
mensajes, las notificaciones de sobrecarga y la administración de la
recuperación.
-
El subnivel MAC (Medium Acces Control): Es el núcleo del protocolo
CAN y gestiona el tramado y desentramado de los mensajes, el
arbitraje a la hora de acceder al bus y el reconocimiento de los
mensajes, así como el chequeo de posibles errores y su
señalización, el aislamiento de fallos en unidades de control y la
identificación del estado libre del bus para iniciar una transmisión o
recepción de un nuevo mensaje.
21
2.2. Estructura de un nodo CAN
Dentro de un nodo CAN, se pueden distinguir una serie de módulos
interconectados entre ellos: un bus de direcciones, datos y un control (paralelo)
enlazando el controlador central, la memoria de los datos y el programa(donde
esta almacenado el software de aplicación y el controlador de red de alto nivel),
los dispositivos de entrada y salida y, la interfaz de comunicación.
Desde el punto de vista del controlador, la interfaz de comunicación se puede
ver como un conjunto de buzones, donde cada uno de estos sirve como
registro lógico de interfaz entre el controlador local y los nodos remotos. Si un
nodo quiere comunicarse,
tiene que dar de alta los correspondientes buzones de recepción y transmisión
antes de hacer ninguna operación.
22
Teniendo en cuenta esta arquitectura, el funcionamiento sigue los siguientes
pasos:
-
-
Para inicializar, el programador especifica los parámetros de los
registros de control de interfaz de comunicación, como las
características del controlador de red o la velocidad de
transmisión.
A continuación, se actualizan todos los buzones. En cada buzón
se especifica si es receptor o transmisor y, su estado inicial,
inicializando su parte de datos del búfer.
Posteriormente, para transmitir un mensaje es necesario poner
los datos en el búfer de datos correspondiente al buzón de
transmisión y activar el flanco de transmisión.
Por último, la interfaz de red intenta comunicar los datos a través
de la red. El estado de la transferencia se puede comprobar en el
estatus de estado de cada buzón.
Una vez hecha la configuración inicial a partir del software de la capa de
aplicación de esta manera, los nodos CAN funcionarán de forma autónoma.
2.3. Formato de codificación y sincronización de datos.
La codificación de bits se realiza por el método NRZ (Non-Return-to Zero) que
se caracteriza por que el nivel de señal puede permanecer constante durante
largos periodos de tiempo y habrá que tomar medidas para asegurarse de que
el intervalo máximo permitido entre dos señales no es superado. Esto es
importante para la sincronización (Bit Timing).
Este tipo de codificación requiere poco ancho de banda para transmitir, pero en
cambio, no puede garantizar la sincronización de la trama transmitida. Para
resolver esta falta de sincronismo se emplea la técnica del “bit stuffing”: cada 5
bits consecutivos con el mismo estado lógico en una trama (excepto del
delimitador de final de trama y el espacio entre tramas), se inserta un bit de
diferente polaridad, no perdiéndose así la sincronización. Por otro lado este bit
extra debe ser eliminado por el receptor de la trama, que sólo lo utilizará para
sincronizar la transmisión.
No hay flanco de subida ni de bajada para cada bit, durante el tiempo de bit hay
bits dominantes (“0”) y recesivos (“1”) y disminuye la frecuencia de señal
respecto a otras codificaciones .
23
2.4 Tramas
2.4.1.Tipo de tramas
El protocolo CAN está basado en mensajes, no en direcciones. El nodo emisor
transmite el mensaje a todos los nodos de la red sin especificar un destino y
todos ellos escuchan el mensaje para luego filtrarlo según le interese o no.
Existen distintos tipos de tramas predefinidas por CAN para la gestión de la
transferencia de mensajes:
-
Trama de datos: Se utiliza normalmente para poner información en el
bus y la pueden recibir algunos o todos los nodos.
-
Trama de información remota: Puede ser utilizada por un nodo para
solicitar la transmisión de una trama de datos con la información
asociada a un identificador dado. El nodo que disponga de la
información definida por el identificador la transmitirá en una trama
de datos.
-
Trama de error: Se generan cuando algún nodo detecta algún error
definido.
-
Trama de sobrecarga: Se generan cuando algún nodo necesita más
tiempo para procesar los mensajes recibidos.
-
Espaciado entre tramas: Las tramas de datos (y de interrogación
remota) se separan entre sí por una secuencia predefinida que se
denomina espaciado inter-trama.
-
Bus en reposo: En los intervalos de inactividad se mantiene
constantemente el nivel recesivo del bus.
En un bus CAN los nodos transmiten la información espontáneamente con
tramas de datos, bien sea por un proceso cíclico o activado ante eventos en el
nodo. La trama de interrogación remota sólo se suele utilizar para detección de
presencia de nodos o para puesta al día de información en un nodo recién
incorporado a la red. Los mensajes pueden entrar en colisión en el bus, el de
identificador de mayor prioridad sobrevivirá y los demás son retransmitidos lo
antes posible.
24
2.4.2. Trama de datos
Es la utilizada por un nodo normalmente para poner información en el bus.
Puede incluir entre 0 y 8 bytes de información útil.
Los mensajes de datos consisten en celdas que envían datos y añaden
información definida por las especificaciones CAN:
-
Inicio de trama (SOF): El inicio de trama es una celda de un sólo bit
siempre dominante que indica el inicio del mensaje, sirve para la
sincronización con otros nodos.
-
Celda de Arbitraje (Arbitration Field): Es la celda que concede
prioridad a unos mensajes o a otros:
En formato estándar tendrá 11 bits seguidos del bit RTR (Remote
Transmisión Request) que en este caso será dominante.
25
En formato extendido serán 11 bits de identificador base y 18 de
extendido. El bit SRR substituye al RTR y será recesivo.
NOTA: La trama en formato estándar prevalece sobre la extendida
-
Celda de control (Control Field): El campo de control está formado
por dos bits reservados para uso futuro y cuatro bits adicionales que
indican el número de bytes de datos. En realidad el primero de estos
bits (IDE) se utiliza para indicar si la trama es de CAN Estándar (IDE
dominante) o Extendido (IDE recesivo). El segundo bit (RB0) es
siempre recesivo. Los cuatro bits de código de longitud (DLC) indican
en binario el número de bytes de datos en el mensaje (0 a 8)
-
Celda de Datos (Data Field): Es el campo de datos de 0 a 8 bytes.
-
CRC: Código de redundancia cíclica: Tras comprobar este código se
podrá comprobar si se han producido errores.
-
Celda de reconocimiento (ACK): es un campo de 2 bits que indica si
el mensaje ha sido recibido correctamente. El nodo transmisor pone
este bit como recesivo y cualquier nodo que reciba el mensaje lo
pone como dominante para indicar que el mensaje ha sido recibido.
-
Fin de trama (EOF): Consiste en 7 bits recesivos sucesivos e indica
el final de la trama.
-
Espaciado entre tramas (IFS): Consta de un mínimo de 3 bits
recesivos.
26
2.4.3 Trama remota (Remote Frame)
Los nodos tienen habilidad para requerir información a otros nodos. Un nodo
pide una información a los otros y el nodo que tiene dicha información envía
una comunicación con la respuesta que puede ser recibida además por otros
nodos si están interesados.
Un mensaje de petición remota tiene la siguiente forma:
En este tipo de mensajes se envía una trama con el identificador del nodo
requerido, a diferencia con los mensajes de datos, el bit RTR toma valor
recesivo y no hay campo de datos.
En caso de que se envíe un mensaje de datos y de petición remota con el
mismo identificador, el de datos ganará el acceso al bus puesto que el RTR
lleva valor dominante.
27
2.4.4. Trama de error
Las tramas de error son generadas por cualquier nodo que detecta un error.
Consiste en dos campos: Indicador de error ("Error Flag") y Delimitador de
error(“Error Delimeter”).
El delimitador de error consta de 8 bits recesivos consecutivos y permite a los
nodos reiniciar la comunicación limpiamente tras el error.
El Indicador de error es distinto según el estado de error del nodo que detecta
el error:
Si un nodo en estado de error "Activo" detecta un error en el bus interrumpe la
comunicación del mensaje en proceso generando un "Indicador de error activo"
que consiste en una secuencia de 6 bits dominantes sucesivos. Esta secuencia
rompe la regla de relleno de bits y provocará la generación de tramas de error
en otros nodos. Por tanto el indicador de error puede extenderse entre 6 y 12
bits dominantes sucesivos. Finalmente se recibe el campo de delimitación de
error formado por los 8 bits recesivos. Entonces la comunicación se reinicia y el
nodo que había sido interrumpido reintenta la transmisión del mensaje.
Si un nodo en estado de error "Pasivo" detecta un error, el nodo transmite un
"Indicador de error pasivo" seguido, de nuevo, por el campo delimitador de
error. El indicador de error de tipo pasivo consiste en 6 bits recesivos seguidos
y, por tanto, la trama de error para un nodo pasivo es una secuencia de 14 bits
recesivos. De aquí se deduce que la transmisión de una trama de error de tipo
pasivo no afectará a ningún nodo en la red, excepto cuando el error es
detectado por el propio nodo que está transmitiendo. En ese caso los demás
nodos detectarán una violación de las reglas de relleno y transmitirán a su vez
tramas de error.
Tras señalar un error por medio de la trama de error apropiada cada nodo
transmite bits recesivos hasta que recibe un bit también recesivo, luego
transmite 7 bits recesivos consecutivos antes de finalizar el tratamiento de
error.
28
La regla de relleno de bits que aparece líneas superiores, consiste en que cada
cinco bits de igual valor se introduce uno de valor inverso tal y como se ve en la
figura siguiente:
Otro método para la detección de errores es el chequeo de la trama:
El campo CRC contiene información adicional a la trama, éste se calcula con
un polinomio generador de igual manera en el receptor y en el emisor. Esto
permite detectar errores aleatorios en hasta 5 bits o una secuencia seguida de
15 bits corruptos.
El campo ACK, en el caso del emisor será recesivo y el receptor deberá
sobrescribirlo como dominante y el primero comprobará, mediante la
monitorización, que el mensaje ha sido escuchado. Si no sucede así, la trama
se considerará corrupta.
29
2.4.5. Trama de sobrecarga
Una trama de sobrecarga tiene el mismo formato que una trama de error activo.
Sin embargo, la trama de sobrecarga sólo puede generarse durante el espacio
entre tramas. De esta forma se diferencia de una trama de error, que sólo
puede ser transmitida durante la transmisión de un mensaje. La trama de
sobrecarga consta de dos campos, el Indicador de Sobrecarga, y el delimitador.
El indicador de sobrecarga consta de 6 bits dominantes que pueden ser
seguidos por los generados por otros nodos, dando lugar a un máximo de 12
bits dominantes. El delimitador es de 8 bits recesivos.
Una trama de sobrecarga puede ser generada por cualquier nodo que debido a
sus condiciones internas no está en condiciones de iniciar la recepción de un
nuevo mensaje. De esta forma retrasa el inicio de transmisión de un nuevo
mensaje. Un nodo puede generar como máximo 2 tramas de sobrecarga
consecutivas para retrasar un mensaje. Otra razón para iniciar la transmisión
de una trama de sobrecarga es la detección por cualquier nodo de un bit
dominante en los 3 bits de "intermission". Por todo ello una trama de
sobrecarga de 5 generada por un nodo dará normalmente lugar a la generación
de tramas de sobrecarga por los demás nodos dando lugar, como se ha
indicado, a un máximo de 12 bits dominantes de indicador de sobrecarga.
2.4.6. Espacio entre tramas
El espacio entre tramas separa una trama (de cualquier tipo) de la siguiente
trama de datos o interrogación remota. El espacio entre tramas ha de constar
de, al menos, 3 bits recesivos. Esta secuencia de bits se denomina
"íntermission". Una vez transcurrida esta secuencia un nodo en estado de error
activo puede iniciar una nueva transmisión o el bus permanecerá en reposo.
Para un nodo en estado error pasivo la situación es diferente, deberá espera
una secuencia adicional de 8 bits recesivos antes de poder iniciar una
transmisión. De esta forma se asegura una ventaja en inicio de transmisión a
los nodos en estado activo frente a los nodos en estado pasivo.
30
2.5 Acceso múltiple y arbitraje de acceso al bus
Unas de las características que distingue a CAN con respecto a otras normas,
es su técnica de acceso al medio denominada como CSMA/CD+CR o "Carrier
Sense, Multiple Access/Collision Detection + Collision Resolution" (Acceso
Múltiple con detección de portadora, detección de colisión más Resolución de
colisión). Cada nodo debe vigilar el bus en un periodo sin actividad antes de
enviar un mensaje (Carrier Sense) y además, una vez que ocurre el periodo sin
actividad cada nodo tiene la misma oportunidad de enviar un mensaje (Multiple
Access). En caso de que dos nodos comiencen a transmitir al unísono se
detectará la colisión.
El método de acceso al medio utilizado en bus CAN añade una característica
adicional: la resolución de colisión. En la técnica CSMA/CD utilizada en redes
Ethernet ante colisión de varias tramas, todas se pierden. CAN resuelve la
colisión con la supervivencia de una de las tramas que chocan en el bus.
Además la trama superviviente es aquella a la que se ha identificado como de
mayor prioridad.
La resolución de colisión se basa en una topología eléctrica que aplica una
función lógica determinista a cada bit, que se resuelve con la prioridad del nivel
definido como bit de tipo dominante. Definiendo el bit dominante como
equivalente al valor lógico '0' y bit recesivo al nivel lógico '1' se trata de una
función AND de todos los bits transmitidos simultáneamente. Cada transmisor
escucha continuamente el valor presente en el bus, y se retira cuando ese valor
no coincide con el que dicho transmisor ha forzado. Mientras hay coincidencia
la transmisión continua, finalmente el mensaje con identificador de máxima
prioridad sobrevive. Los demás nodos reintentarán la transmisión lo antes
posible.
Se ha de tener en cuenta que la especificación CAN de Bosh no establece
cómo se ha de traducir cada nivel de bit (dominante o recesivo) a variable
física. Cuando se utiliza par trenzado según ISO 11898 el nivel dominante es
una tensión diferencial positiva en el bus, el nivel recesivo es ausencia de
tensión, o cierto valor negativo, (los transceptores no generan corriente sobre
las resistencias de carga del bus). Esta técnica aporta la combinación de dos
factores muy deseados en aplicaciones industriales distribuidas: la posibilidad
de fijar con determinismo la latencia en la transmisión de mensajes entre nodos
y el funcionamiento en modo multimaestro sin necesidad de gestión del
arbitraje, es decir control de acceso al medio, desde las capas de software de
protocolo. La prioridad queda así determinada por el contenido del mensaje,
en CAN es un campo determinado, el identificador de mensaje, el que
determina la prioridad
31
En un bus único, un identificador de mensaje ha de ser asignado a un solo
nodo concreto, es decir, se ha de evitar que dos nodos puedan iniciar la
transmisión simultanea de mensajes con el mismo identificador y datos
diferentes. El protocolo CAN establece que cada mensaje es único en el
sistema, de manera que por ejemplo, si en un automóvil existe la variable
“presión de aceite”, esta variable ha de ser transmitida por un nodo concreto,
con un identificador concreto, con una longitud fija concreta y coherente con la
codificación de la información en el campo de datos.
En la siguiente figura se ve un ejemplo de arbitraje en un bus CAN.
32
2.6. Detección de Errores
Una de las características mÁs importantes y útiles de CAN es su alta
fiabilidad, incluso en entornos de ruido extremos, el protocolo CAN proporciona
una gran variedad de mecanismos para detectar errores en las tramas. Esta
detección de error es utilizada para retransmitir la trama hasta que sea recibida
con éxito. Otro tipo de error es el de aislamiento, y se produce cuando un
dispositivo no funciona correctamente y un alto por ciento de sus tramas son
erróneas. Este error de aislamiento impide que el mal funcionamiento de un
dispositivo condicione el funcionamiento del resto de nodos implicados en la
red.
2.6.1. Detección de errores
En el momento en que un dispositivo detecta un error en una trama, este
dispositivo transmite una secuencia especial de bits, “el error flag”.Cuando el
dispositivo que ha transmitido la trama errónea detecta el error flan, transmite la
trama de nuevo. Los dispositivos CAN detectan los errores siguientes:
-
Error de bit: Durante la transmisión de una trama, el nodo que
transmite monitoriza el bus. Cualquier bit que reciba con polaridad
inversa a la que ha transmitido se considera un error de bit, excepto
cuando se recibe durante el campo de arbitraje o en el bit de
reconocimiento. Además, no se considera error de bit la detección de
bit dominante por un nodo en estado de error pasivo que retransmite
una trama de error pasivo.
-
Error de relleno (Stuff Error): Se considera error de relleno la
detección de 6 bits consecutivos del mismo signo, en cualquier
campo que siga la técnica de relleno de bits, donde por cada 5 bits
iguales se añade uno diferente.
-
Error de CRC: Se produce cuando el calculo de CRC realizado por
un receptor no coincide con el recibido en la trama. El campo CRC
(Cyclic Redundant Code) contiene 15 bits y una distancia de
Hamming de 6, lo que asegura la detección de 5 bits erróneos por
mensaje. Estas medidas sirven para detectar errores de transmisión
debido a posible incidencias en el medio físico como por ejemplo el
ruido.
-
Error de forma (Form Error): Se produce cuando un campo de
formato fijo se recibe alterado como bit.
-
Error de reconocimiento (Acknowledgement Error): Se produce
cuando ningún nodo cambia a dominante el bit de reconocimiento.
33
Si un nodo advierte alguno de los fallos mencionados, iniciará la transmisión de
una trama de error. El protocolo CAN especifica diversos fallos en la línea física
de comunicación, como por ejemplo línea desconectada, problemas con la
terminación de los cables o líneas cortocircuitadas. Sin embargo, no
especificará como reaccionar en caso de que se produzca alguno de estos
errores.
2.6.2. Aislamiento de nodos defectuosos
Para evitar que un nodo en problemas condicione el funcionamiento del resto
de la red, se han incorporado a la especificación CAN medidas de aislamiento
de nodos defectuosos que son gestionadas por los controladores. Un nodo
pude encontrarse en uno de los tres estados siguientes en relación a la gestión
de errores:
-
Error Activo (Error Active): Es el estado normal de un nodo. Participa
en la comunicación y en caso de detección de error envía una trama
de error activa
-
Error pasivo (Error Passive): Un nodo en estado de error pasivo
participa en la comunicación, sin embargo ha de esperar una
secuencia adicional de bits recesivos antes de transmitir y sólo puede
señalar errores con una trama de error pasiva.
-
Anulado (Bus Off): En este estado, deshabilitará su transceptor y no
participará en la comunicación.
La evolución entre estos estados se basa en dos contadores incluidos en el
controlador de comunicaciones. Contador de errores de transmisión (TEC) y
Contador de errores de recepción (REC).
Evolución entre estados de error.
34
2.7. Especificaciones
CAN tiene dos formatos diferentes para transmitir datos: el formato de trama
estándar (Standard Frame), según la especificación CAN 2.0A y, el formato de
trama extendida (Extended Frame) según la especificación CAN 2.0B. La
principal diferencia entre ambos es la longitud del identificador del mensaje
(ID), que en el caso de la trama estándar es de 11 bits (2032 identificadores, ya
que los 16 bits identificadores de menor prioridad están reservados) y en el
caso de la extendida es de 29 bits (mas de 536 millones de identificadores):
-
Controladores 2.0A: únicamente transmiten y reciben mensajes en
formato estándar. Si el formato es extendido se producirá un error.
-
Controladores 2.0B pasivos: únicamente transmiten y reciben
mensajes en formato estándar, pero admiten la recepción de
mensajes en formato extendido, aunque los ignora posteriormente.
-
Controladores 2.0B activos: transmiten y reciben mensajes en ambos
formatos.
2.8. Implementaciones
Existen tres tipos de arquitecturas en microcontroladores: Stand-Alone CAN
controller, Integrated CAN Controller y Single-Chip CAN Node.
•
Stand-Alone CAN Controller
Es la arquitectura más simple, para llevar a cabo una comunicación en una red
CAN será necesario:
1. Un microcontrolador como puede ser el 16F877, con el que se ha venido
trabajando a lo largo de todo este proyecto.
2. Un controlador CAN que introduzca el protocolo CAN, filtro de mensajes,… y
todo el interface necesario para las comunicaciones. Un ejemplo de controlador
CAN es el MCP2510 cuya DATA SHEET se puede encontrar en la página web
de microchip.
3. Un transceiver CAN, esto es, un transmisor/receptor que puede ser por
ejemplo el MCP2551 desarrollado por microchip.
35
Así pues, si de alguna manera se pretende trabajar en una red CAN con una
placa de pruebas, en un principio no sería factible a no ser que de alguna
manera se le acoplasen el controlador y el transceptor CAN correspondiente.
Pero Microchip ha creado una placa de pruebas específica para este tipo de
comunicaciones, que desarrolla además este tipo de arquitectura y que se
puede conseguir también a través de la página web de microchip.
•
Integrated CAN Controller
Este tipo de arquitectura consiste en un microcontrolador que incluya, no sólo
sus características propias sino además un módulo CAN con las características
de un microcontrolador CAN. El transceiver se sitúa de manera separada. Este
es el caso de nuestro microcontrolador dSPIC30F4013. El módulo del
transceptor actúa como un controlador de línea, balanceando la señal, esto es,
adecuando los niveles de tensión de esta al exterior.
36
•
Single-chip CAN Node
Se trata de un chip que incluye en su interior los tres elementos necesarios
para llevar a cabo las comunicaciones en un entorno CAN.
37
2. CAN DEL MICRO
dsPIC30F4013
38
3.1. Características básicas
Se trata de una interfaz serie, utilizada para la comunicación con otros módulos
CAN u otros dispositivos del propio microcontrolador.
El módulo está formado por un ‘motor de protocolo’ (protocol engine) y por un
control y almacenamiento de los mensajes. El motor de protocolo CAN maneja
todas las funciones encargadas de recibir y transmitir mensajes a través del
bus. El estado y los errores de la transmisión pueden consultarse leyendo en
los registros apropiados. Además, como ya sabemos, cualquier mensaje
detectado en el bus es sometido a un control de errores y después es filtrado
para comprobar si debería ser recibido y almacenado en uno de los registros
de recepción, o debería por lo contrario ser rechazado.
Básicamente las características técnicas del módulo son las siguientes:
•
Implementa el protocolo ‘CAN 2.0 A/B’ tal y como lo define Bosch, es
decir, soporta CAN 1.2, CAN 2.0A, CAN 2.0B Pasivo y CAN 2.0B Activo.
•
Soporta tramas de datos estándar y extendidas.
•
De 0 a 8 bytes de longitud de datos.
•
Velocidad de transferencia de datos programable hasta 1 Mbit/segundo.
•
Admite tramas remotas.
•
Receptor de doble búfer, con dos bufers de almacenamiento de
mensajes con prioridad recibidos (cada búfer puede contener hasta 8
bytes de datos).
•
6 ‘filtros de aceptación completa’ (full acceptance filter), tanto para
mensajes con identificador estándar como extendido. De ellos, 2 están
asociados con el búfer de recepción de prioridad alta y 4 lo están
asociados con el búfer de recepción de prioridad baja.
•
2 ‘máscaras de filtro de aceptación completa’ (full acceptance filter
masks), cada una de ellas asociada a los bufers de recepción de alta o
de baja prioridad.
•
3 bufers de transmisión con asignación de prioridades específicas y
capacidad de aborto (cada búfer puede contener hasta 8 bytes de datos)
•
Función de ‘despertador’ (wake-up) programable con filtros paso-bajo
integrados.
•
Modo Loopback programable con operación de ‘auto-test’ (self-test).
39
•
Capacidad de señalización a través de interrupciones por parte de todos
los receptores y transmisores de estados de error CAN.
•
Reloj fuente (clock source) programable.
•
Enlace programable al módulo de captura de entrada (IC2, tanto para
CAN1 como para CAN2) para la función “time-stamping” (marcas de
tiempo) y sincronización de red.
•
2 modos de baja potencia: Sleep (dormido) e Idle (parado).
40
3.2. Transceptor (transceiver)
Como ya hemos visto anteriormente, dsPIC30F4013 implementa un controlador
CAN integrado, y en este tipo de implementaciones el transceptor (transceiver)
no está dentro del propio microcontrolador.
En definitiva, para poder trabajar con él deberemos conectar uno de estos
transceptores al microcontrolador.
A pesar de que los transceptores pueden funcionar a diferentes tensiones,
tendremos que elegir uno que pueda funcionar a 3.3 voltios, que es la tensión
con la que vamos a alimentar al microcontrolador a la hora de utilizarlo.
Ejemplo de Transceptor CAN de alta velocidad: MCP2551
Aunque existen un gran número en el mercado, hemos escogido un modelo
compatible para explicar como serían las conexiones y una breve explicación
de su funcionamiento.
Este transceptor puede direccionar
una carga mínima de 45 Ohms,
permitiendo conectarse a un máximo
de 112 nodos.
La entrada del transceptor, RXD,
proporciona el diferencial de tensión
entre CANH y CANL.
El pin Rs permite elegir entre 3
modos de funcionamiento:
- High Speed mode:
Se consigue conectando el pin Rs a Vdd.
- Slope Control::
Reduce enormemente las emisiones electromagnéticas disminuyendo los
tiempos de subida y de caída de CANH y CANL. Este control se logra mediante
una resistencia entre Rs y Ground (masa). La tasa de ralentización es
proporcional a la salida actual en Rs.
- Standby mode:
Se consigue poniendo a nivel alto la patilla Rs. En este modo, el transmisor
está apagado, y el receptor funciona ralentizado, es decir, el pin del receptor
RXD seguirá operativo, pero de forma más lenta.
41
La conexión física sería a través de los pines C1RX (recepción CAN del micro),
C1TX (transmisión CAN del micro) del microcontrolador, con los pines RXD y
TXD del transceptor. Recordar que la función del transceptor es la de adecuar
la señal de entrada del bus a la del sistema. Esta entrada de señal del bus se
efectúa a través de los patillas CANH y CANL del transceptor.
Aquí vemos la conexión entre el micro y el transceptor, representado esta vez
por un diagrama de bloques:
Encapsulado del microcontrolador dsPIC30F4013
Diagrama de bloques del transceptor
42
3.3. Modos de funcionamiento
El módulo puede trabajar en uno de entre varios modos de funcionamiento,
previamente escogido por el usuario entre:
-
Modo de inicialización (Initialization mode)
Modo deshabilitado (Disable mode)
Modo de funcionamiento normal (Normal operation mode)
Modo de solo escucha (Listen only mode)
Modo en bucle (Loopback mode)
Modo de reconocimiento de errores (Error recognition mode)
Los modos se solicitan poniendo los bits del registro REQOP<2:0>
(CiCTRL<10:8>), excepto el modo de reconocimiento de errores que se
selecciona a través de los bits RXM<1:0> (CiRXnCON<6:5>, donde n=0 o n=1
representan un búfer de recepción en particular). La entrada en un modo se
reconoce observando los bits del registro OPMODE<2:0> (CiCTRL<7:5>). El
módulo no cambiará de modo, ni tampoco cambiará los bits OPMODE mientras
el cambio de modo no sea correcto. Generalmente, para que sea correcto ha
de hacerse durante el tiempo en que el bus está parado (Idle time), es decir,
cuando se envían al menos 11 bits recesivos consecutivos.
Modo de inicialización (Initialization mode)
En este modo, el módulo no puede transmitir ni recibir datos. Al seleccionarlo,
los contadores de error se ponen a 0 y las ‘banderas de interrupción’ (interrupt
flags) permanecen inalterables. A la hora de programar, desde él tendremos
acceso a ciertos registros de configuración a los cuales no se puede acceder
desde ningún otro modo. Además, el módulo nos protegerá de violaciones
accidentales del protocolo CAN que podamos causar durante la programación.
Para poder acceder al modo de configuración (Configuration mode) no se
puede estar en mitad de una transmisión; es por ello que ninguno de los
registros que controlan la configuración del módulo puede ser modificado
mientras el módulo esté conectado. El susodicho modo de configuración ejerce
de cerrojo para proteger los siguientes registros:
-
Registros de control del módulo (Module control registers)
Registros de tasa (velocidad de transmisión) en baudios (Baud rate
registers) y registros de configuración de interrupciones (Interrupt
configuration registers)
Registros de temporización del bus (Bus timing registers)
Registros identificadores de los filtros de aceptación (Identifier
acceptance filter registers)
Registros identificadores de las máscaras de aceptación (Identifier
acceptance mask registers).
43
Modo deshabilitado (Disable mode)
En este modo, el módulo tampoco transmite ni recibe datos.
Si hay actividad en el bus, el módulo pondrá a 1 los bits del registro WAKIF,
mientras que las interrupciones sin ejecutar quedaran pendientes y los
contadores de error conservaran su valor.
Si los bits REQOP<2:0> (CiCTRL<10:8>) = 001, el módulo entrará en el modo
deshabilitado. Si en ese momento el módulo está activo, entonces esperará
hasta que le lleguen 11 bits recesivos desde el bus, los cuales detectará e
interpretará como a que el bus está sin utilizar (Idle bus); después aceptará el
comando de módulo deshabilitado (module disable command). Cuando los bits
OPMODE<2:0> (CiCTRL<7:5>) = 001, el módulo habrá entrado
satisfactoriamente al modo. Los pins de entrada/salida (I/O) volverán a su
función normal cuando el módulo esté en el modo de módulo inutilizado
(Module Disable mode).
El módulo puede ser programado para aplicar un filtro paso-bajo a la línea de
entrada CiRX, mientras el módulo o la CPU estén en modo dormido (Sleep
mode). El bit WAKFIL (CiCFG2<14>) es el que activa o desactiva este filtro.
NOTA:
Si el módulo va a trabajar en un modo de funcionamiento particular y es
solicitada una transmisión inmediatamente después de que el módulo CAN se
haya colocado en ese modo de funcionamiento, esperará 11 bits recesivos
consecutivos en el bus antes de empezar la transmisión. Si el usuario decide
cambiar al modo deshabilitado (disable mode) dentro del periodo de esos 11
bits recesivos, la transmisión será cancelada y se colocará el bit TXABT y será
borrado el bit TXREQ.
Modo de funcionamiento normal (Normal operation mode)
Para seleccionar el modo de funcionamiento normal, debemos poner los bits
REQOP<2:0> = 000. Al entrar en este modo, el módulo se activa y los pins de
entrada/salida (I/O) asumen las funciones del bus CAN, es decir, el módulo
transmitirá y recibirá mensajes del bus a través de los pins CxTX y CxRX.
Modo de solo escucha (Listen only mode)
Cuando activamos este modo, el módulo está pasivo. Los bufers de
transmisión funcionan como puertos de entrada/salida (I/O), y los pins
receptores por su parte, continúan como entradas. El receptor deja de enviar
‘banderas de error’ (error flags) y ‘señales de reconocimiento’ (acknowledge
signals), y los contadores de error se desactivan. El modo de solo escucha
puede ser utilizado para detectar la tasa (velocidad de transmisión) en baudios
sobre el bus. Parece evidente que para poder utilizarlo, es necesario que haya
al menos dos nodos remotos que se comuniquen el uno con el otro.
44
Modo de escucha de todos los mensajes (Listen all messages mode)
En él, el módulo es fijado para ignorar todos los errores y poder recibir así
cualquier mensaje que se ha enviado a través del bus. Para activarlo, debemos
poner los bits de REQOP<2:0> = ‘111’. En este modo, los datos que están en
el buffer de ensamblado de mensajes (message assembly buffer) hasta que
ocurre un error, son copiados en el búfer de recepción y pueden ser leídos a
través de la interfaz de la CPU.
Modo loopback (Loopback mode)
Cuando el modo loopback se activa, la señal interna de transmisión y la señal
interna de recepción se conectan en el límite del módulo, formando una
especie de bucle cerrado. Los pins de transmisión y de recepción vuelven a sus
funciones de puerto de entrada/salida I/O.
45
3.4. Recepción de mensajes
Bufers de recepción
El módulo del bus CAN tiene 3 bufers de recepción. No obstante, uno de los
bufers de recepción se dedica continuamente a escuchar el bus en espera de
mensajes entrantes. Este búfer se llama ‘Búfer de ensamblado de mensajes’
(Message Assembly Buffer o MAB). Por tanto hay 2 bufers de recepción
visibles, RXB0 y RXB1, que pueden recibir simultáneamente un mensaje
completo desde el motor de protocolo.
Todos los mensajes son montados por el MAB y son transferidos a los bufers
RXBn solo si se encuentran los filtros de criterios de aceptación. Cuando se
recibe un mensaje, la bandera (flag) RXnIF (CiINTF <0> o CiINTF <1>) se pone
a 1. Este bit solo puede ser activado por el modulo cuando se recibe un
mensaje. La CPU pone el bit a cero cuando ha completado el procesado del
mensaje en el búfer. Si el bit RXiIE (CiINTE <0> o CiINTE <1>) está a 1, se
generará una interrupción cuando se reciba un mensaje. Los filtros RXF0 y
RXF1 con la máscara RXM0 están asociados con RXB0. Los filtros RXF2,
RXF3, RXF4 y RXF5 y la máscara RXM1 están asociados con RXB1.
Filtros de aceptación de mensajes
Los filtros y mascaras de aceptación de mensajes se usan para determinar si
un mensaje del búfer de ensamblado de mensajes debe ser cargado en alguno
de los bufers de recepción. Una vez un mensaje válido ha sido recibido por el
MAB, los campos de identificación del mensaje son comparados con los
valores de los filtros. Si hay una coincidencia, ese mensaje será cargado en el
búfer de recepción apropiado.
El filtro de aceptación busca en los mensajes entrantes el bit RXIDE
(CiRXnSID<0>) para determinar como comparar los identificadores. Si el bit
RXIDE esta desactivado, el mensaje es una trama estándar y solo se
comparan los filtros con el bit EXIDE (CiRXFnSID<0>) a cero. Si el bit RXIDE
está puesto a 1, el mensaje es una trama extendida, y solo son comparados los
filtros con el EXIDE a 1. Configurando los bits RXM<1:0> a ‘01’ ó a ‘10’ se
puede borrar el bit EXIDE.
Máscaras de filtro de aceptación de mensajes
Los bits de máscara determinan que bits se han de aplicar en el filtro. Si un bit
de máscara está a cero, entonces este bit será aceptado automáticamente
independientemente del bit de filtro. Hay 2 máscaras de filtro de aceptación
programables, asociadas con los bufers de recepción, una por cada búfer.
46
Sobrecarga de recepción:
Esta condición de sobrecarga se da cuando el MAB ha ensamblado un
mensaje recibido válido, cuando el mensaje es aceptado a través del filtro de
aceptación, y cuando el búfer de recepción asociado con el filtro no ha sido
designado como vacío por el mensaje previo.
El flag de error de sobrecarga, RXnOVR (CiINTF<15> o CiINTF<14>), y el bit
ERRIF (CiINTF<5>) son puestos a 1 y el mensaje del MAB es descartado. Si el
bit DBEN está desactivado, RXB1 y RXB0 operan independientemente.
Cuando esto ocurre, un mensaje dirigido a RXB0 no es desviado a RXB1 si el
RXB0 contiene un mensaje no leído y el RX0OVR se pone a 1.
Si el bit DBEN esta activado, la sobrecarga del RXB0 se trata de forma
diferente. Si se recibe un mensaje válido para RXB0 y el bit RXFUL = 0, el
mensaje para RXB0 se carga en RXB1. No se genera un mensaje de error de
sobrecarga para RXB0. Si se recibe un mensaje valido para RXB0 y el bit
RXFUL = 1, tanto RXB0 como RXB1 están llenos, por lo tanto, el mensaje se
perderá y se generará un mensaje de error de sobrecarga para RXB1.
Errores de recepción
El Modulo CAN puede detectar los siguientes errores de recepción:
- Error de Chequeo de Redundancia Cíclica (CRC)
- Error de Relleno de Bits (Bit Stuffing Error)
- Error de Mensaje Inválido Recibido
Estos errores de recepción no generan una interrupción. Sin embargo, si que
se incrementa el contador de errores de recepción. El bit RXWAR (CiINTF<9>)
indica que el contador de errores de recepción ha alcanzado el límite de
advertencia de la CPU (este límite es 96) y se genera una interrupción.
Interrupciones de recepción
Las Interrupciones de recepción se pueden dividir en 3 grandes grupos, cada
uno de ellos incluye varias condiciones que generan interrupciones:
- Interrupción de recepción: Un mensaje se ha recibido correctamente
y se ha cargado en uno de los bufers de recepción. Esta interrupción
se activa inmediatamente después de recibir el campo Fin de Trama
(EOF). El flag RXnIF indica que buffer de recepción ha causado la
interrupción.
- Interrupción de despertador (Wake-up Interrupt): El módulo CAN se
ha despertado del modo Deshabilitado (Disable) o el dispositivo se
ha despertado del modo Durmiendo (Sleep)
- Interrupción de error de recepción: Una interrupción de error de
recepción se señala en el bit ERRIF. La fuente del error puede ser
determinada comprobando los bits del registro Estatus de
Interrupción CAN, CiINTF.
47
-
Mensaje Inválido Recibido: Si ocurre algún tipo de error durante la
recepción del ultimo mensaje, se indicará un error mediante el bit
IVRIF.
Sobrecarga de Receptor: El bit RXnOVR indica que ha ocurrido un
error de sobrecarga.
Advertencia del Receptor: El bit RXWAR indica que el contador de
errores de recepción (RERRCNT<7:0>) ha alcanzado el límite de
advertencia de 96.
Error de Recepción Pasivo: El bit RXEP indica que el contador de
errores de recepción ha excedido el límite de error pasivo de 127 y el
módulo ha entrado en el estado error pasivo.
3.5. Transmisión de mensajes
Bufers de transmisión:
El módulo CAN tiene 3 bufers de transmisión. Cada uno de los 3 bufers de
transmisión ocupa 14 bytes de datos. Ocho de los bytes son los 8 bytes que
puede ocupar como máximo el mensaje transmitido. Cinco bytes son los
identificadores estándar y extendidos y otra información de control del mensaje.
Prioridad de transmisión del mensaje:
La prioridad de transmisión es una priorización dentro de cada nodo de los
mensajes pendientes de transmitir. Hay 4 niveles de prioridad de transmisión.
Si TXPRI<1:0> (CiTXnCON<1:0>, donde n = 0, 1 o 2 representa el búfer de
transmisión en particular) para un búfer de mensaje en particular se establece a
‘11’, ese búfer tiene la máxima prioridad. Si TXPRI<1:0> para un búfer de
mensaje en particular se establece a ‘10’ o a ‘01’, ese búfer tiene una prioridad
intermedia. Si TXPRI<1:0> para un búfer de mensaje en particular se establece
a ‘00’, ese búfer tiene la mínima prioridad.
Secuencia de transmisión:
Para iniciar la transmisión del mensaje, el bit TXREQ (CiTXnCON<3>) debe
ponerse a 1. El módulo del bus CAN resuelve cualquier conflicto de tiempo
entre el establecimiento del bit TXREQ y el Inicio de Trama (SOF), asegurando
que si la prioridad ha sido cambiada, se ha resuelto correctamente antes de
llegar al SOF. Cuando se pone a 1 TXREQ, los bits del flag TXABT
(CiTXnCON<6>), TXLARB (CiTXnCON<5>) y TXERR (CiTXnCON<4>) son
puestos a 0 automáticamente.
Poner a 1 el bit TXREQ simplemente marca un búfer de mensaje como puesto
en cola para transmisión. Cuando el módulo detecta el bus disponible, empieza
a transmitir el mensaje que tiene mayor prioridad.
48
Si la transmisión se completa satisfactoriamente en el primer intento, el bit
TXREQ se pone a 0 automáticamente y se genera una interrupción si TXIE
había sido activado.
Si la transmisión del mensaje falla, se activa uno de los avisos de condición de
error y el bit TXREQ permanece a 1, indicando que el mensaje está aún
pendiente de transmisión. Si el mensaje encuentra una condición de error
durante el intento de transmisión, el bit TXERR se pone a 1 y puede causar una
interrupción. Si el mensaje pierde arbitraje durante el intento de transmisión, se
pone a 1 el bit TXLARB. No se genera interrupción para indicar la perdida de
arbitraje.
Abortando la transmisión del mensaje:
El sistema también puede abortar el envío de un mensaje poniendo a 0 el bit
TXREQ asociado con cada búfer de mensaje. Poniendo a 1 el bit ABAT
(CiCTRL<12>) se solicita abortar todos los mensajes pendientes. Si el mensaje
aún no ha iniciado la transmisión, o si el mensaje la ha iniciado pero es
interrumpida por pérdida de arbitraje o por un error, se procesa el aborto. El
aborto se indica poniendo a 1 el bit TXABT y la bandera (flag) TXnIF no se
activa automáticamente.
Errores de transmisión
El modulo CAN detecta los siguientes errores de transmisión:
- Error de Ack
- Error de forma
- Error de bit
Estos errores de transmisión no generan necesariamente una interrupción,
pero son indicados por el contador de errores de transmisión, incrementándolo
en uno. Una vez que el contador de errores supera el valor de 96, los bits
ERRIF (CiINTF<5>) y TXWAR (CiINTF<10>) son puestos a 1. Además, se
genera una interrupción y se pone a 1 el bit TXWAR del registro de banderas
de error.
Interrupciones de transmisión
Las Interrupciones de transmisión se pueden dividir en 2 grandes grupos, cada
uno de estos incluye varias condiciones que generan interrupciones:
-
-
Interrupciones de transmisión: Al menos uno de los tres bufers de
transmisión está vacío y puede ser cargado para programar una
transmisión de mensaje. Los flags TXnIF indican que búfer de
transmisión está disponible y ha sido el causante de la interrupción.
Interrupciones de errores de transmisión: Una interrupción error de
transmisión se indica con el flag ERRIF. La fuente del error se puede
determinar comprobando los flags de error en el registro de Estatus
49
-
de Interrupción del CAN, CiINTF. Los flags de este registro están
relacionados con los errores de transmisión y de recepción.
Interrupción de Advertencia del Transmisor: El bit TXWAR indica que
el contador de errores de transmisión ha alcanzado el límite de
advertencia de la CPU (96).
Error Pasivo del Transmisor: El bit TXEP (CiINTF<12>) indica que el
contador de errores de transmisión ha superado el límite de error
pasivo de 127 y el modulo ha entrado en el estado de error pasivo.
Bus Off: El bit TXBO (CiINTF<13>) indica que el contador de errores
de transmisión ha superado 255 y el módulo ha entrado en el estado
de bus off.
50
3.6. Temporización y sincronización de bits
3.6.1. Temporización de bits
Las señales eléctricas del bus sufren las alteraciones propias de la distorsión
que se produce, tanto por las características físicas de la línea, los retardos de
propagación, y los retardos producidos en los propios controladores, como por
las posibles fuentes externas de interferencia electromagnética.
Por otra parte, cada controlador CAN depende, normalmente, de un oscilador
distinto, lo que provoca diferencias de frecuencia que pueden dar lugar a
desfases en el muestreo de tramas de los distintos nodos. Por ello, los
controladores siguen un proceso de muestreo y resincronización orientado a
evitar los desajustes debidos a estas circunstancias adversas.
Estos desajustes se manifiestan especialmente en el arbitraje de mensajes,
cuando varios nodos transmiten de forma simultánea, ya que es prácticamente
imposible que esten completamente sincronizados; y además la frecuencia del
oscilador de ambos puede ser ligeramente distinta. Los receptores que se han
sincronizado con el primer flanco de bajada detectado, deberán ir
resincronizándose sucesivamente a los flancos producidos por el nodo que
acabe transmitiendo.
CAN utiliza señalización asíncrona y un tipo de codificación NRZ, en la que
normalmente 0V representa un ‘0’ lógico, y 5V representa un ‘1’ lógico. Es
necesaria, por tanto, una operación de muestreo por parte de los receptores,
que se han de resincronizar periódicamente. Además, la tasa de transmisión
(desde menos de 1 kbps hasta 1 Mbps) también es un factor determinante.
Todos estos parámetros pueden programarse individualmente y ser ejecutados
por el reloj lógico de CAN (Bit Timing Logic).
Para que el controlador, que es un sistema digital síncrono con una frecuencia
de reloj generada por un oscilador (generalmente un oscilador de cuarzo),
pueda muestrear la señal asíncrona recibida con seguridad y precisión ha de
utilizar una frecuencia de muestreo superior a la de la señal transmitida.
Por otra parte, el controlador ha de utilizar una frecuencia de reloj que sea
múltiplo de la ‘frecuencia nominal de bit’ (número de bis transmitidos en
ausencia de resincronizaciones por un transmisor ideal). Esta frecuencia se
obtiene como cociente de la frecuencia del oscilador.
La velocidad de comunicación a la que queda configurado el controlador, para
un oscilador de cierta frecuencia, queda definida por el valor del ‘divisor de
frecuencia’ (BRP), también configurable, y por el número de ‘TQ’ por bit.
TQ (quantum de tiempo) es una unidad de tiempo fija, derivada del periodo del
oscilador.
51
Debemos, por tanto, cambiar de escala para bajar la frecuencia del reloj, y así
poder adecuar el sistema a nuestras necesidades. Este valor para nuestro
dsPIC30F4013, se define en su correspondiente manual como ‘ajuste de
preescalado’ (prescaler setting) y se obtiene a partir de la siguiente ecuación:
TQ =
2·( BRP < 5 : 0 > +1)
FCAN
donde FCAN es FCY (si el bit CANKS está puesto a 1) o 4·FCY (si CANKS
está puesto a 0). Además, FCAN no debe sobrepasar nunca los 30 MHz, es
decir que si CANKS = 0, FCY no debe exceder de 7.5 MHz, ya que como
hemos dicho FCAN=4·FCY en este caso.
Además, para asegurar la funcionalidad de la red, se incluye en una posición
concreta del ‘tiempo de bit’ (del cual hablaremos más adelante), un ‘punto de
muestreo’ (sample point en inglés). Este es el punto exacto en el que el nivel de
bus es leído e interpretado como el valor de ese respectivo bit.
En algunos microcontroladores, entre los que se incluye dsPIC30F4013, si la
temporización de bits se retrasa y contiene muchos TQ, es posible realizar
también, un muestreo múltiple sobre el bus. En este caso, las muestras para
realizar el cálculo pueden ser tomadas en el punto de muestreo o en dos
posiciones anteriores a este con una distancia de TQ/2. Además, el módulo
CAN permite al usuario elegir entre muestrear tres veces en el mismo punto o
una vez en cada uno de los tres puntos, según pongamos a ‘0’ o a ‘1’ el bit
SAM (CiCFG2<6>).
Es decir, en este tipo de muestreo el nivel determinado por el bus corresponde
al resultado por mayoría de tres valores. Para asegurar la validez del cálculo,
este muestreo debe ocupar del 60 al 70 por ciento del tiempo de bit,
dependiendo de los parámetros del sistema.
3.6.2. Resincronización de bits (Resynchronization)
La resincronización consiste en el acortamiento o alargamiento del tiempo de
bit (o número de TQ por bit) para que el punto de muestreo se desplace con
relación al último flanco recesivo-dominante detectado. Esta decisión la toma el
controlador tras detectar el flanco y evaluar el error.
En CAN se siguen dos métodos de sincronización del muestreo con la
secuencia de bits de la trama:
-
Sincronización de trama ("Hard Synchronization"): Es la reinicialización
de la lógica de muestreo de bit que ocurre ante el flanco de bajada (paso
de recesivo a dominante) producido por un bit de inicio de trama.
-
Resincronización o sincronización intra-trama ("Soft Synchronization" o
“Resyncronization): Es un proceso de sincronización que ocurre en cada
flanco de bajada que se produce durante la transmisión de la trama.
52
Puede producir el alargamiento o el acortamiento de los segmentos de
fase de los que hablamos en la siguiente sección.
3.6.3. Parámetros del tiempo de bit nominal
El tiempo de bit nominal se ideó como una división del tiempo en segmentos
separados y no superpuestos. El microcontrolador dsPIC30F4013 define para
el tiempo de bit nominal un mínimo de 8 TQ y un máximo de 25 TQ, mientras
que define el mínimo tiempo de bit nominal como 1 µsegundo, correspondiente
a una tasa máxima (velocidad de transmisión máxima) en bits de 1 MHz.
Su esquema gráfico es el siguiente:
Se puede observar como el punto de muestreo del bit (sample point) se realiza
inmediatamente después del segmento Phase_Seg1 y antes de Phase_Seg2.
Las funciones y los tiempos de cada uno de los segmentos son los siguientes:
-
Segmento de sincronización (Sync_Seg): En este intervalo se espera
que se produzca cualquier cambio de recesivo a dominante en el bus.
Su duración es de 1 TQ.
-
Segmento de propagación (Prop_Seg): Está orientado a la
compensación del retardo de tiempo de la red. Este retardo es la suma
del provocado por la línea y el debido a la electrónica de la interfaz de
los controladores. El segmento puede configurarse como de 1 a 8 TQ de
duración poniendo a 1 los bits PRSEG<2:0> (CiCFG2<2:0>).
-
Segmento de fase 1 (Phase_Seg1): Este segmento está orientado a la
detección y reajuste de desfases entre nodos. Puede configurarse como
de 1 a 8 TQ de duración poniendo a 1 los bits SEG1PH<2:0>
(CiCFG2<5:3>), aunque puede alargarse en operaciones de
resincronización.
53
-
Segmento de fase 2 (Phase_Seg2): Es el encargado de retrasar la
siguiente transición de datos a transmitir. Su valor máximo puede ser
igual al segmento de fase 1 más grande o al tiempo de procesado de la
información (2 TQ). El segmento es programable desde 1TQ hasta 8 TQ
de duración poniendo a 1 los bits SEG2PH<2:0> (CiCFG2<10:8>).
Puede acortarse (nunca menos del tiempo de procesado de la
información) en las operaciones de resincronización.
Un requisito imprescindible que deben cumplir los segmentos de fase para el
ajuste de sus respectivas longitudes es el siguiente:
Prop Seg + Phase 1 Seg >= Phase 2 Seg
Y ya por último, en cuanto al cambio de longitudes por la resincronización, se
define un parámetro adicional: el ‘salto de resincronización’ (Sjw o
Resynchronization jump width) que establece el valor del salto máximo que se
pueda llegar a efectuar como producto de la resincronización. En
dsPIC30F4013 se especifica a través de los bits del registro SJW<1:0>
(CiCFG1<7:6>), con valores de entre 1 y 4 TQ, pero no mayores que
Phase_Seg2, ya que durante el proceso, el valor de este parámetro o bien será
añadido al segmento de fase 1 o bien recortado del segmento de fase 2. Es
decir, ha de cumplirse que:
Phase2 Seg > Synchronization Jump Width
54
3.7. Programación
3.7.1. MPLAB
MPLAB es un software que junto con un emulador y un programador de los
múltiples que existen en el mercado, forman un conjunto de herramientas de
desarrollo muy completo para el trabajo y/o el diseño con los
microcontroladores PIC y dsPIC desarrollados y fabricados por la empresa
“Arizona Microchip Technology” (AMT). MPLAB incorpora todas las utilidades
necesarias para la realización de cualquier proyecto y, si no se dispone de un
emulador, el programa permite editar el archivo fuente en lenguaje
ensamblador de nuestro proyecto, además de ensamblarlo y simularlo en
pantalla, pudiendo ejecutarlo posteriormente en modo paso a paso y ver como
evolucionarían de forma real tanto sus registros internos, la memoria RAM y/o
EEPROM de usuario como la memoria de programa, según se fueran
ejecutando las instrucciones. Además el entorno que se utiliza es el mismo que
si se estuviera utilizando un emulador.
Nosotros, durante el desarrollo de la asignatura, utilizaremos la versión ‘MpLab
30 v2 student edition’ (edición gratuita que podemos adquirir en la página oficial
de Microchip) la cual presenta algunas limitaciones respecto al software original
pero que para nuestro trabajo es más que suficiente ya que permite simular
directamente sobre la placa de pruebas.
Como ya hemos comentado, la utilización de MpLab requiere un emulador de
lenguajes de alto nivel, para evitar la utilización del lenguaje de ensamblador
que incluye el mismo MpLab. Nosotros utilizaremos el compilador c30.
Para conectar la placa con el ordenador
y poder simular nuestros programas,
utilizaremos el hardware y esquema de
conexiones de la fotografía.
55
3.7.2. Funciones
Esta sección contiene una lista de las funciones para CAN y un ejemplo de uso
de las funciones. El uso de las funciones, nos ahorra tener que conocer en
profundidad las estructuras del módulo CAN, ya que a través de ellas podemos
realizar acciones sin tener que cambiar manualmente los valores de los bits de
ciertos registros. Además, pueden ser puestas en práctica como macros.
Las siguientes funciones definen a toda la familia dsPIC30f, en nuestro caso el
dsPIC30F4013 solamente tiene un CAN.
•
Funciones individuales
CAN1AbortAll
CAN2AbortAll
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN1GetRXErrorCount
CAN2GetRXErrorCount
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
Esta función aborta inicialmente todas las
transmisiones pendientes.
can.h
void CAN1AbortAll(void);
void CAN2AbortAll(void);
Ninguno
Ninguno
CAN1AbortAll.c
CAN2AbortAll.c
CAN1AbortAll();
Esta función devuelve la cuenta del valor del
error al recibir.
can.h
Unsigned char CAN1GetRXErrorCount(void);
Unsigned char CAN2GetRXErrorCount(void);
Ninguno
El contenido de CIRERRCNT, que son 8 bits
Esta función devuelve el contenido de
CIRERRCNT (el bit más bajo del registro CiEC)
que indica la cuenta de errores recibidos.
CAN1GetRXErrorCount.c
CAN2GetRXErrorCount.c
unsigned char rx_error_count;
rx_error_count = CAN1GetRXErrorCount();
56
CAN1GetTXErrorCount
CAN2GetTXErrorCount
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN1sBusOff
CAN2sBusOff
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN1sRXReady
CAN2sRXReady
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Esta función devuelve la cuenta del valor del
error al enviar.
can.h
Unsigned char CAN1GetTXErrorCount(void);
Unsigned char CAN2GetTXErrorCount(void);
Ninguno
El contenido de CIRERRCNT, que son 8 bits
Esta función devuelve el contenido de
CIRERRCNT (el bit superior del registro CiEC)
que indica la cuenta de errores al transmitir.
CAN1GetTXErrorCount.c
CAN2GetTXErrorCount.c
unsigned char tx_error_count;
tx_error_count = CAN1GetTXErrorCount();
Esta función determina cuando el nodo CAN
está en modo Bus Off.
can.h
Char CAN1IsBusOff(void);
Char CAN2IsBusOff(void);
Ninguno
Si el valor de TXBO es 1, ese 1 es devuelto,
indicando que el bus está siendo cambiado a off
debido a un error de transmisión.
Si el valor de TXBO es 0, ese 0 es devuelto,
indicando que el bus no será cambiado a off.
Esta función devuelve el estado del bit TXBO
del registro CilNTF.
CAN1IsBusOff.c
CAN2IsBusOff.c
While (CAN1IsBusOff());
Esta función devuelve el estado del búfer de
recepción.
can.h
Char CAN1IsRXReady(char);
Char CAN2IsRXReady(char);
Buffno: el valor de buffno indica cual es el
estado requerido para el bufer de recepción.
Si RXFUL es 1, esto indica que el buffer de
recepción contiene un mensaje recibido.
Si RXFUL es 0, esto indica que el bufer de
recepción esta abierto para recibir un mensaje
57
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN1sRXPassive
CAN2sRXPassive
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN1sTXPassive
CAN2sTXPassive
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
nuevo.
Esta función devuelve el estado del bit RXFUL
del registro de control de recepción (control
register)
CAN1IsRXReady.c
CAN2IsRXReady.c
char rx_1_status;
rx_1_status = CAN1IsRXReady(1);
Esta función determina si la recepción se
encuentra en estado Error Pasivo.
can.h
char CAN1IsRXPassive(void);
char CAN2IsRXPassive(void);
Ninguno
Si el valor de RXEP es 1, el uno es devuelto,
indicando que el nodo pasivo previsto será un
error en recepción.
Si el valor de RXEP es 0, el cero es devuelto,
indicando que no hay error en el bus.
Esta función devuelve el estado del bit RXEP
del registro CiiNTF.
CAN1IsRXPassive.c
CAN2IsRXPassive.c
char rx_bus_status;
rx_bus_status = CAN1sRXPassive();
Esta función determina si la transmisión se
encuentra en estado Error Pasivo.
can.h
char CAN1IsTXPassive(void);
char CAN2IsTXPassive(void);
Ninguno
Si el valor de TXEP es 1, el uno es devuelto,
indicando error en el bus de transmisión y que el
bus será pasivo.
Si el valor de TXEP es 0, el cero es devuelto,
indicando que no hay error en el bus de
transmisión.
Esta función devuelve el estado del bit TXEP en
el registro CiiNTF.
CAN1IsTXPassive.c
CAN2IsTXPassive.c
char tx_bus_status;
tx_bus_status = CAN1IsTXPassive();
58
CAN1lsTXReady
CAN2lsTXReady
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN1RecieveMessage
CAN2RecieveMessage
Descripción:
Include:
Prototipo:
Argumentos:
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
Esta función devuelve que el estado del
transmisor indica si el nodo CAN esta preparado
para la próxima transmisión.
can.h
Char CAN1IsTXReady(char);
Char CAN2IsTXReady(char);
Buffno: el valor de buffno indica cual es el
estado requerido para el búfer de transmisión.
Si TXREQ es 1, devuelve un 0 indicando que el
búfer de transmisión no esta vacío.
Si TXREQ es 0, devuelve un 1 indicando que el
búfer de transmisión esta vacío, y que el
transmisor esta preparado para la próxima
transmisión.
Esta función devuelve el estado del bit TXREQ
del registro de control de transmisión (control
transmit)
CAN1IsTXReady.c
CAN2IsTXReady.c
char tx_2_status;
tx_2_status = CAN1IsTXReady(2);
Esta función lee el dato del buffer de recepción.
can.h
void CAN1RecieveMessage(unsigned char *
data, unsigned char datalen, char MsgFlag);
void CAN2RecieveMessage(unsigned char *
data, unsigned char datalen, char MsgFlag);
Data: El puntero con la localización donde los
datos recibidos deben ser almacenados.
Datalen: El número de bytes de datos
esperados.
MsFlag: El número de buffer donde el dato es
recibido. Si es 1, el dato de CiRX1B1 a
CiRX1B4 es leído. Si es 0, el dato de CiRX0B1
a CiRX0B4 es leído.
Ninguno
Esta función lee los datos recibidos dentro de la
dirección del puntero por el parámetro de
entrada data.
CAN1RecieveMessage.c
CAN2RecieveMessage.c
Unsigned char*rx_data;
CAN1RecieveMessage(rx_data, 5, 0);
59
CAN1SendMessage
CAN2SendMessage
Descripción:
Include:
Prototipo:
Esta función escribe datos para ser transmitidos
a registros de transmisión, pone la longitud de
los datos e inicia la transmisión.
can.h
void CAN1SendMessage(unsigned int sid,
unsigned long eid, unsigned char *data,
unsigned char datalen, char MsgFlag);
void CAN2SendMessage(unsigned int sid,
unsigned long eid, unsigned char *data,
unsigned char datalen, char MsgFlag);
Argumentos:
sid: El valor de 16 bits para ser escrito en
CiTXnSID.
CAN_TX_SID(x) x es el valor de SID requerido.
Sustituto de respuesta remota
CAN_SUB_REM_TX_REQ
CAN_SUB_NOR_TX_REQ
Mensaje tipo ID
CAN_TX_EID_EN
CAN_TX_EID_DIS
eid: El valor de 32 bits para ser escrito en los
registros CiTXnEID y CiTXnDLC.
CAN_TX_EID(x) x es el valor de EID requerido.
Sustituto de respuesta remota
CAN_REM_TX_REQ
CAN_NOR_TX_REQ
data: El puntero con la localización donde los
datos transmitidos serán almacenados.
datalen: Número de bytes de datos a transmitir.
MsgFlag: El número del búfer (0, 1 o 2) desde
donde los datos serán transmitidos.
Si es 1, los datos se escriben en CiTX1B1 a
CiTX1B4.
Si es 2, los datos se escriben en CiTX2B1 a
CiTX2B4.
Si es 0 (o otro valor), los datos se escriben en
CiTX0B1 a CiTX0B4.
Valores de retorno:
Comentarios:
Ninguno
Esta función escribe el valor identificador en los
registros SID y EID, los datos que serán
transmitidos en el registro TX, pone la longitud
de los datos e inicializa la transmisión por el bit
TXREQ.
CAN1SendMessage.c
CAN2SendMessage.c
CAN1SendMessage((CAN_TX_SID(1920)) &
(CAN_TX_EID_EN) &
Archivo de origen:
Ejemplo de código:
60
(CAN_SUB_NOR_TX_REQ),
(CAN_TX_EID(12344)) &
(CAN_NOR_TX_REQ),
Txdata, datalen, tx_rx_no);
CAN1SetFilter
CAN2SetFilter
Descripción:
Include:
Prototipo:
Esta función pone a 1 los valores (SID y EID)
con filtro de aceptación para el filtro
especificado.
can.h
void CAN1SetFilter(char filter_no, unsigned int
sid,
unsigned long eid);
void CAN2SetFilter(char filter_no, unsigned int
sid,
unsigned long eid);
Argumentos:
filter_no: El filtro (0, 1, 2, 3, 4 o 5) para el cual
los nuevos valores deben ser configurados.
sid: el valor de 16 bits para escribir en los
registros CiRXFnSID.
CAN_FILTER_SID(x) x es valor de SID
requerido.
Tipo de mensaje a recibir
CAN_RX_EID_EN
CAN_RX_EID_DIS
Eid: El valor de 32bits para ser escritos en los
registros CiRXFnEIDH yCiRXFnEIDL.
CAN_FILTER_EID(x) x es el valor de EID
requerido.
Valores de retorno:
Comentarios:
ninguno
Esta función escribe el valor de 16 bits de sid en
el registro CiRXFnSID y el valor de 32 bits en
CiRXFnEIDH y CiRXFnEIDL, registros
correspondientes al filtro especificado por
filter_no. El filtro 0 es tomado como falta.
CAN1SetFilter.c
CAN2SetFilter.c
CAN1SetFilter(1, CAN_FILTER_SID(7) &
CAN_RX_EID_EN, CAN_FILTER_EID(3));
Archivo de origen:
Ejemplo de código:
61
CAN1SetMask
CAN2SetMask
Descripción:
Include:
Prototipo:
Esta función pone a 1 el valor de la máscara de
aceptación (SID y EID) para la máscara
especificada.
can.h
void CAN1SetMask(char mask_no, unsigned int
sid,
unsigned long eid);
void CAN2SetMask(char mask_no, unsigned int
sid,
unsigned long eid);
Argumentos:
mask_no: La máscara (‘0’ or ‘1’) para el cual los
valores de máscara tienen que ser configurados
sid: El valor de 16 bits que se escribirán en el
registro CiRXMnSID.
CAN_MASK_SID(x) x es el valor de SID
requerido.
Match/ignore message type specified in filter
CAN_MATCH_FILTER_TYPE
CAN_IGNORE_FILTER_TYPE
Eid: El valor de 32 bits que serán escritos en los
registros CiRXMnEIDH y CiRXMnEIDL.
CAN_MASK_EID(x) x es el valor de EID
requerido.
Valores de retorno:
Comentarios:
Ninguno
Esta función escribe el valor de 16 bits de sid en
el registro CiRXFnSID y otro valor de 32 bits de
eid en CiRXFnEIDH y CiRXFnEIDL, registros
correspondientes a la máscara especificada por
mask_no. El filtro 0 es tomado como falta.
CAN1SetMask.c
CAN2SetMask.c
CAN1SetMask(1, CAN_MASK_SID(7) &
CAN_MATCH_FILTER_TYPE,
CAN_MASK_EID(3));
Archivo de origen:
Ejemplo de código:
CAN1SetOperationMode
CAN2SetOperationMode
Descripción:
Include:
Prototipo:
Argumentos:
Esta función configura el módulo CAN
can.h
void CAN1SetOperationMode(unsigned int
config);
void CAN2SetOperationMode(unsigned int
config);
Config valor de 16 bits que serán cargados en el
registro CiCTRL , la combinación de la
siguientes definiciones.
62
CAN_IDLE_CON CAN On in Idle mode
CAN_IDLE_STOP CAN Stop in Idle mode
CAN_MASTERCLOCK_1 FCAN is FCY
CAN_MASTERCLOCK_0 FCAN is 4 FCY
Modos de operación de CAN
CAN_REQ_OPERMODE_NOR
CAN_REQ_OPERMODE_DIS
CAN_REQ_OPERMODE_LOOPBK
CAN_REQ_OPERMODE_LISTENONLY
CAN_REQ_OPERMODE_CONFIG
CAN_REQ_OPERMODE_LISTENALL
CAN Capture Enable/Disable
CAN_CAPTURE_EN
CAN_CAPTURE_DIS
Valores de retorno:
Comentarios:
Ninguno
Esta función configura los siguientes bits de
CiCTRL:-CSIDL, REQOP<2:0> y CANCKS
Archivo de origen:
CAN1SetOperationMode.c
CAN2SetOperationMode.c
CAN1SetOperationMode(CAN_IDLE_STOP &
CAN_MASTERCLOCK_0 &
CAN_REQ_OPERMODE_DIS &
CAN_CAPTURE_DIS);
Ejemplo de código:
CAN1SetOperationModeNoWait
CAN2SetOperationModeNoWait
Esta función aborta las transmisiones pendientes y
Descripción:
configura el módulo CAN
can.h
Include:
void CAN1SetOperationModeNoWait(
Prototipo:
unsigned int config);
void CAN2SetOperationModeNoWait(
unsigned int config);
Config: valor de 16 bits que serán cargados en el
Argumentos:
registro CiCTRL , la combinación de la siguientes
definiciones.
CAN_IDLE_CON_NO_WAIT CAN On in Idle mode
CAN_IDLE_STOP_NO_WAIT CAN Stop in Idle
mode
CAN_MASTERCLOCK_1_NO_WAIT FCAN is FCY
CAN_MASTERCLOCK_0_NO_WAIT FCAN is 4
FCY
Modos de operación de CAN
CAN_REQ_OPERMODE_NOR_NO_WAIT
CAN_REQ_OPERMODE_DIS_NO_WAIT
63
CAN_REQ_OPERMODE_LOOPBK_NO_WAIT
CAN_REQ_OPERMODE_LISTENONLY_NO_WAIT
CAN_REQ_OPERMODE_CONFIG_NO_WAIT
CAN_REQ_OPERMODE_LISTENALL_NO_WAIT
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN Capture Enable/Disable
CAN_CAPTURE_EN_NO_WAIT
CAN_CAPTURE_DIS_NO_WAIT
Ninguno
Esta función pone a 1 el bit de aborto así aborta la
iniciación de todos las transmisiones pendientes y
configura los siguientes bits CiCTRL:-CSIDL,
REQOP<2:0> y CANCKS
CAN1SetOperationModeNoWait.c
CAN2SetOperationModeNoWait.c
CAN1SetOperationModeNoWait(CAN_IDLE_CON
&
CAN_MASTERCLOCK_1 &
CAN_REQ_OPERMODE_LISTEN &
CAN_CAPTURE_DIS_NO_WAIT);
CAN1SetRXMode
CAN2SetRXMode
Descripción:
Include:
Prototipo:
Argumentos:
Esta función configura el receptor CAN.
can.h
void CAN1SetRXMode(char buffno, unsigned int
config);
void CAN2SetRXMode(char buffno, unsigned int
config);
buffno: indica el registro de control que será
configurado.
config: El valor que será escrito en el registro
CiRXnCON , la combinación de las siguientes
definiciones.
Clear RXFUL bit
CAN_RXFUL_CLEAR
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
Double buffer enable/disable
CAN_BUF0_DBLBUFFER_EN
CAN_BUF0_DBLBUFFER_DIS
Ninguno.
Esta función configura los siguientes bits del
registro CiRXnCON:
RXRTR, RXFUL (only 0), RXM<1:0> and DBEN
CAN1SetRXMode.c
CAN2SetRXMode.c
CAN1SetRXMode(0,CAN_RXFUL_CLEAR &
CAN_BUF0_DBLBUFFER_EN);
64
CAN1SetTXMode (función)
CAN2SetTXMode
Descripción:
Include:
Prototipo:
Argumentos:
Esta función configura el transmisor del módulo
CAN.
can.h
void CAN1SetTXMode(char buffno, unsigned int
config);
void CAN2SetTXMode(char buffno, unsigned int
config);
buffno: buffno indica el registro de control que
será configurado.
config: El valor que será escrito en el registro
CiTXnCON, la combinación de las siguientes
definiciones.
Message send request
CAN_TX_REQ
CAN_TX_STOP_REQ
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
CAN1Initialize
CAN2Initialize
Descripción:
Include:
Prototipo:
Argumentos:
Message transmission priority
CAN_TX_PRIORITY_HIGH
CAN_TX_PRIORITY_HIGH_INTER
CAN_TX_PRIORITY_LOW_INTER
CAN_TX_PRIORITY_LOW
Ninguno.
Esta función configura los bits siguientes del
registro CiTXnCON:
TXRTR, TXREQ, DLC, TXPRI<1:0>
CAN1SetTXMode.c
CAN2SetTXMode.c
CAN1SetTXMode(1, CAN_TX_STOP_REQ &
CAN_TX_PRIORITY_HIGH);
Esta función configura el módulo CAN.
can.h
void CAN1Initialize(unsigned int config1,
unsigned int config2);
void CAN2Initialize(unsigned int config1,
unsigned int config2);
config1: El valor que será escrito en el registro
CiCFG1, la combinación de las siguientes
definiciones.
Sync jump width
CAN_SYNC_JUMP_WIDTH1
CAN_SYNC_JUMP_WIDTH2
CAN_SYNC_JUMP_WIDTH3
65
CAN_SYNC_JUMP_WIDTH4
Baud Rate prescaler
CAN_BAUD_PRE_SCALE(x) (((x-1) & 0x3f) |
0xC0)
config2: El valor que será escrito en el registro
CiCFG2, la combinación de las siguientes
definiciones.
CAN bus line filter selection for wake-up
CAN_WAKEUP_BY_FILTER_EN
CAN_WAKEUP_BY_FILTER_DIS
CAN propagation segment length
CAN_PROPAGATIONTIME_SEG_TQ(x)
(((x-1) & 0x7) | 0xC7F8)
CAN phase segment 1 length
CAN_PHASE_SEG1_TQ(x)
((((x-1) & 0x7) *0x8) | 0xC7C7)
CAN phase segment 2 length
CAN_PHASE_SEG2_TQ(x)
((((x-1) & 0x7) *0x100) | 0xC0FF)
CAN phase segment 2 mode
CAN_SEG2_FREE_PROG
CAN_SEG2_TIME_LIMIT_SET
Valores de retorno:
Comentarios:
Archivo de origen:
Ejemplo de código:
Sample of the CAN bus line
CAN_SAMPLE3TIMES
CAN_SAMPLE1TIME
Ninguno.
Esta función configura los bits siguientes de los
registros CiCFG1 y CiCFG2.
SJW<1:0>, BRP<5:0>, CANCAP, WAKEFIL,
SEG2PH<2:0>,
SEGPHTS, SAM, SEG1PH<2:0>, PRSEG<2:0>
CAN1Initialize.c
CAN2Initialize.c
CAN1Initialize(CAN_SYNC_JUMP_WIDTH2 &
CAN_BAUD_PRE_SCALE(2),
CAN_WAKEUP_BY_FILTER_DIS &
CAN_PHASE_SEG2_TQ(5) &
CAN_PHASE_SEG1_TQ(4) &
CAN_PROPAGATIONTIME_SEG_TQ(4) &
CAN_SEG2_FREE_PROG &
CAN_SAMPLE1TIME);
66
ConfigIntCAN1
ConfigIntCAN2
Descripción:
Include:
Prototipo:
Argumentos:
Esta función configura las interrupciones de
CAN.
can.h
void ConfigIntCAN1(unsigned int config1,
unsigned int config2);
void ConfigIntCAN2(unsigned int config1,
unsigned int config2);
config1: La información de interrupción
enable/disable se define:
Interrupt enable
CAN_INDI_INVMESS_EN
CAN_INDI_WAK_EN
CAN_INDI_ERR_EN
CAN_INDI_TXB2_EN
CAN_INDI_TXB1_EN
CAN_INDI_TXB0_EN
CAN_INDI_RXB1_EN
CAN_INDI_RXB0_EN
Interrupt disable
CAN_INDI_INVMESS_DIS
CAN_INDI_WAK_DIS
CAN_INDI_ERR_DIS
CAN_INDI_TXB2_DIS
CAN_INDI_TXB1_DIS
CAN_INDI_TXB0_DIS
CAN_INDI_RXB1_DIS
CAN_INDI_RXB0_DIS
config2: La información de Prioridad de
interrupción de CAN y Enable/disable se define:
CAN Interrupt enable/disable
CAN_INT_ENABLE
CAN_INT_DISABLE
Valores de retorno:
Comentarios:
CAN Interrupt priority
CAN_INT_PRI_0
CAN_INT_PRI_1
CAN_INT_PRI_2
CAN_INT_PRI_3
CAN_INT_PRI_4
CAN_INT_PRI_5
CAN_INT_PRI_6
CAN_INT_PRI_7
Ninguno.
Esta función configura las Interrupciones CAN.
Es el enable/disables de las interrupciones de
67
Archivo de origen:
Ejemplo de código:
CAN. Y también pone las prioridades.
ConfigIntCAN1.c
ConfigIntCAN2.c
ConfigIntCAN1(CAN_INDI_INVMESS_EN &
CAN_INDI_WAK_DIS &
CAN_INDI_ERR_DIS &
CAN_INDI_TXB2_DIS &
CAN_INDI_TXB1_DIS &
CAN_INDI_TXB0_DIS &
CAN_INDI_RXB1_DIS &
CAN_INDI_RXB0_DIS ,
CAN_INT_PRI_3 &
CAN_INT_ENABLE);
• Macros individuales
EnableIntCAN1
EnableIntCAN2
Descripción:
Include:
Argumentos:
Comentarios:
Ejemplo de código:
DisableIntCAN1
DisableIntCAN2
Descripción:
Include:
Argumentos:
Comentarios:
Ejemplo de código:
SetPriorityIntCAN1
SetPriorityIntCAN2
Descripción:
Include:
Argumentos:
Comentarios:
Ejemplo de código:
Esta macro habilita las interrupciones de CAN.
can.h
Ninguno.
Esta macro pone a 1 el bit CAN Interrupt
Enable en el registro Interrupt Enable Control.
EnableIntCAN1;
Esta macro deshabilita la interrupción CAN
can.h
Ninguno
Esta macro pone a 0 el bit de CAN Interruption
Enable del registro Interrupt Enable Control
DisableIntCAN2;
Esta macro pone prioridad a la interrupción de
CAN.
can.h
Priority
Esta macro pone los bits de interrupción de CAN
en el registro Interrupt Priority Control.
SetPriorityIntCAN1(2);
68
3.7.3. Ejemplo de aplicación de código
#define __dsPIC30F4013__
#include<p30fxxxx.h>
#include<can.h>
#define dataarray 0x1820
int main(void)
{
/* Longitud de los datos que serán transmitidos */
unsigned char datalen;
unsigned char Txdata[] =
{'M','I','C','R','O','C','H','I','P','\0'};
unsigned int TXConfig, RXConfig;
unsigned long MaskID,MessageID;
char FilterNo,tx_rx_no;
unsigned char * datareceived = (unsigned char *)
dataarray; /* Holds the data received */
/* pone la respuesta en el modo de configuración */
CAN1SetOperationMode(CAN_IDLE_CON &
CAN_MASTERCLOCK_1 &
CAN_REQ_OPERMODE_CONFIG &
CAN_CAPTURE_DIS);
while(C1CTRLbits.OPMODE <=3);
/* Carga el registro de configuración */
CAN1Initialize(CAN_SYNC_JUMP_WIDTH2 &
CAN_BAUD_PRE_SCALE(2),
CAN_WAKEUP_BY_FILTER_DIS &
CAN_PHASE_SEG2_TQ(5) &
CAN_PHASE_SEG1_TQ(4) &
CAN_PROPAGATIONTIME_SEG_TQ(4) &
CAN_SEG2_FREE_PROG &
CAN_SAMPLE1TIME);
/* Carga el registro de filtro de Aceptación*/
FilterNo = 0;
CAN1SetFilter(FilterNo, CAN_FILTER_SID(1920) &
CAN_RX_EID_EN, CAN_FILTER_EID(12345));
/* Carga el registro de filtro de Máscara */
CAN1SetMask(FilterNo, CAN_MASK_SID(1920) &
CAN_MATCH_FILTER_TYPE, CAN_MASK_EID(12344));
/* Pone el modo de transmisor y receptor */
tx_rx_no = 0;
CAN1SetTXMode(tx_rx_no,
CAN_TX_STOP_REQ &
CAN_TX_PRIORITY_HIGH );
CAN1SetRXMode(tx_rx_no,
CAN_RXFUL_CLEAR &
CAN_BUF0_DBLBUFFER_EN);
/* Carga el mensaje ID , datos dentro del buffer de transmisión y pone el
bit de respuesta de transmisión */
69
datalen = 8;
CAN1SendMessage((CAN_TX_SID(1920)) & CAN_TX_EID_EN &
CAN_SUB_NOR_TX_REQ,
(CAN_TX_EID(12344)) & CAN_NOR_TX_REQ,
Txdata,datalen,tx_rx_no);
/* Pone la respuesta en modo Loopback */
CAN1SetOperationMode(CAN_IDLE_CON & CAN_CAPTURE_DIS &
CAN_MASTERCLOCK_1 &
CAN_REQ_OPERMODE_LOOPBK);
while(C1CTRLbits.OPMODE !=2);
/* Espera que el mensaje se transmita completamente */
while(!CAN1IsTXReady(0))
/* Espera que el buffer de recepción contenga el mensaje válido */
while(!CAN1IsRXReady(0));
/* Lee los datos recibidos del buffer de recepción*/
CAN1ReceiveMessage(datareceived, datalen, tx_rx_no);
while(1);
return 0;
}
70
4. ANEXO:
Dispositivos CAN
71
4. Dispositivos CAN
Evidentemente enumerar todos los dispositivos que podemos conectar a CAN
nos es imposible, pero sí podemos mostrar algunos de estos productos, para
comprobar la versatilidad y el gran número de estos que se encuentran en el
mercado. Nos centraremos principalmente en los sensores, ya que nos van a
ser más útiles a la hora de realizar nuestro trabajo en el dsPIC30F4013.
SENSORES
Sensor digital de presión “HDA 4000 CAN”
Características técnicas:
-
Interfaz CAN
Rango de medida: presiones
de 40 bar a 600 bar.
Precisión ≤ ± 0.25 %
Rango de temperatura
soportable: –25 °C a +85 °C
Tensión: de 10 a 35 VDC
Tasa de transmisión de 10kbit
a 1Mbit (configurable)
Sensores MDT CAN + IDA CAN
- La señal digital tiene una
resolución de 13 bits sobre los
dos cables del bus CAN.
- El tiempo de medida y de
conversión de la señal de
presión es de 20 milisegundos,
más que suficiente para la
mayoría de las aplicaciones
industriales.
- El cableado interno de CAN,
supervisa de forma automática
que las funciones del
transductor de presión sean las
correctas, y envía una señal de
alarma en caso contrario.
72
Codificador de eje rotatorio 5860
Características técnicas:
-
Todos los valores obtenidos son
enviados a través del interfaz
CAN.
Parámetros programables vía
CAN
Rotación: 6000 rpm.
Rango de temperatura
soportable: -20 °C a +85 °C
Tensión: 10 a 30 VDC
Codificador magnético ATM 60
Características técnicas:
-
Interfaz Bus CAN de alta
velocidad
8192 medidas por vuelta
Octoacoplador para aislar del
bus la corriente continua.
Alta resistencia a vibraciones y
golpes
Familia de inclinómetros AnguSens
Características técnicas:
-
Todos los valores obtenidos son
enviados a través del interfaz
CAN.
Parámetros programables vía
CAN
Rango de medida: ±15° o ± 30°
Precisión: hasta 0.001°
Máximo dos ejes de medida.
73
Sensores de compactación ASC (para camiones y maquinaria pesada)
-
-
Utilizado para medir lo compacto de un terreno
Un sensor de aceleración empotrado mide la reacción del tambor,
mientras que un microregulador calcula la frecuencia de vibración y
otros parámetros que son transferidos vía CAN, por ejemplo a un
display.
Memoria EEPROM disponible, con diccionario CAN.
Rango de medida: ±41 g
Temperatura soportable: -40°C a +85°C
Tensión: 8V a 32V DC
Consumo: 80mA a 12V aprox.
Transductores BTL5-H1
-
Transmite las medidas de posición y velocidad del sistema de control
obtenidas a otro nodo a través del Bus CAN.
Los hay disponibles de tres formas, según el transductor que lleven: un
imán de posición, dos imanes de posición, o FMM (modo magnético
flexible) con de 1 a 4 imanes de posición.
Gran precisión: 5 µm para la posición y 0.1 mm/s para la velocidad.
Rango de temperatura soportable: de -40°C a +85°C
Muy lineales e insensibles a las vibraciones, los golpes y los ruidos.
74
Familia de sensores µCAN
Además de una gran cantidad de sensores, podemos encontrar esta familia de
módulos para sensores µCAN, que esta especialmente diseñada para los
fabricantes de sensores que quieran añadir una interfaz CAN a estos, ya sean
sensores de tensión, de corriente, presión, calor, esfuerzo…
Todos estos módulos tienen un rango de temperatura soportable que va de 40 °C a + 85 °C y un rango de tensión de 8 V a 60 V de corriente continua.
Otro tipo de dispositivos
ESCÁNERES
75
ACTUADORES
DATALOGGERS
MÓDULOS DE ENTRADA-SALIDA
76
GATEWAYS, CONVERSORES Y BRIDGES
CAN - USB
CAN - ETHERNET
CAN-RS232
CAN-CBM-DP / CAN-DP
77
CAN-Wireless
CAN-GSM
CAN-GPRS
CAN-Bluetooth
REPETIDORES
78
5. BIBLIOGRAFÍA
79
Bibliografía básica:
1. INTRODUCCIÓN
www.can-cia.org/can/
www.can-cia.org/can/protocol/history/history.html
www.can-cia.org/applications/cankingdom/
www.serconet.com/usr/laureanog/HPV1B_31.HTM
www.semiconductors.bosch.de/de/20/can/index.asp
www.can.bosch.com
http://es.wikipedia.org/wiki/CAN_bus
www.canbus.galeon.com/electronica/canbus.htm
www.ihs.com.es/
2. TRANSMISIÓN DE DATOS
http://www.kvaser.com/index.htm
www.unavarra.es
3. CAN DEL MICRO dsPIC30F4013
www.port.de/pdf/CAN_Bit_Timing.pdf
http://cabierta.uchile.cl/revista/19/articulos/pdf/edu4.doc
www.microchip.com
4. ANEXO: Dispositivos CAN
http://www.can-cia.org/products/pg2005/html/index.htm
http://www.canusb.com/index.htm
http://www.ixxat.de/
80