OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6866|回复: 2

stm32F103C8t6 can通信问题

[复制链接]

4

主题

9

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2021-2-26
在线时间
3 小时
发表于 2021-5-23 22:48:16 | 显示全部楼层 |阅读模式
1金钱
目前用stm32F103C8T6 进行can调试,采用PB8\PB9脚,目前发送已经能正常发送,采用can调试器监控数据一切正常。接收无法收到数据。感觉进入不了中断,请大神帮忙分析,谢谢!程序附上:
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
        {
                GPIO_InitTypeDef                GPIO_InitStructure;
                CAN_InitTypeDef                 CAN_InitStructure;
               
                CAN_FilterInitTypeDef        CAN_FilterInitStructure;
                CanTxMsg TxMessage;
#if CAN1_RX0_INT_ENABLE
NVIC_InitTypeDef  NVIC_InitStructure;
#endif
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                                                                                                                    
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);        //新增复用功能
        GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
        //GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_CAN1); //GPIOA11复用为CAN1
          //GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_CAN1); //GPIOA12复用为CAN1
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//RX
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
          GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
      GPIO_Init(GPIOB, &GPIO_InitStructure);

        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= mode;//CAN_Mode_Normal;
          CAN_InitStructure.CAN_SJW=tsjw;//值1
        CAN_InitStructure.CAN_BS1=tbs1; //值1
          CAN_InitStructure.CAN_BS2=tbs2;//值1
        CAN_InitStructure.CAN_Prescaler=brp;
          CAN_Init(CAN1, &CAN_InitStructure);

        CAN_FilterInitStructure.CAN_FilterNumber=0;
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x1000;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//CAN_Filter_FIFO0;
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
          CAN_FilterInit(&CAN_FilterInitStructure);

        #if CAN1_RX0_INT_ENABLE
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断屏蔽
        CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);//发送邮箱空中断屏蔽
        CAN_ITConfig(CAN1,CAN_IT_BOF,ENABLE);//离线中断屏蔽
        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//11
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
#endif

return 0;
                }

        #if CAN1_RX0_INT_ENABLE
        /* USB中断和CAN接收中断服务程序,USB跟CAN公用I/O,这里只用到CAN的中断。 */
       
void USB_LP_CAN1_RX0_IRQHandler(void)
                {
                int i=0;
                CanRxMsg RxMessage;
                if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //没有接收到数据,直接退出
                //CAN_Receive(CAN1, 0, &RxMessage);//另一中写法:0改为CAN_FIFO0
                //Message.StdId=0x00;         
                RxMessage.ExtId=0X00;//0];//0x00;
                RxMessage.IDE=0;//CAN_ID_EXT;
                RxMessage.DLC=0;//
                RxMessage.RTR=0;//CAN_RTR_DATA;
                RxMessage.FMI=0;
                RxMessage.Data[0]= 0x00;
                RxMessage.Data[1]= 0x00;

               
                for(i=0;i<8;i++)
                        RxMessage.Data[i]= 0;
               
                //USART1_DATA(RxMessage.Data,RxMessage.DLC);
               
                //printf("IRQ RxMessage.Data = %s\r\n", RxMessage.Data);               
               
                CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);//另一中写法:0改为CAN_FIFO0       
                extidd[0]=RxMessage.ExtId;
                //memset(&RxMessage,0,8);
receive_addr_extidd=extidd[0];
                RxMessage.Data[i]=buf[i];//0;
                can_receive_process();
       // CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
                }
       
        #endif

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-5-24 14:26:53 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-5-26 02:00:34 | 显示全部楼层
看看你是不是中段服务函数用错名字了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 05:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表