OpenEdv-开源电子网

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

求助,两个板子进行CAN总线通信不通。。。。。。。

[复制链接]

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-7 11:07:38 | 显示全部楼层 |阅读模式
5金钱
我用两个板子进行CAN通信,一个是STM32F103RC一个是探索者STMF407,我让f103发送,f407接收,只能发送成功,但是接收不成功是怎么回事?f407环回模式正常。

最佳答案

查看完整内容[请看2#楼]

终于通了,程序没有问题,只是硬件问题,最后换了个f103的板子,输进去就通了,怀疑之前调的板子一直不通是TJA1051那个芯片的问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-7 11:07:39 | 显示全部楼层
终于通了,程序没有问题,只是硬件问题,最后换了个f103的板子,输进去就通了,怀疑之前调的板子一直不通是TJA1051那个芯片的问题。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-7 12:38:22 | 显示全部楼层
自己写的程序?
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2016-1-7 12:45:29 | 显示全部楼层
把两个板子的通信速率同时降低吧
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-7 14:25:20 | 显示全部楼层

能加个扣扣问么
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-7 14:25:45 | 显示全部楼层
小温 发表于 2016-1-7 12:45
把两个板子的通信速率同时降低吧

加个扣扣吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-7 22:46:33 | 显示全部楼层
估计是波特率不同.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 10:29:41 | 显示全部楼层
正点原子 发表于 2016-1-7 22:46
估计是波特率不同.

波特率都是一样的,纳闷寄存器的程序下进去打印是发送失败,库函数打印是发送成功,但是压根没数据从端口出口。用的就是例程,只是我把例程里面LCD屏显示函数全变为串口打印函数,其他的都没变。
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 10:31:36 | 显示全部楼层
        CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_7tq,CAN_BS1_7tq,7,0);//         400KB                                                          
while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)//KEY0°′ÏÂ,·¢Ëíò»′Îêy¾Y
                {
                        for(i=0;i<8;i++)
                        {
                                canbuf[i]=cnt+i;//ì&#238;3&#228;·¢&#203;í&#187;o3&#229;&#199;&#248;
                                printf("TX:canbuf[%d]=%d\n\r",i,canbuf[i]);
                        }
                        res=CAN1_Send_Msg(canbuf,8);//·发送
                if(res)
                                printf("TX:fail\n\r");                //失败
                        else
                                printf("TXk\n\r");                         //成功                                                                  
                }
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 10:33:34 | 显示全部楼层
        CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_7tq,CAN_BS1_7tq,6,CAN_Mode_Normal);        //f103,也是400
       key=Can_Receive_Msg(canbuf);
                printf("RX:key=%d\n\r",key);
                if(key)//&#189;óê&#213;μ&#189;óDêy&#190;Y
                {                       
                        printf("receive OK\n\r");       
                        for(i=0;i<key;i++)
                        {               
                                        if(i<4)
                                                printf("RX:canbuf[%d]=%d\n\r",i,canbuf[i]);
                                  else
                                                printf("RX:canbuf[%d]=%d\n\r",i,canbuf[i]);
                        }
                        printf("end\n\r");
                }
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 10:34:21 | 显示全部楼层
上面是一个是407板子发送部分,下面的是f103接收部分
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2014-10-9
在线时间
95 小时
发表于 2016-1-14 10:59:48 | 显示全部楼层
can接收不都是用中断接收的吗,你这各没看懂。。。
中断部分:void CAN1_RX0_IRQHandler(void)
{
        uint8_t can;
  CanRxMsg RxMessage;
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  if ((RxMessage.ExtId == 0x0202FE32)&&(RxMessage.IDE == CAN_ID_EXT) && (RxMessage.DLC == 8))
{}
}
f407接收配置部分
static void CAN_Config(void)
{
  RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);
  
  /* CAN register init */
  CAN_DeInit(CANx);

  /* 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_InitStructure.CAN_SJW = CAN_SJW_1tq;
   
  /* CAN Baudrate = 1 MBps (CAN clocked at 30 MHz) */
  CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
  CAN_InitStructure.CAN_Prescaler = 8;
  CAN_Init(CANx, &CAN_InitStructure);

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber = 0;
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;   //((0x0202FE20<<3)&0xFFFF0000)>>16
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;     //((0x0202FE20<<3)|CAN_ID_EXT)&0xFFFF
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
  
  /* Transmit Structure preparation */
  
  
  /* Enable FIFO 0 message pending Interrupt */
  CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);
}

