OpenEdv-开源电子网

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

stm32f103rct6(mini开发板)的can通讯问题

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-4-28
在线时间
16 小时
发表于 2016-4-28 17:05:17 | 显示全部楼层 |阅读模式
6金钱
1、最近想使用can通讯,于是买了tja1050模块、can分析仪(can转USB)配合mini开发板(stm32f103rct6)。接线是mini开发板的引脚(PA11\12 或PB8\9)接can模块,然后接can转USB接电脑,运行的结果是开发板可以收到pc发的数据,可是pc收不到开发板的数据。将开发板的can初始化设成回环模式收发正常。求解??2、我做了一块pcb板,can通讯一直没反应。接线也是stm3f103rct6的两个引脚接tja1050模块再接can分析仪(can转USB)接电脑,跟上面的开发板一样的接法,程序也一样,但就是收不到数据。改成回环模式收发正常。我的板子需要接收其他设备发来的can数据,,求解???
下面是程序的can配置:
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
       
        CAN_DeInit(CAN1);

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ê1ÄüPORTAê±Öó                                                                                                                    

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1ÄüCAN1ê±Öó       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
                GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
       

    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);                //3õê¼»ˉIO

       
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPU;//éÏà-êäèë
    GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉIO
               
                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíì
    GPIO_Init(GPIOB, &GPIO_InitStructure);                //3õê¼»ˉIO

       
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPU;//éÏà-êäèë
    GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉIO
          
        //CANμ¥ÔaéèÖÃ
          CAN_InitStructure.CAN_TTCM=DISABLE;                                                 //·Çê±¼ä′¥·¢í¨DÅģ꽠 //
          CAN_InitStructure.CAN_ABOM=ENABLE;                                                 //èí¼t×Ô¶ˉàëÏß1üàí         //
          CAN_InitStructure.CAN_AWUM=DISABLE;                                                 //ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)//
          CAN_InitStructure.CAN_NART=ENABLE;                                                         //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí //
          CAN_InitStructure.CAN_RFLM=DISABLE;                                                 //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ //
          CAN_InitStructure.CAN_TXFP=DISABLE;                                                 //óÅÏè¼¶ó鱨Îıêê¶·û¾ö¶¨ //
          CAN_InitStructure.CAN_Mode= mode;                 //Ä£ê½éèÖão mode:0,ÆÕí¨Ä£ê½;1,»Ø»·Ä£ê½; //
          //éèÖÃ2¨ìØÂê
          CAN_InitStructure.CAN_SJW=tsjw;                                //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+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;            //·ÖÆμÏμêy(Fdiv)Îabrp+1        //
          CAN_Init(CAN1, &CAN_InitStructure);            // 3õê¼»ˉCAN1

          CAN_FilterInitStructure.CAN_FilterNumber=0;          //1yÂËÆ÷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;//1yÂËÆ÷01Øáaμ½FIFO0
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î1yÂËÆ÷0

          CAN_FilterInit(&CAN_FilterInitStructure);//ÂË2¨Æ÷3õê¼»ˉ
#if CAN_RX0_INT_ENABLE
       
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0ÏûÏ¢1òoÅÖD¶ÏÔêDí.                    

          NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // Ö÷óÅÏè¼¶Îa1
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // ′ÎóÅÏè¼¶Îa0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
#endif
        return 0;
}


#if CAN_RX0_INT_ENABLE        //ê1ÄüRX0ÖD¶Ï  (êμ¼êÎ′ê1Äü,¸Ãoˉêy2»Ö′DD)
//ÖD¶Ï·tÎñoˉêy                            
void USB_LP_CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
          CanTxMsg TxMessage;

          RxMessage.StdId = 0x00;
          RxMessage.ExtId = 0x00;
          RxMessage.IDE = 0;
          RxMessage.DLC = 0;
          RxMessage.FMI = 0;
                memset(HMC_BUF,0,8);

          CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);

//if(RxMessage.StdId == Parameters.FSensor_Address)        //Forward Sensor

/*----------------------------------------------------------------------------*/
        if(RxMessage.DLC>0)
        {       
                HMC_BUF[0] = RxMessage.Data[0];                //0 - 7 ,??8?Byte
                HMC_BUF[1] = RxMessage.Data[1];       
                HMC_BUF[2] = RxMessage.Data[2];       
                HMC_BUF[3] = RxMessage.Data[3];       
                HMC_BUF[4] = RxMessage.Data[4];       
                HMC_BUF[5] = RxMessage.Data[5];       
                HMC_BUF[6] = RxMessage.Data[6];       
                HMC_BUF[7] = RxMessage.Data[7];
        }
/*----------------------------------------------------------------------------*/  

}
#endif

