Господа
Прошу помощи
2 устройства на CAN шине
Пытаюсь связать сообщением с ID = 0x000C
Если настраиваю принимающую сторону на прием всех сообщений - сообщение принимается = физика исправна
Как только пытаюсь настроить фильтр прием прекращается
Помогите Что я делаю не так ???
Код передатчика
Инициализация 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]