Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 CAN фильтры
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
DeXteR
Господа

Прошу помощи

2 устройства на CAN шине

Пытаюсь связать сообщением с ID = 0x000C
Если настраиваю принимающую сторону на прием всех сообщений - сообщение принимается = физика исправна

Как только пытаюсь настроить фильтр прием прекращается crying.gif

Помогите Что я делаю не так ???

Код передатчика

Инициализация CAN
CODE
void CAN_INIT(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// PB8 - RX PB9 - TX
// Configure CAN pin: RX

CAN_DeInit();

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// Configure CAN pin: TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);


GPIO_PinRemapConfig(GPIO_Remap1_CAN, ENABLE);
// CAN register init
CAN_StructInit(&CAN_InitStructure);

// CAN cell init
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;

CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN_Mode_LoopBack; //CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_11tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq;
CAN_InitStructure.CAN_Prescaler = 2;
CAN_Init(&CAN_InitStructure);
}

Отправка сообщений
CODE
// Ñôîðìèðóåì ñîîáùåíèå
Drives.DriveData[Adres].Zadanie1 = 123;
Drives.DriveData[Adres].Zadanie2 = 12;
Drives.DriveData[Adres].Zadanie3 = 1;



TxMessage.ExtId=((MS0_M<<11) + (Adres<<3) + (1<<2));
TxMessage.RTR = CAN_RTR_REMOTE;
TxMessage.IDE = CAN_ID_EXT;
TxMessage.DLC = 8;

TxMessage.Data[0] = (Drives.DriveData[Adres].Zadanie1&0xFF);
TxMessage.Data[1] = (Drives.DriveData[Adres].Zadanie1>>8);

TxMessage.Data[2] = (Drives.DriveData[Adres].Zadanie2&0xFF);
TxMessage.Data[3] = (Drives.DriveData[Adres].Zadanie2>>8);

TxMessage.Data[4] = (Drives.DriveData[Adres].Zadanie3&0xFF);
TxMessage.Data[5] = (Drives.DriveData[Adres].Zadanie3>>8);

TxMessage.Data[6] = (Drives.DriveData[Adres].Command&0xFF); // Êîìàíäà - ìë.
TxMessage.Data[7] = (Drives.DriveData[Adres].Command>>8); // Êîìàíäà - ñò.

// Îòïðàâêà óïðàâëÿþùåé êîìàíäû
TransmitMailbox = CAN_Transmit(&TxMessage);

Код приемника
CODE

void CAN_INIT(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// Êàí ïîäêëþ÷åí ê íîãàì PB8 - RX PB9 - TX
// Configure CAN pin: RX

CAN_DeInit();

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// Configure CAN pin: TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);


GPIO_PinRemapConfig(GPIO_Remap1_CAN, ENABLE);
// CAN register init
CAN_StructInit(&CAN_InitStructure);

// CAN cell init
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN_Mode_LoopBack; //CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_11tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq;
CAN_InitStructure.CAN_Prescaler = 2;
CAN_Init(&CAN_InitStructure);

// CAN filter initialization section

// Recieve control message(DF) from SUVU
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = (MS0_M<<11) + (Adres<<3) + (1<<2); //0x000C;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = CAN_FilterInitStructure.CAN_FilterIdHigh;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = CAN_FilterInitStructure.CAN_FilterIdLow;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}

Прием - код исполняется циклически с частотой 10 кГц
CODE
if (CAN_MessagePending(CAN_FIFO0)>0)
{ // Ïðèøëî ñîîáùåíèå â ïåðâûé ÔÈÔÎ
GPIO_SetBits(GPIOB, (1<<2));
// for(;;){}
TimeOutCan = 0;
// Â áóôåðå åñòü äàííûå
CAN_Receive(CAN_FIFO0, &RxMessage);
CAND.Zadanie1 = (RxMessage.Data[1]<<8)+RxMessage.Data[0];
CAND.Zadanie2 = (RxMessage.Data[3]<<8)+RxMessage.Data[2];
CAND.Zadanie3 = (RxMessage.Data[5]<<8)+RxMessage.Data[4];
CAND.Command = (RxMessage.Data[7]<<8)+RxMessage.Data[6];
GPIO_ResetBits(GPIOB, (1<<2));
}
else
{
if (TimeOutCan < CAN_MAX_TIMEOUT) {TimeOutCan ++;}
else {CAND.Command = 0;}
}
vptr
Цитата(DeXteR @ May 11 2012, 15:27) *
// Recieve control message(DF) from SUVU
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = (MS0_M<<11) + (Adres<<3) + (1<<2); //0x000C;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = CAN_FilterInitStructure.CAN_FilterIdHigh;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = CAN_FilterInitStructure.CAN_FilterIdLow;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

В STM32F4xx для приема сообщения, я записывал фильтр по другому
Код
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh =0x07F1<<5;// идентификатор 0x07F1 пишется в старшие разряды
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x07ff<<5;// 0 - любой бит проходит, 1 - только заданный в фильтре
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; //
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;    
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

попробуйте
Код
CAN_FilterInitStructure.CAN_FilterIdHigh =0x000C<<5;//
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;


библиотека от STM не настолько высокоуровневая, как хотелось бы. Чтобы биты идентификатора попали на свое место в служебных регистрах, данные необходимо сдвигать на пять разрядов.
DeXteR
Цитата(vptr @ May 11 2012, 15:57) *
В STM32F4xx для приема сообщения, я записывал фильтр по другому
Код
CAN_FilterInitStructure.CAN_FilterIdHigh =0x000C<<5;//
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;


к сожалению не пролечило =(

Процессоры использую
stm32F103RBT6 (приемник)
и
stm32F103CVT (передатчик)
vptr
Цитата(DeXteR @ May 11 2012, 16:06) *
к сожалению не пролечило =(

Процессоры использую
stm32F103RBT6 (приемник)
и
stm32F103CVT (передатчик)

а если попробовать передавать стандартный ID (11-бит) а не расширенный, как сейчас у вас. Извиняюсь, мой код работает для стандартного ID
DeXteR
Цитата(vptr @ May 11 2012, 16:20) *
а если попробовать передавать стандартный ID (11-бит) а не расширенный, как сейчас у вас. Извиняюсь, мой код работает для стандартного ID


Нельзя
Нужен ExtID
Код
      CAN_FilterInitStructure.CAN_FilterNumber = 0;
      CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //CAN_FilterMode_IdList;
      CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
      CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //(MS0_M<<11) + (Adres<<3) + (1<<2); //0x000C;
Если делаем так в приемнике - пакеты попадают в фифо без проблем
DeXteR
Ура !!!!

Пролечил все кодом в передатчике
Код
  TxMessage.ExtId=1;
  TxMessage.RTR = CAN_RTR_DATA;
  TxMessage.IDE = CAN_ID_EXT;
  TxMessage.DLC = 8;

У него TxMessage.ExtId RxMessage.ExtId и фильтр имеют разный формат
Первая = ID сообщения
Второе и третье - ID<<3
DeXteR
Господа
Поделитесь плиз примером
Как принимать ответ на Remote Frame

Я уже весь гугл перерыл
Siargy
О, действительно,
Код
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
      CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;

сдвинуты на 3бита.
както недоработана библиотека.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.