Configuración de Can CANConfigure

Configuración de Can CANConfigure Arquitectura del Modulo CAN. Buffer de recepción Introducción. La función CANConfigure configura el módulo CAN

0 downloads 197 Views 1MB Size

Recommend Stories


Diario de actividades de Can Rubi
Diario de actividades de Can Rubi Antecedentes Generales Es una finca ubicada en el parque natural de Sant Llorenç de Munt i Llobac en la provincia de

Centre Cívic Can Verdaguer AGENDA DE TALLERS
Centre Cívic Can Verdaguer AGENDA DE TALLERS Abril - Juny 2016 INSCRIPCIONS índex TALLERS pàg. 4 Monogràfics pàg. 4 Dansa pàg. 6 Salut i es

Story Transcript

Configuración de Can CANConfigure

Arquitectura del Modulo CAN. Buffer de recepción

Introducción. La función CANConfigure configura el módulo CAN

para utilizar el búfer de recepción RXB0. Los parámetros que tenemos que pasar a la función

son:  Baud Rate .  Acceptance Mask (RXM0).  Acceptance Filter 0 (RXF0).  Acceptance Filter 1 (RXF1).

Parámetros. TBaudRate: Tipo enumerado, utilizado en la funcion

CAN1Initialize, que puede tomar los siguientes valores:  BAUDRATE_1M, BAUDRATE_500K, BAUDRATE_50K,

BAUDRATE_20K, BAUDRATE_10K

mask0: Número entero que se utiliza en la función

CAN1SetMask, donde se determina a qué bits del mensaje se tiene que aplicar el filtro.

Parámetros. SIDfilter0: Tipo entero, utilizado en la función

CAN1SetFilter, donde se carga el registro de filtro de aceptación 0 (RXF0). SIDfilter1: Tipo entero, utilizado en la función

CAN1SetFilter, donde se carga el registro de filtro de aceptación 1 (RXF1).

Resumen del Funcionamiento. • Solicitar el modo de configuración. • Inicializar el módulo. • Escribir los registros (de configuración, los filtros y las máscaras de aceptación). • Solicitar el modo Normal.

Funcionamiento. • Configuración: Cuando estamos en modo de configuración el módulo CAN no transmite ni recibe – Se inicializan los contadores de errores. – Los flags de interrupción no cambian de valor. – El programador tiene acceso a registros que no son accesibles en otros modos. – La función CAN1SetOperationMode() es la que se encarga de solicitar el modo de configuración.

Funcionamiento. Inicialización: El módulo CAN se puede inicializar solo cuando se

encuentra en modo de configuración y la inicialización se tiene que realizar antes de que el módulo sea activado. La tarea de inicialización es realizada por la función CAN1Initialize().

Funcionamiento. Escritura de registros:

Una vez realizada la inicialización ya se pueden escribir los registros de configuración, las máscaras y los filtros de aceptación. Esto se realiza en las siguientes funciones: CAN1SetFilter (con uiFilter = 0). CAN1SetFilter (con uiFilter = 1). CAN1SetMask CAN1SetTXMode

Funcionamiento. CAN1SetRXMode. Finalmente solicitamos el modo Normal y esperamos

que el módulo sea listo para trabajar. (CAN1SetOperationMode)

Resumen. 1. CAN1SetOperationMode – solicitar el modo de

configuración. 2. Se espera que el módulo entre en modo de configuración (bucle). 3. CAN1Initialize. Todos los contadores son inicializados y todos los registros tienen sus valores por defecto. 4. CAN1SetFilter con el uiFilter =0.

Resumen. 5. 6. 7. 8. 9.

CAN1SetFilter con el uiFilter =1. CAN1SetMask. CAN1SetTXMode. CAN1SetRXMode. CAN1SetOperationMode – Se solicita el modo normal.

CANInitialize

const unsigned int mat [5][4]={{0x0000,4,5,5}, {0x0001,4,5,5}, {0x001C,3,3,3}, {0x0021,7,7,7}, {0x003A,8,8,8} };

// 1 Mbps - BRG = 0 // 500 kbps - BRG = 1 // 50 kbps - BRG = 2 // 20 kbps - BRG = 3 // 10 kbps - BRG = 4

