STlogo

TN1348 SPC58x Configuración de filtros CAN e CAN-FD

produto

Introdución

Esta nota técnica describe como configurar filtros de aceptación para controladores CAN integrados en microcontroladores de automoción SPC58x. O documento describe as configuracións do rexistro e proporciona algúns exemplosample para acelerar a configuración do filtro. Estas configuracións pódense adoptar para todos os microcontroladores desta familia con pequenas variacións. O exampOs ficheiros deste documento baséanse na MCU de 584 bits SPC58Cx/SPC32ECx.

CAN máisview

SPC584Cx/SPC58ECx ten oito instancias CAN integradas en dous subsistemas diferentes como se documenta no manual de referencia do dispositivo Sección Apéndice A Documentos de referencia.
Todos os controladores CAN do mesmo subsistema compartirán recursos como memoria RAM, reloxo, etc. Cada subsistema CAN está constituído polos seguintes bloques principais:

  • Núcleos CAN modulares: pódese acceder aos rexistros do módulo CAN mediante a Interface Generic Slave (GSI). O módulo GSI periférico actúa como solicitude de cada mestre.
  • Árbitro CAN-RAM: é unha lóxica adicional de arbitraxe entre as solicitudes de acceso á RAM por parte dos distintos controladores CAN.
  • SRAM: o subsistema CAN interactuará cunha RAM externa usando esta interface, é a SRAM.
  • Controlador ECC: contén a lóxica para calcular e validar o código de corrección na memoria SRAM.

Para coñecer a interface SRAM e a organización da memoria, consulte o manual de referencia do dispositivo Sección Apéndice A Documentos de referencia.

Introdución ao filtrado

A lóxica de filtro CAN permítelle configurar os filtros de varias maneiras. Por example, as mensaxes que pasan o filtrado de aceptación pódense almacenar en Rx FIFO (0 ou 1) ou en búfers de rx dedicados. Cada filtro pódese configurar como un filtro de aceptación ou rexeitamento e tamén se pode activar ou desactivar. Para o filtro de aceptación, cada lista de filtros realízase desde o elemento #0 ata o primeiro elemento coincidente da lista de filtros. Antes de usar filtros é obrigatorio configurar o enderezo de inicio e os números do filtro para reservar parte da memoria RAM da mensaxe. A figura seguinte mostra a view do mapa de memoria compartida e dos rexistros (de aí os enderezos de partida de cada sección).

Figura 1. Configuración da RAM de mensaxes example

Mensaxe de inicialización da RAM

Antes de utilizar calquera filtro, é obrigatorio configurar a área RAM correspondente das mensaxes nas que se almacenarán. Para iso, a aplicación de software debe escribir a compensación (en palabras) a partir do enderezo base da RAM da mensaxe de cada área de filtro. Debe configurarse o número de filtros para cada área, para que o controlador poida comprender onde remata cada área de memoria de filtro relacionada Neste documento, como ex.ampos catro filtros, configuraranse para os identificadores estándar (11 bits) e catro filtros para os identificadores estendidos (29 bits), polo que, reserva unha parte da RAM de mensaxes para almacenar filtros de 11 bits e outra para filtros de 29 bits. Para configurar o enderezo de inicio da área de filtro de identificación estándar, o software debe escribir o campo FLSSA do rexistro SIDFC (rexistro de configuración de filtro de identificación estándar). Para filtros de ID estendidos é necesario escribir o campo FLESA do rexistro XIDFC (rexistro de configuración de filtros de ID estendido). Os campos FLSSA e FLESA deben conter a compensación de memoria "en palabras" do enderezo base da RAM da mensaxe. Esta aplicación configura catro filtros estándar con compensación cero e catro filtros estendidos

Para a configuración de filtro estándar:

  • FLSSA = 0x0: a compensación respecto ao enderezo base da RAM da mensaxe é cero, polo que a área comeza ao comezo da RAM da mensaxe.
  • LSS = 4: este é o número de filtros a configurar. Cada filtro está composto por unha palabra de 32 bits.
    Nesta configuración unha parte da memoria que comeza desde cero e ten un tamaño de catro palabras.

Nota: o controlador CAN non ten ningún mecanismo de control para configurar a RAM de mensaxes, isto significa que o programador debe ter coidado de non solapar as áreas de RAM configuradas. A seguinte figura mostra como configurar unha parte da memoria para almacenar filtros de identificación estendidos.

