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

 
 
> 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



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

 


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


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