/**
  * @brief  Configures the NVIC for CAN.
  * @param  None
  * @retval None
  */
static void NVIC_Config(void)
{
  NVIC_InitTypeDef  NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 11:14:29 | 显示全部楼层
yuanxinfei 发表于 2016-1-14 10:59
can接收不都是用中断接收的吗,你这各没看懂。。。
中断部分:void CAN1_RX0_IRQHandler(void)
{

这些都没问题的,两个板子环回正常,但是CANH--CANH,CANL--CANL时候,判断库函数,数据发送出去了,但是端口并没用变化,说明数据没发到另外一个板子的接收器那里
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2014-10-9
在线时间
95 小时
发表于 2016-1-14 11:20:31 | 显示全部楼层
蓝风3101 发表于 2016-1-14 11:14
这些都没问题的,两个板子环回正常,但是CANH--CANH,CANL--CANL时候,判断库函数,数据发送出去了,但是 ...

can芯片没问题的情况下,你示波器一端接H一端接L看有波形吗,没波形的话,那么绝对是你can配置有问题
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 11:23:05 | 显示全部楼层
yuanxinfei 发表于 2016-1-14 11:20
can芯片没问题的情况下,你示波器一端接H一端接L看有波形吗,没波形的话,那么绝对是你can配置有问题

没有示波器,只有电压表测电压是2.5V,我把f103和f407的配置贴出来
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 11:23:55 | 显示全部楼层
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;
#if CAN_RX0_INT_ENABLE
           NVIC_InitTypeDef  NVIC_InitStructure;
#endif

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟                                                                                                                    

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化IO
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO
          
        //CAN单元设置
          CAN_InitStructure.CAN_TTCM=DISABLE;                                                 //非时间触发通信模式  //
          CAN_InitStructure.CAN_ABOM=DISABLE;                                                 //软件自动离线管理         //
          CAN_InitStructure.CAN_AWUM=DISABLE;                                                 //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
          CAN_InitStructure.CAN_NART=ENABLE;                                                         //禁止报文自动传送 //
          CAN_InitStructure.CAN_RFLM=DISABLE;                                                 //报文不锁定,新的覆盖旧的 //
          CAN_InitStructure.CAN_TXFP=DISABLE;                                                 //优先级由报文标识符决定 //
          CAN_InitStructure.CAN_Mode= mode;                 //模式设置: mode:0,普通模式;1,回环模式; //
          //设置波特率
          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
          CAN_InitStructure.CAN_Prescaler=brp;            //分频系数(Fdiv)为brp+1        //
          CAN_Init(CAN1, &CAN_InitStructure);            // 初始化CAN1

          CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
           CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0

          CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
#if CAN_RX0_INT_ENABLE
       
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    
  
          NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
#endif
        return 0;
}   

#if CAN_RX0_INT_ENABLE        //使能RX0中断
//中断服务函数                            
void USB_LP_CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
        int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
        for(i=0;i<8;i++)
        printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);
}
#endif

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)       
//len:数据长度(最大为8)                                     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//                 其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;                                         // 标准标识符
  TxMessage.ExtId=0x12;                                   // 设置扩展标示符
  TxMessage.IDE=CAN_Id_Standard; // 标准帧
  TxMessage.RTR=CAN_RTR_Data;                 // 数据帧
  TxMessage.DLC=len;                                                // 要发送的数据长度
  for(i=0;i<len;i++)
  TxMessage.Data[i]=msg[i];                                  
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //等待发送结束
  if(i>=0XFFF)return 1;
  return 0;               

}
//can口接收数据查询
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2014-10-9
在线时间
95 小时
发表于 2016-1-14 11:24:32 | 显示全部楼层
蓝风3101 发表于 2016-1-14 11:23
没有示波器,只有电压表测电压是2.5V,我把f103和f407的配置贴出来

电压表量出来的是滤过波的,这个哪看得出来你输出了没啊。。。2.5V说不定输出了,不然应该是3.3V或者0V
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 11:25:53 | 显示全部楼层
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_1tq,CAN_BS1_13tq,14,0);//CAN波特率是200Kbps  
下面 是f4的:

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;
#if CAN1_RX0_INT_ENABLE
           NVIC_InitTypeDef  NVIC_InitStructure;