Para configurar a área RAM para almacenar filtros estendidos é necesario programar os seguintes valores nos campos FLESA e LSE.

  • FLESA = 0x04: a compensación en palabras respecto ao enderezo base da RAM da mensaxe. Isto porque na zona de filtros configurados anteriormente reservouse 0x04 palabras para filtros de ID estándar e entón a compensación mínima utilizable é 0x04.
  • LSE = 4: este é o número de filtros a configurar. Para o ID estendido, un filtro está composto por "dous" palabras de 32 bits.

Nesta configuración, unha parte da memoria que comeza a partir do offset 0x04 (palabras) que ten un tamaño de oito palabras (catro filtros de dúas palabras). Polo tanto, a compensación mínima para a seguinte área de memoria configurable é 0x0C palabras. Todas as seccións da RAM da mensaxe deben configurarse tendo en conta o número e tamaño dos elementos que se almacenarán na sección sen que se superpoñan ningunha sección.
Nota: para converter unha compensación de palabras nunha compensación de bytes, é necesario multiplicar o valor da palabra por catro.

Example de filtros de identificación estándar

Despois de configurar a RAM de mensaxes, pode configurar os filtros do dispositivo.
Cada elemento de filtro pódese configurar como:

  • Filtro de rango
  • Filtro de dobre ID
  • Filtro clásico
  • Filtro para búfer de recepción dedicado (filtro de ID único)

A seguinte figura mostra como configurar catro tipos diferentes de filtros para identificadores estándar (identificadores de 11 bits). Use o seguinte rexistro de elementos de filtro para a ID ESTÁNDAR.

Filtro de rango para RX FIFO0

Debaixo dun examparchivo de filtrado para almacenar as mensaxes con identificadores no rango [0x16 , 0xF6] no Receive FIFO 0.
Valor de rexistro (HEX): 0x081600F6
Valor de rexistro (BIN): 00 001 00000010110 (00000) 00011110110

Nota: en todos os exampficheiros proporcionados neste documento, os bits entre corchetes mantéñense no valor predeterminado. Valores dos campos:

  • SFT -> `00` -> Filtro de rango de SFID1 a SFID2
  • SFEC -> `001` -> Almacenar en Rx FIFO 0 se o filtro coincide
  • SFID1 -> `00000010110` -> Primeiro ID do intervalo de elementos de filtro de ID estándar (0x16)
  • SFID2 -> `00011110110` -> Segundo ID do intervalo de elementos de filtro de ID estándar (0xF6)
Doble filtro para RX FIFO1

Abaixo está un exampficheiro dun filtro de dobre ID para almacenar os identificadores de mensaxes 0 x 0A ou 0 x FF no FIFO 1.
Valor de rexistro (HEX): 0x500A00FF
Valor de rexistro (BIN): 01 010 00000001010 (00000) 00011111111
Valores dos campos:

  • SFT -> `01` -> Filtro de identificación dual para SFID1 ou SFID2
  • SFEC -> `010` -> Almacenar en Rx FIFO 1 se o filtro coincide
  • SFID1 -> `00000001010` -> Primeiro ID do elemento de filtro de ID dual estándar
  • SFID2 -> `00011111111` -> Segundo ID do elemento de filtro de ID dual estándar
Filtrado de búfer dedicado a Rx

Abaixo está un exampli para almacenar mensaxes con identificación 0 x 7F0 no búfer de rx dedicado #0.
Usando un búfer dedicado, é posible filtrar só un ID de mensaxe e ese é o escrito no campo SFID1.
Valor de rexistro (HEX): 0x3FF00000
Valor de rexistro (BIN): 00 111 11111110000 (00000) 00 (000) 000000

  • SFT -> `00` -> este valor non é importante porque o filtrado para almacenar no BUFFER RX dedicado e neste caso o valor SFT é ignorado (consulte a descrición do campo SFEC caso `111`)
  • SFEC -> `111` -> Almacenar no búfer rx dedicado se o filtro coincide
  • SFID1 -> `11111110000` -> ID estándar que aceptará o filtro (0x7F0)
  • SFID2[10, 9] -> `00` -> este campo decide se a mensaxe recibida se almacena nun buffer de rx ou se trata como mensaxe A, B ou C da secuencia de mensaxes de depuración. Neste caso, a aplicación de software quere almacenar a mensaxe nun buffer rx.
  • SFID2[0,5] -> `000000` → índice do buffer rx dedicado onde se almacenará a mensaxe correspondente (se se configurou N buffer rx dedicado, este índice pode estar no rango [0, N -1]) .Neste caso, a mensaxe almacénase no búfer dedicado #0.
Filtro clásico para RX FIFO0