//! TBaudrate es un tipo enumerado que puede tomar los siguientes valores: //! BAUDRATE_1M, BAUDRATE_500k, BAUDRATE_50k, BAUDRATE_20k, BAUDRATE_10k void CANConfigure(TBaudrate baudrate, //!< CAN Baud Raute unsigned int mask0, //!< Acceptance Mask (RXM0) unsigned int SIDfilter0, //!< Acceptance Filter 0 (RXF0) unsigned int SIDfilter1 //!< Acceptance Filter 1 (RXF1) ) { [...] CAN1Initialize( CAN_SYNC_JUMP_WIDTH1 & mat[baudrate][0] , CAN_WAKEUP_BY_FILTER_DIS & CAN_PROPAGATIONTIME_SEG_TQ(mat[baudrate][1]) & CAN_PHASE_SEG1_TQ(mat[baudrate][2]) & CAN_PHASE_SEG2_TQ(mat[baudrate][3]) & CAN_SEG2_FREE_PROG & CAN_SAMPLE3TIMES); [...] }

Esta función configura los registros CiFG1 y CiFG2 de tal manera que todos los nodos CAN tengan el mismo bit rate (velocidad de transmisión), debido a que cada fabricante no pone el mismo oscilador es sus controladores. De esta forma, con el valor de BAUDRATE que nos proporciona CANCONFIGURE podemos conseguir el mismo bit rate en todos los nodos.

void CAN1Initialize(unsigned int config1, unsigned int config2) {

C1CFG1 = config1; /* configure SJW and BRP */ C1CFG2 = config2; /* configure PHSEG2 and PHSEG1 and PROPSEG */ }

Para conseguir la misma velocidad vamos a tocar los siguientes valores: • Synchronization Jump Width • Baud Rate Prescaler • Phase Segments • Length Determination of Phase Segment 2 • Sample Point • Propagation Segment Bits







Bit Timing Se divide en segmentos de tiempos más pequeños llamados TQ(Time Quanta), para que se sincronicen todos los nodos, pueden haber un mínimo de 8 TQ hasta un máximo de 25 TQ . El tamaño de TQ viene dado por el Baut Rate.

Baut Rate Prescaler Es un valor programable que va desde 1 hasta 64 BRP(CiCFG1). Propagation Segment Esta parte del Bit Timing es usada para compensar el retardo físcio de la red y el retardo interno de los nodos. Se pueden programar de 1 TQ hasta 8 TQ PRESEG(CiCFG).



Phase Segments Los segmentos de fase son usados para localizar el bit recibido entre el tiempo de transmisión de bit. El Sampling point está entre Phase1 Segment y Phase2 Segment. Estos segmentos son alargados o acortados por la resincronización. El final de la Phase1 Segment determina el sampling point entre el periodo de bit. El segmento es programable desde 1 TQ hasta 8 TQ. Phase2 Segment provee el retardo hasta la siguiente transmisión de datos. El segmento es programable desde 1 TQ hasta 8 TQ. El Phase1 Segment es inicializado poniendo los bits SEG1PH(CiCFG2), Phase2 Segment es inicializado poniendo SEG2PH(CiCFG2). Para los valores que les demos a Phase1 Segment y Phase2 Segment debe cumplirse: ProgSeg + Phase1 Segment >= Phase2 Segment





Sample Point El punto de muestreo (Sample Point) es el momento donde la señal del bus es leída e interpretada como el valor del respectivo bit. La localización está al final de la Phase1 Segment. SAM(CiCFG). Synchronization Jump Width Cuando se detecta una señal en los datos de transmisión, se compara la localización de la señal con el tiempo previsto en el que tenía que recibirse. El circuito ajsuta los valores de la fase 1 (Phase1 Segmente) y la fase 2 (Phase2 Segment). SJW(CiCFG). Hay dos tipos de sincronización ●



Hard Synchronization Esta sincronización solo se realiza cuando se pasa de un bit recesivo a uno dominante durante el comienzo del mensaje. Re-synchronization ● Como resultado de la resincronización, la Phase1 Segment será alargado o la Phase2 Segment será acortado según donde se reciba la señal.

Configuración del registro CiCFG1



