void CAN_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */
// CAN_DeInit();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);//刚开始漏掉这句,一直无法进入初始化模式
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE ); //¸´Î»CAN1µÄËùÓмĴæÆ÷
// RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN, ENABLE);
// CAN_StructInit(&CAN_InitStructure); //½«¼Ä´æÆ÷È«²¿ÉèÖóÉĬÈÏÖµ
/*ÅäÖÃCAN¶Ë¿ÚCAN pin: RX*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //IO¶Ë¿ÚµÄµÚ8λ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;// GPIO_Mode_IN_FLOATING; //¶Ë¿ÚģʽΪÉÏÀÊäÈ뷽ʽ
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //IO¶Ë¿ÚµÄµÚ9λ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¶Ë¿ÚģʽΪ¸´ÓÃÍÆÀÊä³ö·½Ê½
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap1_CAN , ENABLE); //ÖØ¶¨ÒåCAN1µ½PB¿Ú
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE; //½ûֹʱ¼ä´¥·¢Í¨ÐÅ·½Ê½
CAN_InitStructure.CAN_ABOM=DISABLE; //½ûÖ¹CAN×ÜÏß×Ô¶¯¹Ø±Õ¹ÜÀí
CAN_InitStructure.CAN_AWUM=DISABLE; //½ûÖ¹×Ô¶¯»½ÐÑģʽ
CAN_InitStructure.CAN_NART=ENABLE; //½ûÖ¹·Ç×Ô¶¯ÖØ´«Ä£Ê½
CAN_InitStructure.CAN_RFLM=DISABLE; //½ûÖ¹½ÓÊÕFIFOËø¶¨
CAN_InitStructure.CAN_TXFP=DISABLE;//ENABLE; //½ûÖ¹·¢ËÍFIFOÓÅÏȼ¶
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_LoopBack;//CAN_Mode_Normal; //ÉèÖÃCAN¹¤×÷·½Ê½ÎªÕý³£ÊÕ·¢Ä£Ê½
/* CAN ²¨ÌØÂÊ */
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //ÉèÖÃÖØÐÂͬ²½Ìø×ªµÄʱ¼äÁ¿×Ó
CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; //ÉèÖÃ×Ö¶Î1µÄʱ¼äÁ¿×ÓÊý
CAN_InitStructure.CAN_BS2=CAN_BS2_8tq; //ÉèÖÃ×Ö¶Î2µÄʱ¼äÁ¿×ÓÊý
CAN_InitStructure.CAN_Prescaler=20; //·ÖƵϵÊý µÍ²¨ÌØÂÊÔ¶¾àÀë´«Êä¸üÎȶ¨£¬Èç¹û¾àÀë¶Ì¿ÉÒÔµ÷СÕâ¸öÖµ
CAN_Init(&CAN_InitStructure); //ÓÃÒÔÉϲÎÊý³õʼ»¯CAN1¶Ë¿Ú
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0; //Ñ¡ÔñCAN¹ýÂËÆ÷0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //³õʼ»¯Îª±êʶ/ÆÁ±Îģʽ
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //Ñ¡Ôñ¹ýÂËÆ÷Ϊ32λ
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //¹ýÂËÆ÷±êʶºÅ¸ß16λ
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //¹ýÂËÆ÷±êʶºÅµÍ16λ
//ÏÂÃæÈ«0£¬Ã»¹ýÂËÈκαêʶºÅ
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; //¸ù¾ÝģʽѡÔñ¹ýÂËÆ÷±êʶºÅ»òÆÁ±ÎºÅµÄ¸ß16λ
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; //¸ù¾ÝģʽѡÔñ¹ýÂËÆ÷±êʶºÅ»òÆÁ±ÎºÅµÄµÍ16λ
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //½«FIFO 0·ÖÅ䏸¹ýÂËÆ÷0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //ʹÄܹýÂËÆ÷
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 ½ÓÊÕÖжÏʹÄÜ */
// CAN_ITConfig(CAN_IT_FMP0, ENABLE);
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */
// CAN_DeInit();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);//刚开始漏掉这句,一直无法进入初始化模式
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE ); //¸´Î»CAN1µÄËùÓмĴæÆ÷
// RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN, ENABLE);
// CAN_StructInit(&CAN_InitStructure); //½«¼Ä´æÆ÷È«²¿ÉèÖóÉĬÈÏÖµ
/*ÅäÖÃCAN¶Ë¿ÚCAN pin: RX*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //IO¶Ë¿ÚµÄµÚ8λ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;// GPIO_Mode_IN_FLOATING; //¶Ë¿ÚģʽΪÉÏÀÊäÈ뷽ʽ
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //IO¶Ë¿ÚµÄµÚ9λ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¶Ë¿ÚģʽΪ¸´ÓÃÍÆÀÊä³ö·½Ê½
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap1_CAN , ENABLE); //ÖØ¶¨ÒåCAN1µ½PB¿Ú
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE; //½ûֹʱ¼ä´¥·¢Í¨ÐÅ·½Ê½
CAN_InitStructure.CAN_ABOM=DISABLE; //½ûÖ¹CAN×ÜÏß×Ô¶¯¹Ø±Õ¹ÜÀí
CAN_InitStructure.CAN_AWUM=DISABLE; //½ûÖ¹×Ô¶¯»½ÐÑģʽ
CAN_InitStructure.CAN_NART=ENABLE; //½ûÖ¹·Ç×Ô¶¯ÖØ´«Ä£Ê½
CAN_InitStructure.CAN_RFLM=DISABLE; //½ûÖ¹½ÓÊÕFIFOËø¶¨
CAN_InitStructure.CAN_TXFP=DISABLE;//ENABLE; //½ûÖ¹·¢ËÍFIFOÓÅÏȼ¶
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_LoopBack;//CAN_Mode_Normal; //ÉèÖÃCAN¹¤×÷·½Ê½ÎªÕý³£ÊÕ·¢Ä£Ê½
/* CAN ²¨ÌØÂÊ */
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //ÉèÖÃÖØÐÂͬ²½Ìø×ªµÄʱ¼äÁ¿×Ó
CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; //ÉèÖÃ×Ö¶Î1µÄʱ¼äÁ¿×ÓÊý
CAN_InitStructure.CAN_BS2=CAN_BS2_8tq; //ÉèÖÃ×Ö¶Î2µÄʱ¼äÁ¿×ÓÊý
CAN_InitStructure.CAN_Prescaler=20; //·ÖƵϵÊý µÍ²¨ÌØÂÊÔ¶¾àÀë´«Êä¸üÎȶ¨£¬Èç¹û¾àÀë¶Ì¿ÉÒÔµ÷СÕâ¸öÖµ
CAN_Init(&CAN_InitStructure); //ÓÃÒÔÉϲÎÊý³õʼ»¯CAN1¶Ë¿Ú
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0; //Ñ¡ÔñCAN¹ýÂËÆ÷0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //³õʼ»¯Îª±êʶ/ÆÁ±Îģʽ
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //Ñ¡Ôñ¹ýÂËÆ÷Ϊ32λ
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //¹ýÂËÆ÷±êʶºÅ¸ß16λ
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //¹ýÂËÆ÷±êʶºÅµÍ16λ
//ÏÂÃæÈ«0£¬Ã»¹ýÂËÈκαêʶºÅ
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; //¸ù¾ÝģʽѡÔñ¹ýÂËÆ÷±êʶºÅ»òÆÁ±ÎºÅµÄ¸ß16λ
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; //¸ù¾ÝģʽѡÔñ¹ýÂËÆ÷±êʶºÅ»òÆÁ±ÎºÅµÄµÍ16λ
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //½«FIFO 0·ÖÅ䏸¹ýÂËÆ÷0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //ʹÄܹýÂËÆ÷
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 ½ÓÊÕÖжÏʹÄÜ */
// CAN_ITConfig(CAN_IT_FMP0, ENABLE);
}
折腾了一天一直无法弄出来,是在以前程序上加个CAN功能,时钟使能在void RCC_Configuration(void)定义的,添加CAN忘了定义CAN时钟,弄一天都要开始怀疑人生了!!!!