//can·¢Ëíò»×éêy¾Y(1춨¸ñê½:IDÎa0X12,±ê×¼Ö¡,êy¾YÖ¡)       
//len:êy¾Y3¤¶è(×î′óÎa8)                                     
//msg:êy¾YÖ¸Õë,×î′óÎa8¸ö×Ö½ú.
//·μ»ØÖμ:0,3é1|;
//                 ÆäËû,ê§°ü;
u8 Can_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x000;                                         // ±ê×¼±êê¶·û
  TxMessage.ExtId=0x00000000;                                   // éèÖÃà©Õ1±êê¾·û
       
       
       
       
  TxMessage.IDE=CAN_Id_Standard; // ±ê×¼Ö¡
  TxMessage.RTR=CAN_RTR_Data;                 // êy¾YÖ¡
  TxMessage.DLC=len;                                                // òa·¢ËíμÄêy¾Y3¤¶è
  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++;        //μè′y·¢&#203;í&#189;áê&#248;
  if(i>=0XFFF)return 1;
  return 0;               

}
//can&#191;ú&#189;óê&#213;êy&#190;Y2é&#209;ˉ
//buf:êy&#190;Y&#187;o′&#230;&#199;&#248;;         
//·μ&#187;&#216;&#214;μ:0,&#206;Têy&#190;Y±&#187;ê&#213;μ&#189;;
//                 &#198;&#228;&#203;&#251;,&#189;óê&#213;μ&#196;êy&#190;Y3¤&#182;è;
u8 Can_Receive_Msg(u8 *buf)
{                                     
        u32 i;
        CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //&#195;&#187;óD&#189;óê&#213;μ&#189;êy&#190;Y,&#214;±&#189;óí&#203;3&#246;
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//&#182;áè&#161;êy&#190;Y       
    for(i=0;i<8;i++)
    buf[i]=RxMessage.Data[i];  
        return RxMessage.DLC;        
}

下面是主程序:
int a,b;
void Delay(u32 count)
{
  u32 i=0;
  for(;i<count;i++);

}
int main(void)
{        u8 msg[3]={0,0,1};                
        u8 buf2[8]={0,0,0};
         delay_init();                 
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          
         uart_init(9600,9600,115200);
   TIM2_Int_Init(20,1799);                        //10ms;
         CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_3tq,CAN_BS1_2tq,24,CAN_Mode_Normal);//250Kbps
         G_GPIO_Init();
         Dac_Init();
          Dac1_Set_Vol(0);                  
                Dac2_Set_Vol(0);
         G_AGV_Init();

       
         while(1)
         {

//                a= Can_Send_Msg(msg,3);
                 delay_ms(20);
                b= Can_Receive_Msg(buf2);
//         G_AVOIDANCE();
//         G_MENUCHECK();
//         G_EXECUTE();       
                 
         }
}


一开始我使用的是PA11/12,我都板子没反应,mini开发板可接收,发送不成功;后来映射到PB8、9,我的板子仍然没反应,minimini开发板可接收,发送不成功。
第一次发帖,求大神指教。

stm32f103的图

stm32f103的图

最佳答案

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

已解决。can是时钟频率不对。我芯片没有外接晶振,所以程序启动内部晶振,系统时钟和外设时钟频率都变了,而我之前还是用接了外部晶振的时钟计算can的波特率什么的,所以已知搞不出来。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-4-28
在线时间
16 小时
 楼主| 发表于 2016-4-28 17:05:18 | 显示全部楼层
已解决。can是时钟频率不对。我芯片没有外接晶振,所以程序启动内部晶振,系统时钟和外设时钟频率都变了,而我之前还是用接了外部晶振的时钟计算can的波特率什么的,所以已知搞不出来。
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-6-7
在线时间
4 小时
发表于 2016-7-1 16:42:41 | 显示全部楼层
大神,能不能把can通信的完整程序发给我看看呢?谢谢哈!
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-4-28
在线时间
16 小时
 楼主| 发表于 2016-8-2 11:09:03 | 显示全部楼层
给你两个开发版的程序,一个是stm32f103rbt6,一个是stm32f103zet6.我的整套程序加入了其他东西,不易看懂

高级例程-基于两个MINI板的CAN通讯.zip

925.32 KB, 下载次数: 592

实验26 CAN收发实验.zip

373.94 KB, 下载次数: 576

回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2016-7-11
在线时间
21 小时
发表于 2016-8-21 16:21:10 | 显示全部楼层
顶起
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-10-29
在线时间
5 小时
发表于 2020-5-25 14:25:35 | 显示全部楼层
大师好,我现在也是用的stm32f103rct6做can通讯,回环正常,就是发不出去,测量cantx上都没有数据,发生错误计数到一定值总线就离线了,esr那个寄存器显示0x05,显性位错,搞了两天了也没搞好,用的是hal的1.8.0的库,用的片外8M晶振。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 18:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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