CiCFG = config1; config1 = CAN_SYNCJUMP_WIDTH! & mat[badrate][0] = 0x003F & 0x0021 = 0x0021

Hex Bin Dec 0x0021 -> 10001 -> 33 bit 15-8 Unimplemented: Read as '0' bit 7-6 SJW: Synchronizated Jump Width bits 11 = Synchronizated jump width time is 4 x TQ 10 = Synchronizated jump width time is 3 x TQ 01 = Synchronizated jump width time is 2 x TQ 00 = Synchronizated jump width time is 1 x TQ bit 5-0 BRP: Baud Rate Prescaler bits 11 1111 = TQ = 2 x (BRP + 1)/FCAN = 128/FCAN . . .

10 0001 = TQ = 2 x (BRP + 1)/FCAN = 2 x 34/FCAN = 68/FCAN . . . 00 0000= TQ = 2 x (BRP + 1)/FCAN = 2/FCAN



Configuración del registro CiCFG2

CiCFG2 = config2 config2 = CAN_WAKEUP_BY_FILTER_DIS & = 0x07FF CAN_PROPAGATIONTIME_SEG_TQ(mat[baudrate][1]) & = 0x47FE CAN_PHASE_SEG1_TQ(mat[baudrate][2]) & = 0x47F7 CAN_PHASE_SEG2_TQ(mat[baudrate][3]) & = 0x46FF CAN_SEG2_FREE_PROG & = 0x47FF CAN_SAMPLE3TIMES = 0x47FF config2 = 0x06F6 Hex Bin Dec 0x06F6 = 11011110110 = 1782

bit 15 Unimplemented: Read as ‘0’ bit 14 WAKFIL: Select CAN bus Line Filter for Wake-up bit 1 = Use CAN bus line filter for wake-up 0 = CAN bus line filter is not used for wake-up bit 13-11 Unimplemented: Read as ‘0’ bit 10-8 SEG2PH: Phase Buffer Segment 2 bits 111 = length is 8 x TQ 110 = length is 7 x TQ . . 000 = length is 1 x TQ bit 7 SEG2PHTS: Phase Segment 2 Time Select bit 1 = Freely programmable 0 = Maximum of SEG1PH or information processing time (3 TQ’s), whichever is greater

bit 6 SAM: Sample of the CAN bus Line bit 1 = Bus line is sampled three times at the sample point 0 = Bus line is sampled once at the sample point bit 5-3 SEG1PH: Phase Buffer Segment 1 bits 111 = length is 8 x TQ 110 = length is 7 x TQ . . 000 = length is 1 x TQ bit 2-0 PRSEG: Propagation Time Segment bits 111 = length is 8 x TQ 110 = length is 7 x TQ . . 000 = length is 1 x TQ

CAN1SetOperationMode

CAN1SetOperationMode • CAN1SetOperationMode( • CAN_IDLE_CON & • CAN_CAPTURE_DIS & • CAN_MASTERCLOCK_1 & • CAN_REQ_OPERMODE_NOR);

C1CTRL

C1CTRL: CANCAP • CANCAP: CAN Message Receive Capture Enable bit •1 = Enable CAN capture •0 = Disable CAN capture •CAN_CAPTURE_EN •CAN_CAPTURE_DIS

C1CTRL: CSIDL •CSIDL: Stop in Idle Mode bit •1 = Discontinue CAN module operation when device enters Idle mode •0 = Continue CAN module operation in Idle mode •CAN_IDLE_STOP •CAN_IDLE_CON •Si esta en 1 para la operación en Idle Mode, y hace lo mismo que el Sleep Mode. Para oscilador y todos los clocks del sistema y solo despierta con la interrupción WAKIE.

C1CTRL: CANCKS •CANCKS: CAN Master Clock Select bit •1 = FCAN clock is FCY •0 = FCAN clock is 4 FCY •CAN_MASTERCLOCK_1 •CAN_MASTERCLOCK_0

C1CTRL: CANCKS

C1CTRL: REQOP •REQOP: Request Operation Mode bits •111 = Set Listen All Messages mode •110 = Reserved •101 = Reserved •100 = Set Configuration mode •011 = Set Listen Only mode •010 = Set Loopback mode •001 = Set Disable mode •000 = Set Normal Operation mode