Este example mostra como almacenar as mensaxes con identificador no rango [0x688, 0x68F] no RX FIFO 0. Para un filtro clásico, debe definirse un par Identificador/Máscara. O identificador debe escribirse en SFID1 e a máscara nos campos SFID2 do elemento de filtro. Nun filtro clásico, as mensaxes de ID que pasan polo filtro obtéñense aplicando a máscara ao identificador do seguinte xeito:

  • este é o significado dos bits de filtro -> 1 = debe coincidir (0 = non importa);
  • tendo un filtro cunha máscara formada por todos os "1", só pasará un identificador ao filtro (o que está escrito no campo SFID1) mentres que un filtro cunha máscara formada por todos os "0" pasarán todos os identificadores. o filtro.

Obviamente, estes son os filtros máis sinxelos. A continuación móstrase unha explicación de como organizar un filtro de intervalo para o ID estándar no intervalo [0x688, 0x68F] que almacena as mensaxes recibidas en RX FIFO 0. Este é un filtro de mensaxe estándar, polo que daremos valores a SFID1 = Identificador e SFID2 = Máscara.
Valor de rexistro (HEX): 0x8E8B07F8
Valor de rexistro (BIN): 10 001 11010001011 00000 11111111000

  • SFT -> `10` -> Filtro clásico: SFID1 = filtro, SFID2 = máscara
  • SFEC -> `001` -> Almacenar en Rx FIFO 0 se o filtro coincide
  • SFID1 = 110 1000 1011 (Identificador0x68B)
  • SFID2 = 111 1111 1000 (Máscara0x7F8)

Aplicando a máscara ao identificador (un pouco) co significado do bit de máscara (1 = debe coincidir con 0 = non importa) atopamos o seguinte filtro de rango onde o símbolo `X` significa cero ou un.

Filtro = 110 1000 1XXX

Entón, todas as mensaxes estándar no intervalo [0x688, 0x68F] pasarán polo filtro.

Configuración de filtros de ID ampliados

Tamén se poden implementar os mesmos tipos de filtros para os identificadores estendidos (identificadores de 29 bits).

Filtro de rango extendido para RX FIFO0

Neste example, este filtro almacenará mensaxes con identificadores no intervalo [0xFFFFF, 0x1FFFFFFF] en FIFO 0.
Debaixo dos valores do rexistro:

  • Valor de rexistro F0 (HEX): 0x200FFFFF
  • Valor de rexistro F1 (HEX): 0xDFFFFFFF
  • Valor de rexistro FO (BIN): 001 00000000011111111111111111111
  • Valor de rexistro F1 (BIN): 11 (0) 11111111111111111111111111111

Valores dos campos:

  • EFEC -> `001` -> Almacenar en Rx FIFO 0 se o filtro coincide
  • EFID1 ->`00000000011111111111111111111` -> Primeiro ID do elemento de filtro ID estendido
    intervalo (0xFFFFF)
  • EFT -> `11` -> Filtro de rango de SFID1 a SFID2
  • SFID2 ->`11111111111111111111111111111` -> Segundo ID do intervalo de elementos de filtro de ID estándar (0x1FFFFFFF)
Filtro de dobre ID para FIFO 1

Neste exampo filtro de dobre ID almacenará mensaxes con identificadores 0xAAAAA ou 0xBBBBB en FIFO 1.

  • Valor de rexistro F0 (HEX): 0x400AAAAA
  • Valor de rexistro F1 (HEX): 0x400BBBBB
  • Valor de rexistro FO (BIN): 010 000000000 10101010101010101010
  • Valor de rexistro F1 (BIN): 01 (0) 00000000010111011101110111011

Valores dos campos:

  • EFEC -> `010` -> Almacenar en Rx FIFO 1 se o filtro coincide
  • EFID1 -> `00000000010101010101010101010` -> Primeiro ID ampliado (0xAAAAA)
  • EFT -> `01` -> Filtro de identificación dual para EFID1 ou EFID2
  • EFID2 -> `00000000010111011101110111011` -> Segundo ID ampliado (0x000BBBBB)
Buffer de rx dedicado

Neste example o filtrado almacenará mensaxes que teñan o identificador 0x000AAAAA no búfer de rx dedicado #1. Tamén neste escenario, usando o búfer dedicado só se pode filtrar un ID de mensaxe e é o que se escribiu no campo EFID1.

  • Filtro de ID para o búfer de recepción dedicado (ID = 0x000AAAAA)
  • Valor de rexistro F0 (HEX): 0xE00AAAAA
  • Valor de rexistro F1 (HEX): 0x00000001
  • Valor de rexistro FO (BIN): 111 00000000010101010101010101010
  • Valor de rexistro F1 (BIN): 00 (0) 000000000000000000 00 (000) 000001

