STM 32 F 105 CAN通信フィルタ構成の問題
7217 ワード
CAN通信のフィルタ配置に対する最近のプロジェクトの理解をまとめます.ここで私はSTM 32 F 105シリーズのチップを使っています.2ウェイCANがあります.私はCAN 2を使っています.フィルタは15から設定できます.もちろん、1からでも問題ありません. CANフィルタが設定されている場合、指定されたIDのデータしか受信できないことを示し、他のIDから送信されたデータは、CAN割り込みをトリガーすることなく、システムの安定性をさらに向上させることができる.CANバスにデータが多い場合は必要です.具体的には、
複数のフィルタを設定する場合は、次のように構成します.
このように推す.3.CAN 2を単独で使用する場合は、まずCAN 1のクロックをオンにしなければならない.そうしないと、データが受け取れない.CAN完全な初期化コード(F 105シリーズのCAN 2クロックイネーブル部分に注意):
CAN_SlaveStartBank(15); // can2 15
CAN_FilterInitStructure.CAN_FilterNumber=15;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
// ID 0x11, ID 0x14 ,
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1114;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
複数のフィルタを設定する場合は、次のように構成します.
CAN_FilterInitStructure.CAN_FilterNumber=16;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1113;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
このように推す.3.CAN 2を単独で使用する場合は、まずCAN 1のクロックをオンにしなければならない.そうしないと、データが受け取れない.CAN完全な初期化コード(F 105シリーズのCAN 2クロックイネーブル部分に注意):
//CAN
// tsjw : . :CAN_SJW_1tq~ CAN_SJW_4tq
// tbs2 : 2 . :CAN_BS2_1tq~CAN_BS2_8tq;
// tbs1 : 1 . :CAN_BS1_1tq ~CAN_BS1_16tq
// brp ; . :1~1024; tq=(brp)*tpclk1
// =Fpclk1/((tbs1+1+tbs2+1+1)*brp);
// :Fpclk1 36M, CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);
// :(pclk1/((tsjw+tbs2+tbs1)*brp)) = 36Mhz/18/4 = 500Kbits
// mode : : mode:CAN_Mode_Normal, ;CAN_Mode_LoopBack, ;
//CAN , 500Kbps
// :0, OK;
// , ;
// ;CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_4tq,CAN_BS2_7tq,6,CAN_Mode_Normal);//
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure; //
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;//CAN RX0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// PORTB
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);// CAN2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //
GPIO_Init(GPIOB, &GPIO_InitStructure); // IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure); // IO
//CAN
CAN_InitStructure.CAN_TTCM = DISABLE;//
CAN_InitStructure.CAN_ABOM = ENABLE; /* , : 128 11 , 。 */
// CAN_InitStructure.CAN_ABOM = DISABLE;// CAN_MCR INRQ 1 0 , 128 11 , ( )
CAN_InitStructure.CAN_AWUM = DISABLE;// ( CAN->MCR SLEEP )???
CAN_InitStructure.CAN_NART = DISABLE; /* , , */
// CAN_InitStructure.CAN_NART = ENABLE;//
CAN_InitStructure.CAN_RFLM = DISABLE;// ,
CAN_InitStructure.CAN_TXFP = ENABLE; /* 0--- 1--- */
// CAN_InitStructure.CAN_TXFP = DISABLE;// FIFO
CAN_InitStructure.CAN_Mode = mode;// : mode:CAN_Mode_Normal, ;CAN_Mode_LoopBack, ;
//
CAN_InitStructure.CAN_SJW = tsjw;// (Tsjw) tsjw+1 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
CAN_InitStructure.CAN_BS1 = tbs1;//Tbs1=tbs1+1 CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2 = tbs2;//Tbs2=tbs2+1 CAN_BS2_1tq ~ CAN_BS2_8tq
//(pclk1/((1+8+9)*4)) = 36Mhz/18/4 = 500Kbits
//(pclk1/((1+4+7)*6)) = 36Mhz/18/4 = 500Kbits
CAN_InitStructure.CAN_Prescaler = brp;
CAN_Init(CAN2, &CAN_InitStructure);
#if 1
//
CAN_SlaveStartBank(15); // can2 15
CAN_FilterInitStructure.CAN_FilterNumber=15;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1114;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=16;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1113;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=17;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1115;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=18;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1116;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
#endif
CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE); //FIFO0 .
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn; // , USB_LP_CAN1_RX0_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5; // 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* , fifo */
NVIC_Init(&NVIC_InitStructure);
}