C1CTRL: REQOP •CAN_REQ_OPERMODE_NOR •CAN_REQ_OPERMODE_DIS •CAN_REQ_OPERMODE_LOOPBK •CAN_REQ_OPERMODE_LISTENONLY • •CAN_REQ_OPERMODE_CONFIG •CAN_REQ_OPERMODE_LISTENALL

C1CTRL: REQOP • • •







Set Normal Operation Mode: funciona normalmente. Set Disable Mode: ni recibe ni transmite. Set Loopback Mode: se comunica con él mismo, conectándose la entrada y la salida. Set Listen Only Mode: solo recibe y no tiene flags de error, los contadores se desactivan. Set Configuration Mode: ni recibe ni transmite, el programador tiene acceso a la configuración de los registros lo cuales estan restringidos en el resto de modos. Set Listen All Messages Mode: recibe todos los mensajes, sin filtros.

Configuración del filtrado de mensajes: CANSetFilter y CANSetMask

CANSetFilter y CANSetMask Las llamadas a las funciones CAN1SetFilter y CAN1SetMask las encontramos dentro de la configuración, en la función CANConfigure. Éstas son las llamadas al set filter: - CAN1SetFilter(uiFilter, CAN_FILTER_SID(SIDfilter0) & CAN_RX_EID_DIS, 0); - CAN1SetFilter(uiFilter, CAN_FILTER_SID(SIDfilter1) & CAN_RX_EID_DIS, 0); Donde el uiFilter es 0 y 1, respectivamente. Y la del set mask: - CAN1SetMask(0, CAN_MASK_SID(mask0) & CAN_MATCH_FILTER_TYPE,0);

Máscaras y filtros

Se puede observar que este módulo CAN dispone de 2 máscaras y 6 filtros.

Aceptación de mensajes

La aceptación de un mensaje se realizará en base a los valores de la tabla anterior. Si todos los bits del identificador son aceptados, entonces el mensaje será aceptado.

Registros del filtro y la máscara

Registros de la máscara y el filtro EXIDE: Extended Identifier Enable Bit MIDE: Identifier Mode Selection Bit

Si MIDE = 0, el EXIDE es don't care. Si MIDE = 1, entonces miramos el valor del EXIDE: si vale 1, habilitamos el filtro para el id. extendido. En cambio, si vale 0, habilitamos el filtro para el id. estándar.

Funcionamiento del CANSetMask void CAN1SetMask(char mask_no, unsigned int sid, unsigned long eid); El primer parámetro indica la máscara que vamos a configurar. El segundo, indica el valor de la máscara para un identificador estándar. Y, por último, el tercer parámetro indica el valor para un identificador extendido. Un id. estándar en CAN consta de 11 bits, mientras que el id. extendido es de 29 bits. Estos son los tres registros de los que consta la máscara: C1RXMiSID = sid; //11 bits C1RXMiEIDH = uppereid; //12 bits; uppereid = eid >>16 C1RXMiEIDL = eid; //6 bits

Funcionamiento del CANSetFilter void CAN1SetFilter(char filter_no, unsigned int sid, unsigned long eid); El primer parámetro indica el filtro que vamos a configurar. El segundo, indica el valor del filtro para un id. estándar. Y el tercer parámetro indica el valor para un identificador extendido. Los tres registros del filtro son: C1RXFiSID = sid; // 11 bits C1RXFiEIDH = uppereid; // 12 bits; uppereid = eid >>16 C1RXFiEIDL = eid; // 6 bits

En Uiblib.c, las llamadas a las funciones son las siguientes: CAN1SetMask(0, CAN_MASK_SID(mask0) & CAN_MATCH_FILTER_TYPE,0); CAN1SetFilter(uiFilter, CAN_FILTER_SID(SIDfilter0) & CAN_RX_EID_DIS, 0); Hay otra llamada a esta función, pero pasándole por parámetro al Can Filter el SIDfilter1, que vale lo mismo. - El CAN_FILTER_SID(x) tiene el mismo valor que el CAN_MASK_SID(x), que es: ( ((x & 0x07C0)

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.