реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32 CAN фильтры
DeXteR
сообщение May 11 2012, 12:27
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Господа

Прошу помощи

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;}
}


Сообщение отредактировал IgorKossak - May 11 2012, 18:27
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
vptr
сообщение May 11 2012, 12:57
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 15-11-07
Пользователь №: 32 363



Цитата(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 не настолько высокоуровневая, как хотелось бы. Чтобы биты идентификатора попали на свое место в служебных регистрах, данные необходимо сдвигать на пять разрядов.

Сообщение отредактировал vptr - May 11 2012, 13:06
Go to the top of the page
 
+Quote Post
DeXteR
сообщение May 11 2012, 13:06
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



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


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

Процессоры использую
stm32F103RBT6 (приемник)
и
stm32F103CVT (передатчик)
Go to the top of the page
 
+Quote Post
vptr
сообщение May 11 2012, 13:20
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 15-11-07
Пользователь №: 32 363



Цитата(DeXteR @ May 11 2012, 16:06) *
к сожалению не пролечило =(

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

а если попробовать передавать стандартный ID (11-бит) а не расширенный, как сейчас у вас. Извиняюсь, мой код работает для стандартного ID

Сообщение отредактировал vptr - May 11 2012, 13:21
Go to the top of the page
 
+Quote Post
DeXteR
сообщение May 11 2012, 13:40
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Цитата(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;
Если делаем так в приемнике - пакеты попадают в фифо без проблем

Сообщение отредактировал IgorKossak - May 11 2012, 18:24
Причина редактирования: [code] для короткого кода
Go to the top of the page
 
+Quote Post
DeXteR
сообщение May 11 2012, 15:43
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Ура !!!!

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

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

Сообщение отредактировал IgorKossak - May 11 2012, 18:25
Причина редактирования: [code] для короткого кода
Go to the top of the page
 
+Quote Post
DeXteR
сообщение May 12 2012, 07:46
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Господа
Поделитесь плиз примером
Как принимать ответ на Remote Frame

Я уже весь гугл перерыл
Go to the top of the page
 
+Quote Post
Siargy
сообщение Dec 4 2014, 06:49
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-01-10
Из: Минск
Пользователь №: 55 126



О, действительно,
Код
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
      CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;

сдвинуты на 3бита.
както недоработана библиотека.


--------------------
Святло ў цемры заўседы свеціць
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016