#endif
    //使能相关时钟
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟                                                                                                                    

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       
       
    //初始化GPIO
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
       
          //引脚复用映射配置
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1
          
          //CAN单元设置
           CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式  
          CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          
          CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
          CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送
          CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  
          CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定
          CAN_InitStructure.CAN_Mode= mode;         //模式设置
          CAN_InitStructure.CAN_SJW=tsjw;        //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
          CAN_InitStructure.CAN_BS1=tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
          CAN_InitStructure.CAN_BS2=tbs2;//Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
          CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1       
          CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1
   
                //配置过滤器
          CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
          CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
               
#if CAN1_RX0_INT_ENABLE
       
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    
  
          NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
#endif
        return 0;
}   

#if CAN1_RX0_INT_ENABLE        //使能RX0中断
//中断服务函数                            
void CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
        int i=0;
    CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
//        for(i=0;i<8;i++)
//        printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);
}
#endif

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)       
//len:数据长度(最大为8)                                     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//                 其他,失败;
u8 CAN1_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;         // 标准标识符为0
  TxMessage.ExtId=0x12;         // 设置扩展标示符(29位)
  TxMessage.IDE=CAN_ID_STD;                  // 使用扩展标识符
  TxMessage.RTR=0;                  // 消息类型为数据帧,一帧8位
  TxMessage.DLC=len;                                                         // 发送两帧信息
  for(i=0;i<len;i++)
  TxMessage.Data[i]=msg[i];                                 // 第一帧信息         
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //等待发送结束
  if(i>=0XFFF)return 1;
  return 0;               

}
//can口接收数据查询
//buf:数据缓存区;         
//返回值:0,无数据被收到;
//                 其他,接收的数据长度;
u8 CAN1_Receive_Msg(u8 *buf)
{                                     
        u32 i;
        CanRxMsg RxMessage;
        printf("RX==1:\n\r");
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)
                {
                        printf("RX==2:\n\r");
                        return 0;                //没有接收到数据,直接退出
                }
    else
                {
                        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据
                }
    for(i=0;i<RxMessage.DLC;i++)
    buf[i]=RxMessage.Data[i];  
        return RxMessage.DLC;       
}
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 11:26:50 | 显示全部楼层
f103的波特率也是200,是这样赋值的CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_1tq,CAN_BS1_13tq,12,CAN_Mode_Normal);//
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 11:27:28 | 显示全部楼层
yuanxinfei 发表于 2016-1-14 10:59
can接收不都是用中断接收的吗,你这各没看懂。。。
中断部分:void CAN1_RX0_IRQHandler(void)
{

大神,你看一下这个配置
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2014-10-9
在线时间
95 小时
发表于 2016-1-14 11:32:05 | 显示全部楼层
CAN1_RX0_INT_ENABLE是1吧,那么你中断中已经接收了,你断点断在 CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);这边看看进去了没,如果进去了,看一下RxMessage这个的数据,就是你can收到的数据了
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-14 11:34:26 | 显示全部楼层
yuanxinfei 发表于 2016-1-14 11:32
CAN1_RX0_INT_ENABLE是1吧,那么你中断中已经接收了,你断点断在 CAN_Receive(CAN1,CAN_FIFO0,&RxMessage); ...

没有进去,压根没进中断
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2014-10-9
在线时间
95 小时
发表于 2016-1-14 11:35:21 | 显示全部楼层
can中断里面接收掉后,CAN_MessagePending(CAN1,CAN_FIFO0)这个可能就等于0了,这个我也不确定哦,你一个can数据不能接收两次的
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

1

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-10
在线时间
49 小时
发表于 2016-1-25 20:54:37 | 显示全部楼层
MK,留作后面参考。俺现在也是鼓捣103和407用CAN互通,自己的回环模式都没问题,连起来不行。

逆水行舟不进则退
回复

使用道具 举报

12

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-3
在线时间
57 小时
发表于 2017-3-15 13:52:52 | 显示全部楼层
可以加个QQ吗
回复

使用道具 举报

12

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-3
在线时间
57 小时
发表于 2017-3-15 13:54:13 | 显示全部楼层
可以加QQ吗,最近也在用103和429做CAN通信,但总是调不通,想请教请教
回复

使用道具 举报

10

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-25
在线时间
11 小时
发表于 2017-7-4 20:15:00 | 显示全部楼层
正点原子 发表于 2016-1-7 22:46
估计是波特率不同.

我是用loopback模式测试收发都没有问题,再改成正常模式,把同一个程序下载到两个不同的板子里。还出现接收不到数据的现象。用的是重映射PB8\9,请帮忙看一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 16:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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