打印

STM32F107 CAN收发问题(求助!)

[复制链接]
9650|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sparkwxl|  楼主 | 2012-7-20 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在用107的板子在调试CAN,参考了网上的代码,用CAN1通讯,板子上对应的IO为PD0,PD1,已经remap,中断接收,轮循发送,自发自收没有问题,NORMAL模式下就无法收到CAN盒的数据帧,CAN盒也收不到板子发送的数据帧(追踪到发送状态一直是CAN_TxStatus_Pending),用示波器量过,发送和接收时总线上都是有差分信号出来的,检查了代码,发现好像也没啥问题,求指正!


void can_configuration(void)
{
        CAN_InitTypeDef        CAN_InitStructure;
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        /* GPIOB Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |   RCC_APB2Periph_GPIOD , ENABLE);
        /* Enable CAN1 clock  */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);

        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);


        /* Configure CAN1 pin(PB5): RX */
              GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
               GPIO_Init(GPIOD, &GPIO_InitStructure);  
               /* Configure CAN1 pin(PB6): TX */
               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOD, &GPIO_InitStructure);

        /* Enable the USART2 Pins Software Remapping */
                GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);
       
       
        /* CAN1 register init */
        CAN_DeInit(CAN1);
        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 = ENABLE;  
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
        CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;      
        CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;      
        CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;   
        CAN_InitStructure.CAN_Prescaler = 9;     //500kHz
       
        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=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;  
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
        CAN_FilterInit(&CAN_FilterInitStructure);

        CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
}

发送:
void CanWriteData(void)
{
  CanTxMsg TxMessage;

  /* transmit */
  TxMessage.StdId = 0x55;  
  TxMessage.RTR = CAN_RTR_DATA;
  TxMessage.IDE = CAN_ID_STD;   
  TxMessage.DLC = 8;           
  TxMessage.Data[0] = 0x55;   
  TxMessage.Data[1] = 0x55;   
  TxMessage.Data[2] = 0x55;   
  TxMessage.Data[3] = 0x55;   
  TxMessage.Data[4] = 0x55;   
  TxMessage.Data[5] = 0x55;     
  TxMessage.Data[6] = 0x55;   
  TxMessage.Data[7] = 0x55;      
  CAN_Transmit(CAN1,&TxMessage);  
}

接收:
void CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;

         CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);  
          recv_frame.id = RxMessage.StdId;
          recv_frame.data_buff[0] = RxMessage.Data[0];
          recv_frame.data_buff[1] = RxMessage.Data[1];
          recv_frame.data_buff[2] = RxMessage.Data[2];
          recv_frame.data_buff[3] = RxMessage.Data[3];
          recv_frame.data_buff[4] = RxMessage.Data[4];
          recv_frame.data_buff[5] = RxMessage.Data[5];
          recv_frame.data_buff[6] = RxMessage.Data[6];
          recv_frame.data_buff[7] = RxMessage.Data[7];
          can_recv_flag = ENABLE;
}
沙发
sparkwxl|  楼主 | 2012-7-20 09:37 | 只看该作者
:dizzy:继续求指正......!

使用特权

评论回复
板凳
sparkwxl|  楼主 | 2012-7-20 10:24 | 只看该作者
顶起来,求CAN高手指教。。。

使用特权

评论回复
地板
llglqh| | 2012-7-20 11:17 | 只看该作者
你先用例子程序试试。
可以用这个看你是不是发送成功了。
   TransmitMailbox=CAN_Transmit(&TxMessage);            //报文发往发送邮箱
   i = 0;
    while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF))
    {
      i++;
    }

使用特权

评论回复
5
sparkwxl|  楼主 | 2012-7-20 11:24 | 只看该作者
感谢4楼的回复,在追踪发送问题时,我也有调用CAN_TransmitStatus去获取发送状态,结果返回的一直是CAN_TxStatus_Pending,没有发送成功
而且从CAN盒那发送过来的数据帧,107的板子这边总线和PD0都有波形,但接收中断都没进。。。郁闷

使用特权

评论回复
6
sparkwxl|  楼主 | 2012-7-20 15:39 | 只看该作者
唉。。。没人碰到过这样的问题吗?

使用特权

评论回复
7
sparkwxl|  楼主 | 2012-7-20 15:48 | 只看该作者
进一步追踪接收的问题,当CAN盒发送出数据帧时,107这边中断没触发,查询CAN_FLAG_LEC,发现返回0x01,位填充错误。。。
请教位填充错误是哪里设置错误?如何解决?

使用特权

评论回复
8
IJK| | 2012-7-20 15:57 | 只看该作者
CAN正常的收发需要至少2个节点的。
如果只有1个节点,发送状态一直是CAN_TxStatus_Pending 就正常了。

使用特权

评论回复
9
sparkwxl|  楼主 | 2012-7-20 16:05 | 只看该作者
回8楼,是有两个节点的,一个是107的板子,一个是周立功的USBCAN-II

使用特权

评论回复
10
sparkwxl|  楼主 | 2012-7-20 16:06 | 只看该作者
现在查到的错误是位填充错误,不晓得如何解决?哪位有经验的指导一下哈

使用特权

评论回复
11
sparkwxl|  楼主 | 2012-7-20 16:30 | 只看该作者
问题补充:现在出现位填充错误,不知道是不是跟我107板子上,CAN_H和CAN_L之间没有接120欧的终端电阻造成的?但我接上这个终端电阻,在传送数据帧时,总线上就没波形了。。。。求解!

使用特权

评论回复
12
sparkwxl|  楼主 | 2012-7-20 16:40 | 只看该作者
问题补充:上面说错了,刚才又测了一下,接上终端电阻,总线及107的CAN控制器管脚都是有波形的,但检测到的还是位填充错误。。。。郁闷哪

使用特权

评论回复
13
damiaa| | 2012-7-20 17:44 | 只看该作者
估计是位速率配置有问题
还是电路问题?
你可以往这方面考虑

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sparkwxl + 1 我很赞同
14
sparkwxl|  楼主 | 2012-7-23 11:51 | 只看该作者
波特率应该配置没有错。。
不知有谁用过107的板子调过CAN没有?

使用特权

评论回复
15
sparkwxl|  楼主 | 2012-7-24 15:14 | 只看该作者
搞定,确实是硬件导致的位速率问题

使用特权

评论回复
16
wenzj12345| | 2012-7-24 16:34 | 只看该作者
顶  正好用的上~
3Q

使用特权

评论回复
17
hahaygy| | 2013-3-20 11:56 | 只看该作者
sparkwxl 发表于 2012-7-24 15:14
搞定,确实是硬件导致的位速率问题

楼主麻烦可以详细说下硬件导致的位速率是怎么回事吗?我的CAN也是进不了中断!谢谢你!

使用特权

评论回复
18
hawksabre| | 2013-3-20 21:14 | 只看该作者
希望有CAN总线高手指点   谢谢了  呵呵

使用特权

评论回复
19
Robert_zheng| | 2013-6-30 17:46 | 只看该作者
求楼主详细介绍下情况

使用特权

评论回复
20
tianyi_j| | 2013-7-2 20:56 | 只看该作者
用示波器测一下你发送出来的数据的波特率

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

18

帖子

1

粉丝