OpenEdv-开源电子网

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

stm32f105 can双机通讯

[复制链接]

7

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2014-1-24
在线时间
4 小时
发表于 2016-5-4 16:41:33 | 显示全部楼层 |阅读模式
10金钱
各位大哥大姐好,本人现在在调stm32f105 can的双机通讯,一直调不通,程序是根据原子大哥的程序来的。两块板的can配置如下:

#define CAN1_RX0_INT_ENABLE 1

void Can1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        CAN_InitTypeDef CAN_InitStructure;
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;
                #if CAN1_RX0_INT_ENABLE
                                NVIC_InitTypeDef  NVIC_InitStructure;
                #endif               
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9       
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9
       
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
          //CANμ¥ÔaéèÖÃ
           CAN_InitStructure.CAN_TTCM=DISABLE;        //·Çê±¼ä′¥·¢í¨DÅģ꽠  
          CAN_InitStructure.CAN_ABOM=DISABLE;        //èí¼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= CAN_Mode_Normal;         //Ä£ê½éèÖÃ
//                CAN_InitStructure.CAN_Mode= CAN_Mode_LoopBack;         //Ä£ê½éèÖÃ
               
          CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;        //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1tq~CAN_SJW_4tq
          CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //Tbs1·¶Î§CAN_BS1_1tq ~CAN_BS1_16tq
          CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//Tbs2·¶Î§CAN_BS2_1tq ~        CAN_BS2_8tq
          CAN_InitStructure.CAN_Prescaler=45;  //·ÖÆμÏμêy(Fdiv)Îabrp+1       
          CAN_Init(CAN1, &CAN_InitStructure);   // 3õê¼»ˉCAN1        
               
                //ÅäÖÃ1yÂËÆ÷
          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 CAN1_RX0_INT_ENABLE
       
          CAN_ITConfig(CAN1,CAN_IT_FMP0|CAN_IT_EPV,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 ;               
}       



#if CAN1_RX0_INT_ENABLE        //ê1ÄüRX0ÖD¶Ï
//ÖD¶Ï·tÎñoˉêy                            
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]);
          CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
}
#endif

//can·¢&#203;íò&#187;×éêy&#190;Y(1ì&#182;¨&#184;&#241;ê&#189;:ID&#206;a0X12,±ê×&#188;&#214;&#161;,êy&#190;Y&#214;&#161;)       
//len:êy&#190;Y3¤&#182;è(×&#238;′ó&#206;a8)                                     
//msg:êy&#190;Y&#214;&#184;&#213;&#235;,×&#238;′ó&#206;a8&#184;&#246;×&#214;&#189;ú.
//·μ&#187;&#216;&#214;μ:0,3é1|;
//                 &#198;&#228;&#203;&#251;,ê§°ü;
u8 CAN1_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;         // ±ê×&#188;±êê&#182;·&#251;&#206;a0
  //TxMessage.ExtId=0x12;         // éè&#214;&#195;à&#169;&#213;1±êê&#190;·&#251;£¨29&#206;&#187;£&#169;
  TxMessage.IDE=CAN_ID_STD;                  // ê1ó&#195;à&#169;&#213;1±êê&#182;·&#251;
  TxMessage.RTR=CAN_RTR_DATA;                  // &#207;&#251;&#207;¢ààDí&#206;aêy&#190;Y&#214;&#161;£&#172;ò&#187;&#214;&#161;8&#206;&#187;
  TxMessage.DLC=len;                                                         // ·¢&#203;íá&#189;&#214;&#161;D&#197;&#207;¢
  for(i=0;i<len;i++)
  TxMessage.Data[i]=msg[i];                                 // μúò&#187;&#214;&#161;D&#197;&#207;¢         
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
        //while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //μè′y·¢&#203;í&#189;áê&#248;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed));        //μè′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 CAN1_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<RxMessage.DLC;i++)
    buf[i]=RxMessage.Data[i];  
        return RxMessage.DLC;       
}

发送板的主函数如下:

int main(void)
{       
        int i;
        u8 data[8];
         u8 data1[8];
//        while(SysTick_Config(SystemFrequency/1000));
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é&#206;a×é2£o2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
       
//        uart_init(9600);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
//        TIM3_Int_Init();
//        Adc_Init();
// fm24cl_Init();
//        EXTIX_Init();
//        LED_Init();
          Can1_Init();
         
         
         while(1)
         {
                        for(i=0;i<8;i++)
                                data[i]=i+1;
                 i=CAN1_Send_Msg(data,8);
                 if(i)
                         i=0;
//          i=CAN1_Receive_Msg(data1);
//          if(i)
//                  i=0;
                 delay_ms(10000);
                }
}

接收板的主函数如下:

int main(void)
{       
        int i;
        u8 data[8];
         u8 data1[8];
//        while(SysTick_Config(SystemFrequency/1000));
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é&#206;a×é2£o2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
       
//        uart_init(9600);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
//        TIM3_Int_Init();
//        Adc_Init();
// fm24cl_Init();
//        EXTIX_Init();
//        LED_Init();
          Can1_Init();
         
         
         while(1)
         {
                 
//                  printf("%d",1);
//                         for(i=0;i<8;i++)
//                                 data[i]=i+1;
//                  i=CAN1_Send_Msg(data,8);
//                  if(i)
         i=CAN1_Receive_Msg(data1);
                 if(i)
                 i=0;
        //         delay_ms(100);
                }
        }

有一段时间内,接收板用查询的方式能够接受到发送版发送过来的信息,但是中断接受不到。然后如果把接收板改成发送板,发送板为接收板,则接受不到。
但是某一次修改程序的时候,把接收板主函数里的if(i) i=0;改成if(i) i--;就接收不到了。然后重新改回去,还是接收不到。
在硬件部分,接收板与发送板的rx与tx端都有接指示灯。发送的时候,两块板的指示灯都会亮。
现在不知道问题出在哪里。希望各位大哥大姐给出自己的意见。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-4 21:15:00 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-10 19:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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