Valores dos campos:

  • EFEC -> `111` -> Almacenar no búfer rx dedicado se o filtro coincide
  • EFID1 -> `00000000010101010101010101010` -> ID ampliado que o filtro aceptará
    (0x000AAAAA)
  • EFT -> `00` -> este valor non é importante porque o filtrado para almacenalo en RX dedicado
    BUFFER e, neste caso, o valor EFT é ignorado (consulte a descrición do campo EFEC caso `111`)
  • EFID2[10, 9] -> `00` -> este campo decide se a mensaxe recibida se almacena nun buffer Rx ou se trata como mensaxe A, B ou C da secuencia de mensaxes de depuración. Neste caso, a aplicación de software quere almacenar a mensaxe nun buffer Rx
  • EFID2[0,5] -> `000001` -> índice do búfer rx dedicado onde se almacenará a mensaxe coincidente (se configurou N búfer rx dedicado este índice pode estar no intervalo [0, N -1]). Neste caso, a mensaxe gárdase no búfer dedicado #1
Filtro clásico para rx FIFO1

Neste example, a programación do filtro almacenará mensaxes almacenadas cun identificador no intervalo [0 x FFFFF, 0 x1FFFFFF] no rx FIFO 1. Enténdese que o método de enmascaramento é o mesmo que os filtros de ID estándar. A continuación móstrase unha explicación sobre como programar un filtro de rango de ID estendido en rage [0 x FFFFF, 0 x 1FFFFFF] que almacena as mensaxes recibidas en rx FIFO 1. Este é un filtro para mensaxes estendidas, polo que daremos valores a EFID1 = Identificador e EFID2 = Máscara

  • Valor de rexistro F0 (HEX): 0x400FFFFF
  • Valor de rexistro F1 (HEX): 0x9E0FFFFF
  • Valor de rexistro F0 (BIN): 010 00000000011111111111111111111
  • Valor de rexistro F1 (BIN): 10 (0) 11110000011111111111111111111
  • EFT > `10` -> Filtro clásico: EFID1 = filtro, EFID2 = máscara
  • EFEC -> `010` -> Almacenar en Rx FIFO 1 se o filtro coincide
  • EFID1 = 0 0000 0000 1111 1111 1111 1111 1111 (Identificador 0xFFFFF)
  • EFID2 = 1 1110 0000 1111 1111 1111 1111 1111 (Máscara 0x1E0FFFFF)

Aplicando a máscara ao identificador (un bit) co significado do bit de máscara (1 = debe corresponder a 0 = non importa) atopamos o seguinte filtro de rango onde o símbolo `X` significa cero ou un.

Filtro = 0 000X XXXX 1111 1111 1111 1111 1111

Polo tanto, todas as mensaxes ampliadas no intervalo [0xFFFFF, 0x1FFFFFF] pasarán polo filtro.

Apéndice A Documentos de referencia

  • SPC584Cx/SPC58ECx Manual de referencia
  • Folla de datos SPC584Cx/SPC58ECx

Anexo B Siglas e abreviaturas

Abreviatura Nome completo
PODE Rede de área de controlador
FD Velocidade de datos flexible
Historial de revisión de documentos
Data Versión Cambios
01-mar-2021 1 Lanzamento inicial.

AVISO IMPORTANTE: LÉ ATENTAMENTE

STMicroelectronics NV e as súas filiais ("ST") resérvanse o dereito de facer cambios, correccións, melloras, modificacións e melloras nos produtos ST e / ou neste documento en calquera momento sen previo aviso. Os compradores deberían obter a información relevante máis recente sobre os produtos ST antes de realizar pedidos. Os produtos ST véndense segundo os termos e condicións de venda de ST no seu momento de confirmación do pedido.

Os compradores son os únicos responsables da elección, selección e uso dos produtos ST e ST non asume ningunha responsabilidade pola asistencia á aplicación ou o deseño dos produtos dos compradores.

ST non concede ningunha licenza, expresa ou implícita, a ningún dereito de propiedade intelectual.

A revenda de produtos ST con disposicións diferentes da información aquí establecida anulará calquera garantía concedida por ST para tal produto.

ST e o logotipo de ST son marcas comerciais de ST. Para obter información adicional sobre as marcas rexistradas ST, consulte www.st.com/trademarks. Todos os outros nomes de produtos ou servizos son propiedade dos seus respectivos propietarios.

A información deste documento substitúe e substitúe a información proporcionada anteriormente en calquera versión anterior deste documento.

© 2021 STMicroelectronics – Todos os dereitos reservados

Documentos/Recursos

ST TN1348 SPC58x Configuración de filtros CAN e CAN-FD [pdfInstrucións
TN1348, SPC58x Configuración de filtros CAN e CAN-FD

Referencias

Deixa un comentario

O teu enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados *