OpenEdv-开源电子网

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

请高人指点, 我是新人刚学CAN通讯。我用一块板是战舰一块是用STM32f103C8t6. 现在只能战舰发送到stm32c8t6接受。反过来发不...

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
47
金钱
47
注册时间
2016-8-30
在线时间
5 小时
发表于 2016-8-30 10:33:07 | 显示全部楼层 |阅读模式
#include "can.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEK¾«ó¢STM32¿a·¢°å
//CANÇy¶ˉ ′úÂë          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2012/9/11
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////
//CAN3õê¼»ˉ
//tsjw:ÖØDÂí¬2½ìøÔ¾ê±¼äμ¥Ôa.·¶Î§:CAN_SJW_1tq~ CAN_SJW_4tq
//tbs2:ê±¼ä¶Î2μÄê±¼äμ¥Ôa.   ·¶Î§:CAN_BS2_1tq~CAN_BS2_8tq;
//tbs1:ê±¼ä¶Î1μÄê±¼äμ¥Ôa.   ·¶Î§:CAN_BS1_1tq ~CAN_BS1_16tq
//brp :2¨ìØÂê·ÖÆμÆ÷.·¶Î§:1~1024;  tq=(brp)*tpclk1
//2¨ìØÂê=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
//mode:CAN_Mode_Normal,ÆÕí¨Ä£ê½;CAN_Mode_LoopBack,»Ø»·Ä£ê½;
//Fpclk1μÄê±ÖóÔú3õê¼»ˉμÄê±oòéèÖÃÎa36M,èç1ûéèÖÃCAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);
//Ôò2¨ìØÂêÎa:36M/((8+9+1)*4)=500Kbps
//·μ»ØÖμ:0,3õê¼»ˉOK;
//    ÆäËû,3õê¼»ˉê§°ü;




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);//ê1ÄüPORTAê±Öó                                                                                                                    


          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1Äü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);                //3õê¼»ˉIO
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//éÏà-êäèë
    GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉIO
          
        //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= 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=0xFFFF;////32λID
          CAN_FilterInitStructure.CAN_FilterIdLow=0xFFFF;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;//32λMASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
          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¶Ï
//ÖD¶Ï·tÎñoˉêy                            
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);
}
#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 Can_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;                                         // ±ê×&#188;±êê&#182;·&#251;
  TxMessage.ExtId=0x12;                                   // éè&#214;&#195;à&#169;&#213;1±êê&#190;·&#251;
  TxMessage.IDE=CAN_Id_Standard; // ±ê×&#188;&#214;&#161;
  TxMessage.RTR=CAN_RTR_Data;                 // êy&#190;Y&#214;&#161;
  TxMessage.DLC=len;                                                // òa·¢&#203;íμ&#196;êy&#190;Y3¤&#182;è
  for(i=0;i<len;i++)
  TxMessage.Data=msg;                                  
  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=RxMessage.Data;  
        return RxMessage.DLC;       
}




#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"         
#include "can.h"


/************************************************
ALIENTEK&#190;&#171;ó¢STM32&#191;a·¢°&#229;êμ&#209;é25
CAN êμ&#209;é   
&#188;&#188;ê&#245;&#214;§3&#214;£owww.openedv.com
ì&#212;±|μê&#198;ì£ohttp://eboard.taobao.com
1&#216;×¢&#206;¢D&#197;1&#171;&#214;ú&#198;&#189;ì¨&#206;¢D&#197;o&#197;£o"&#213;yμ&#227;&#212;-×ó"£&#172;&#195;a·&#209;&#187;&#241;è&#161;STM32×êá&#207;&#161;£
1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190;  
×÷&#213;&#223;£o&#213;yμ&#227;&#212;-×ó @ALIENTEK
************************************************/





int main(void)
{         
        u8 key;
        u8 i=0,t=0;
        u8 cnt=0;
        u8 canbuf[8];
        u8 res;
        u8 mode=CAN_Mode_LoopBack;//CAN1¤×÷&#196;£ê&#189;;CAN_Mode_Normal(0)£o&#198;&#213;í¨&#196;£ê&#189;£&#172;CAN_Mode_LoopBack(1)£o&#187;·&#187;&#216;&#196;£ê&#189;


        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
        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(115200);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
        LED_Init();                                  //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú                  
        KEY_Init();                                //°′&#188;ü3&#245;ê&#188;&#187;ˉ                        
   
        CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN3&#245;ê&#188;&#187;ˉ&#187;·&#187;&#216;&#196;£ê&#189;,2¨ì&#216;&#194;ê100Kbps   


       
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY4_PRES)//KEY0°′&#207;&#194;,·¢&#203;íò&#187;′&#206;êy&#190;Y
                { LED1=!LED1;
                        //for(i=0;i<8;i++){canbuf=1;}
                        canbuf=0x01;
                       
                        res=Can_Send_Msg(canbuf,8);//·¢&#203;í8&#184;&#246;×&#214;&#189;ú
                                                                  
                }else if(key==KEY3_PRES)//WK_UP°′&#207;&#194;£&#172;&#184;&#196;±&#228;CANμ&#196;1¤×÷&#196;£ê&#189;
                {          LED3=!LED3;
                        mode=!mode;
                          CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN&#198;&#213;í¨&#196;£ê&#189;3&#245;ê&#188;&#187;ˉ, 2¨ì&#216;&#194;ê500Kbps
                       
                }                 
                key=Can_Receive_Msg(canbuf);
                if(key)//&#189;óê&#213;μ&#189;óDêy&#190;Y
                {                       
                        LED2=!LED2;
                }
                t++;
                delay_ms(10);
                if(t==20)
                {
       
                        t=0;
                        cnt++;


                }                  
        }

}


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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 05:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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