OpenEdv-开源电子网

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

关于stm32f407与stm32f103c8t6之间的can通信问题

[复制链接]

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
发表于 2016-5-9 11:30:11 | 显示全部楼层 |阅读模式
5金钱
原子哥及诸位大神,小弟于前些时日学习can通信实验,由于苦于只有一个探索者407开发板(can驱动芯片tja1050),在回环模式测试合格之后,想试一下双机通信,于是在网上购买了一个can转接板,芯片是stm32f103c8t6,驱动芯片是vp230。到手之后编写了103程序,测试回环合适,两个机子在单步状态下均观测了tx数据register和rx数据register,都可以看到有正确的数据变化。于是将双机连线,修改模式为normal。但是只能观测到数据发送,始终收不到数据。连续几日,颇为困恼。下面是我的程序,请原子哥和大家帮小弟看一下,到底是哪里出了问题。万分感谢。
407程序:#include"lwj_can.h"
#include"led.h"
#include"delay.h"
#include"usart.h"
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs1,u8 tbs2,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
        //ê1Äüê±Öó
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
        //GPIO¿ú3õê¼»ˉ
         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;//¶Ë¿ú¸′óÃÄ£ê½
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
       
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //òy½Å¸′óÃó3éäÅäÖÃ
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);
        //CAN 3õê¼»ˉ
        CAN_InitStructure.CAN_ABOM=DISABLE;//èí¼t×Ô¶ˉàëÏß1üàí
        CAN_InitStructure.CAN_AWUM=DISABLE;//ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ
        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_Mode=mode;//·¢ËíÄ£ê½ÇD»»
        CAN_InitStructure.CAN_NART=ENABLE;//½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí
        CAN_InitStructure.CAN_Prescaler=brp;//·ÖÆμÏμêyÎabrp+1£»
        CAN_InitStructure.CAN_RFLM=DISABLE;//±¨ÎÄ2»Ëø¶¨£¬DÂμĸ2¸Ç¾éμÄ
        CAN_InitStructure.CAN_SJW=tsjw;//ÖØDÂí¬2½ìøÔ¾¿í¶è
        CAN_InitStructure.CAN_TTCM=DISABLE;//·Çê±¼ä′¥·¢í¨DÅÄ£ê½
        CAN_InitStructure.CAN_TXFP=DISABLE;//óÅÏè¼¶ó鱨Îıêê¶·û¾ö¶¨
        CAN_Init(CAN1,&CAN_InitStructure);//3õê¼»ˉCAN1
       
        CAN_FilterInitStructure.CAN_FilterNumber=0;//Ñ¡Ôñ1yÂËÆ÷×é0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//¼¤»î1yÂËÆ××é0
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1yÂËÆ÷×é01Øáaμ½FIFO0
        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//32λID£¨±êê¶·û£©
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32λÆá±ÎÂ루ÑúÂ룩
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//±êê¶·ûÑúÂëÄ£ê½
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//ò»¸ö32λé¸Ñ¡Æ÷°üà¨ò»¸ö32λμıêê¶·û¼Ä′æÆ÷oíò»¸ö32λμÄÑúÂë¼Ä′æÆ÷
        CAN_FilterInit(&CAN_FilterInitStructure);//3õê¼»ˉ1yÂËÆ÷
       
       
        #if CAN1_RX0_INT_ENABLE
       
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0ÏûÏ¢1òoÅÖD¶ÏÔêDí.                    

          NVIC_InitStructure.NVIC_IRQChannel = 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 CAN1_RX0_INT_ENABLE        //ê1ÄüRX0ÖD¶Ï
//ÖD¶Ï·tÎñoˉêy                            
void 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

u8 CAN1_Send_Msg(u8 *msg,u8 len)
{
u8 mbox;
        u16 i;
        CanTxMsg TxMessage;

        TxMessage.DLC=len;
        TxMessage.ExtId=0x0008;//óéóú&#199;°&#195;&#230;éè&#214;&#195;1y&#194;&#203;&#198;÷μ&#196;&#209;ú&#194;&#235;&#206;&#187;0x0000£&#172;ò2&#190;íê&#199;&#203;μ·¢&#203;íêy&#190;Yμ&#196;±êê&#182;·&#251;μ&#196;&#203;ùóD&#206;&#187;&#182;&#188;±&#187;&#198;á±&#206;£&#172;·¢&#203;íê2&#195;′&#182;&#188;&#191;éò&#212;&#189;óêüμ&#189;&#161;£
        TxMessage.IDE=0;//ê1ó&#195;à&#169;&#213;1±êê&#182;·&#251;
        TxMessage.RTR=0;//·¢&#203;íêy&#190;Y&#214;&#161;
        TxMessage.StdId=0x0009;//±ê×&#188;±êê&#182;·&#251;
        for(i=0;i<len;i++){
        TxMessage.Data=msg;}//·¢&#203;íêy&#190;Y
  mbox=CAN_Transmit(CAN1,&TxMessage);//&#209;&#161;&#212;&#241;ò&#187;&#184;&#246;&#191;&#213;óê&#207;&#228;£&#172;2¢&#189;&#171;ID£&#172;DLCoí·¢&#203;íêy&#190;Y×°è&#235;óê&#207;&#228;£&#172;í&#172;ê±·μ&#187;&#216;±&#187;ê1ó&#195;μ&#196;óê&#207;&#228;number
while((CAN_TransmitStatus(CAN1,mbox)==CAN_TxStatus_Failed)&&(i<0xfff))i++;//è&#231;1&#251;&#195;&#187;óD·¢&#203;ííê3é£&#172;&#212;òμè′y&#188;ìD&#248;·¢&#203;í
        if(i>=0xfff)return 0;
return 1;
}
u8 CAN1_Receive_Msg(u8 *buf)
{
u32 i;
        CanRxMsg RxMessage;
        if(CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;//fifoóê&#207;&#228;&#189;óê&#213;×′ì&#172;±ê&#214;&#190;£&#172;·μ&#187;&#216;pending_1&#187;òpending_2&#187;òpending_3
                                                  //£&#172;è&#231;1&#251;·μ&#187;&#216;0&#212;ò±íê&#190;&#195;&#187;óDê&#213;μ&#189;êy&#190;Y
        CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);//&#189;óê&#213;êy&#190;Yμ&#189;fifo0óê&#207;&#228;£&#172;2¢&#189;&#171;êy&#190;Y·&#197;&#212;úRxMessage.data
        for(i=0;i<RxMessage.DLC;i++)
                buf=RxMessage.Data;//&#189;&#171;êy&#190;Y·&#197;μ&#189;êy&#190;Y&#187;o3&#229;buf&#214;D
        return RxMessage.DLC;//·μ&#187;&#216;&#189;óê&#213;êy&#190;Yμ&#196;3¤&#182;è
       

}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "lwj_can.h"
//ALIENTEK ì&#189;&#203;÷&#213;&#223;STM32F407&#191;a·¢°&#229; êμ&#209;é27
//CANí¨D&#197;êμ&#209;é-&#191;aoˉêy°&#230;±&#190;
//&#188;&#188;ê&#245;&#214;§3&#214;£owww.openedv.com
//ì&#212;±|μê&#198;ì£ohttp://eboard.taobao.com  
//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=0,key1=0;
        u8 i=0,t=0;
        u8 cnt=0;
        u8 canbuf[8]={0};
        u8 res=0;
        u8 mode=0;//CAN1¤×÷&#196;£ê&#189;;0,&#198;&#213;í¨&#196;£ê&#189;;1,&#187;·&#187;&#216;&#196;£ê&#189;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#207;μí3&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é2
        delay_init(168);    //3&#245;ê&#188;&#187;ˉ&#209;óê±oˉêy
        uart_init(115200);        //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú2¨ì&#216;&#194;ê&#206;a115200
        LED_Init();                                        //3&#245;ê&#188;&#187;ˉLED
        LCD_Init();                                        //LCD3&#245;ê&#188;&#187;ˉ
        KEY_Init();                                 //°′&#188;ü3&#245;ê&#188;&#187;ˉ  
        CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,mode);//CAN3&#245;ê&#188;&#187;ˉ&#187;·&#187;&#216;&#196;£ê&#189;,2¨ì&#216;&#194;ê500Kbps   
        POINT_COLOR=GREEN;//éè&#214;&#195;×&#214;ì&#229;&#206;aoìé&#171;
        LCD_ShowString(40,50,200,16,16,"Explorer STM32F4");       
        LCD_ShowString(30,70,200,16,16,"liweijie_can");       
        LCD_ShowString(30,90,200,16,16,"LanzhouJiaotong University");
        LCD_ShowString(30,110,200,16,16,"2016/1/15");
        LCD_ShowString(30,130,200,16,16,"LoopBack Mode");         
        LCD_ShowString(30,150,200,16,16,"KEY0:Send WK_UP:Mode");//&#207;&#212;ê&#190;ìáê&#190;D&#197;&#207;¢               
  POINT_COLOR=BLUE;//éè&#214;&#195;×&#214;ì&#229;&#206;aà&#182;é&#171;          
        LCD_ShowString(30,170,200,16,16,"Count:");                          //&#207;&#212;ê&#190;μ±&#199;°&#188;&#198;êy&#214;μ       
        LCD_ShowString(30,190,200,16,16,"Send Data:");                //ìáê&#190;·¢&#203;íμ&#196;êy&#190;Y       
        LCD_ShowString(30,250,200,16,16,"Receive Data:");        //ìáê&#190;&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y               
                                                                          
while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)//KEY0°′&#207;&#194;,·¢&#203;íò&#187;′&#206;êy&#190;Y
                {
                        for(i=0;i<8;i++)
                        {
                                canbuf=cnt+i;//ì&#238;3&#228;·¢&#203;í&#187;o3&#229;&#199;&#248;
                                if(i<4)LCD_ShowxNum(30+i*32,210,canbuf,3,16,0X80);          //&#207;&#212;ê&#190;êy&#190;Y
                                else LCD_ShowxNum(30+(i-4)*32,230,canbuf,3,16,0X80);        //&#207;&#212;ê&#190;êy&#190;Y
                                //POINT_COLOR=YELLOW;//éè&#214;&#195;×&#214;ì&#229;&#206;aà&#182;é&#171;
                        }
                        res=CAN1_Send_Msg(canbuf,8);//·¢&#203;í8&#184;&#246;×&#214;&#189;ú £&#172;·¢&#203;í3é1|·μ&#187;&#216;1.ê§°ü·μ&#187;&#216;0.
                        if(res)LCD_ShowString(30+80,190,200,16,16,"Failed");                //ìáê&#190;·¢&#203;íê§°ü£&#172;
                        else LCD_ShowString(30+80,190,200,16,16,"OK    ");                         //ìáê&#190;·¢&#203;í3é1|                                                                  
                }else if(key==WKUP_PRES)//WK_UP°′&#207;&#194;£&#172;&#184;&#196;±&#228;CANμ&#196;1¤×÷&#196;£ê&#189;
                {          
                        mode=!mode;
                        CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,mode);        //CAN&#198;&#213;í¨&#196;£ê&#189;3&#245;ê&#188;&#187;ˉ,&#198;&#213;í¨&#196;£ê&#189;,2¨ì&#216;&#194;ê500Kbps
                          POINT_COLOR=RED;//éè&#214;&#195;×&#214;ì&#229;&#206;aoìé&#171;
                        if(mode==0)//&#198;&#213;í¨&#196;£ê&#189;£&#172;Dèòa2&#184;&#246;&#191;a·¢°&#229;
                        {
                                LCD_ShowString(30,130,200,16,16,"Nnormal Mode ");            
                        }else //&#187;&#216;&#187;·&#196;£ê&#189;,ò&#187;&#184;&#246;&#191;a·¢°&#229;&#190;í&#191;éò&#212;2aê&#212;á&#203;.
                        {
                                LCD_ShowString(30,130,200,16,16,"LoopBack Mode");
                        }
                        POINT_COLOR=RED;//éè&#214;&#195;×&#214;ì&#229;&#206;aà&#182;é&#171;
                }                 
                key1=CAN1_Receive_Msg(canbuf);//&#189;óêü3é1|·μ&#187;&#216;&#189;óêüêy&#190;Y3¤&#182;èRxMessage.DLC
                if(key1)//&#189;óê&#213;μ&#189;óDêy&#190;Y
                {                       
                        LCD_Fill(30,270,160,310,YELLOW);//&#199;&#229;3y&#214;&#174;&#199;°μ&#196;&#207;&#212;ê&#190;
                        for(i=0;i<key;i++)
                        {                                                                            
                                if(i<4)LCD_ShowxNum(30+i*32,270,canbuf,3,16,0X80);        //&#207;&#212;ê&#190;êy&#190;Y
                                else LCD_ShowxNum(30+(i-4)*32,290,canbuf,3,16,0X80);        //&#207;&#212;ê&#190;êy&#190;Y
                        }
                }
                t++;
                delay_ms(10);
                if(t==20)
                {
                        LED0=!LED0;//ìáê&#190;&#207;μí3&#213;y&#212;ú&#212;&#203;DD       
                        t=0;
                        cnt++;
                        LCD_ShowxNum(30+48,170,cnt,3,16,0X80);        //&#207;&#212;ê&#190;êy&#190;Y
                }                  
        }
       
}



103c8t6程序
#include"delay.h"
#include"sys.h"
#include"usart.h"
#include"can_lwj.h"

u8 CAN_Mode_Init(u8 tsjw,u8 tbs1,u8 tbs2,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
        CAN_InitTypeDef CAN_InitStructre;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//ê1&#196;üGPIOBê±&#214;ó

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);//ê1&#196;ücanê±&#214;ó
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
       
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//&#189;óêüòy&#189;&#197;&#206;&#187;é&#207;à-ê&#228;è&#235;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//·¢&#203;íòy&#189;&#197;&#184;′ó&#195;&#206;&#187;í&#198;íì£&#172;2&#187;ó&#195;&#214;&#216;D&#194inAFConfig();
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
//can&#197;&#228;&#214;&#195;
        CAN_InitStructre.CAN_ABOM=DISABLE;//èí&#188;t×&#212;&#182;ˉà&#235;&#207;&#223;1üàí
        CAN_InitStructre.CAN_AWUM=DISABLE;//&#203;ˉ&#195;&#223;&#196;£ê&#189;í¨1yèí&#188;t&#187;&#189;D&#209;£¨&#199;&#229;3ycan&#161;a&#161;amcrμ&#196;sleep&#206;&#187;£&#169;
        CAN_InitStructre.CAN_Mode=mode;
        CAN_InitStructre.CAN_NART=ENABLE;//&#189;&#251;&#214;1±¨&#206;&#196;×&#212;&#182;ˉ·¢&#203;í
        CAN_InitStructre.CAN_RFLM=DISABLE;//±¨&#206;&#196;2&#187;&#203;&#248;&#182;¨£&#172;D&#194;μ&#196;&#184;2&#184;&#199;&#190;éμ&#196;
  CAN_InitStructre.CAN_TTCM=DISABLE;//·&#199;ê±&#188;&#228;′¥·¢í¨D&#197;&#196;£ê&#189;
        CAN_InitStructre.CAN_TXFP=DISABLE;//±¨&#206;&#196;ó&#197;&#207;è&#188;&#182;ó鱨&#206;&#196;±êê&#182;·&#251;&#190;&#246;&#182;¨
        //2¨ì&#216;&#194;êéè&#214;&#195;
        CAN_InitStructre.CAN_BS1=tbs1;
        CAN_InitStructre.CAN_BS2=tbs2;
        CAN_InitStructre.CAN_Prescaler=brp;
        CAN_InitStructre.CAN_SJW=tsjw;
        CAN_Init(CAN1,&CAN_InitStructre);
        //filter&#197;&#228;&#214;&#195;
       
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//&#188;¤&#187;&#238;é&#184;&#209;&#161;&#198;÷×é0
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//&#189;&#171;fifo01&#216;áaμ&#189;é&#184;&#209;&#161;&#198;÷
        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterNumber=0;
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
        CAN_FilterInit(&CAN_FilterInitStructure);
       
        return 0;
}

u8 CAN_Send_Msg(u8 *msg,u8 len)
{
u8 mbox;
        u16 i;
        CanTxMsg TxMessage;

        TxMessage.DLC=len;
        TxMessage.ExtId=0x0008;//óéóú&#199;°&#195;&#230;éè&#214;&#195;1y&#194;&#203;&#198;÷μ&#196;&#209;ú&#194;&#235;&#206;&#187;0x0000£&#172;ò2&#190;íê&#199;&#203;μ·¢&#203;íêy&#190;Yμ&#196;±êê&#182;·&#251;μ&#196;&#203;ùóD&#206;&#187;&#182;&#188;±&#187;&#198;á±&#206;£&#172;·¢&#203;íê2&#195;′&#182;&#188;&#191;éò&#212;&#189;óêüμ&#189;&#161;£
        TxMessage.IDE=0;//ê1ó&#195;à&#169;&#213;1±êê&#182;·&#251;
        TxMessage.RTR=0;//·¢&#203;íêy&#190;Y&#214;&#161;
        TxMessage.StdId=0x0009;//±ê×&#188;±êê&#182;·&#251;
        for(i=0;i<len;i++){
        TxMessage.Data=msg;}//·¢&#203;íêy&#190;Y
  mbox=CAN_Transmit(CAN1,&TxMessage);//&#209;&#161;&#212;&#241;ò&#187;&#184;&#246;&#191;&#213;óê&#207;&#228;£&#172;2¢&#189;&#171;ID£&#172;DLCoí·¢&#203;íêy&#190;Y×°è&#235;óê&#207;&#228;£&#172;í&#172;ê±·μ&#187;&#216;±&#187;ê1ó&#195;μ&#196;óê&#207;&#228;number
while((CAN_TransmitStatus(CAN1,mbox)==CAN_TxStatus_Failed)&&(i<0xfff))i++;//è&#231;1&#251;&#195;&#187;óD·¢&#203;ííê3é£&#172;&#212;òμè′y&#188;ìD&#248;·¢&#203;í
        if(i>=0xfff)return 0;//·¢&#203;íê§°ü·μ&#187;&#216;1
return 1;//·¢&#203;í3é1|·μ&#187;&#216;0
}
u8 CAN_Receive_Msg(u8 *buf)
{
u32 i;
        CanRxMsg RxMessage;
        if(CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;//fifoóê&#207;&#228;&#189;óê&#213;×′ì&#172;±ê&#214;&#190;£&#172;·μ&#187;&#216;pending_1&#187;òpending_2&#187;òpending_3£&#172;è&#231;1&#251;·μ&#187;&#216;0&#212;ò±íê&#190;&#195;&#187;óDê&#213;μ&#189;êy&#190;Y
  CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);//&#189;óê&#213;êy&#190;Yμ&#189;fifo0óê&#207;&#228;£&#172;2¢&#189;&#171;êy&#190;Y·&#197;&#212;úRxMessage.data
        for(i=0;i<RxMessage.DLC;i++)
                buf=RxMessage.Data;//&#189;&#171;êy&#190;Y·&#197;μ&#189;êy&#190;Y&#187;o3&#229;buf&#214;D
        return RxMessage.DLC;//·μ&#187;&#216;&#189;óê&#213;êy&#190;Yμ&#196;3¤&#182;è
       

}

#include"delay.h"
#include"sys.h"
#include"can_lwj.h"

int main()
{

  u8 key=0;
        u8 i=0;
        u8 canbuf[8];
        u8 canbuf103[8];
        u8 res=0;
        u8 mode=CAN_Mode_Normal;//CAN1¤×÷&#196;£ê&#189;;CAN_Mode_Normal(0)£o&#198;&#213;í¨&#196;£ê&#189;£&#172;CAN_Mode_LoopBack(1)£o&#187;·&#187;&#216;&#196;£ê&#189;
       
       
        //&#197;&#228;&#214;&#195;Dèòaó&#195;μ&#189;μ&#196;°′&#188;ü&#188;°&#214;&#184;ê&#190;μ&#198;
        GPIO_InitTypeDef GPIO_InitStructure;
        delay_init();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//ê1&#196;üGPIOAê±&#214;ó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//ê1&#196;üGPIOBê±&#214;ó

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//&#207;&#194;à-ê&#228;è&#235;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);//éè&#214;&#195;p1.0&#206;a°′&#188;ü
       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;//&#182;&#212;ó|p0.0,p0.1,p0.2,p0.3
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);//éè&#214;&#195;p0.0£&#172;p0.1£&#172;p0.2,p0.3&#206;a&#214;&#184;ê&#190;μ&#198;
       
        CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//éè&#214;&#195;&#206;a&#213;y3£&#196;£ê&#189;£&#172;2¨ì&#216;&#194;ê500kbps
        GPIO_SetBits(GPIOB,GPIO_Pin_15);//éè&#214;&#195B8&#188;′p0^0&#206;a&#184;&#223;μ&#231;&#198;&#189;£&#172;ìáê&#190;&#207;μí3&#213;y&#212;ú&#212;&#203;DD
        for(i=0;i<8;i++){canbuf=i;}
        while(1)
        {
               
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)//&#197;D&#182;&#207A0ê&#199;·&#241;°′&#207;&#194;£&#172;ò2&#188;′p1^0£&#172;μíμ&#231;&#198;&#189;óDD§
             {
                                 delay_ms(10);
                                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)//&#207;&#251;&#182;&#182;
                                 {
                                 res=CAN_Send_Msg(canbuf,8);//·¢&#203;íêy&#190;Y£&#172;è&#231;1&#251;·¢&#203;í3é1|&#212;ò·μ&#187;&#216;1£&#172;ê§°ü·μ&#187;&#216;0
                                         delay_ms(500);
                                         if(!res)GPIO_SetBits(GPIOB,GPIO_Pin_14);//·¢&#203;íê§°ü£&#172;éè&#214;&#195;p0^1&#206;a&#184;&#223;μ&#231;&#198;&#189;£&#172;μ&#227;ááled
                                         else{   u8 t;
                                                 for(t=0;t<3;t++)//·¢&#203;í3é1|£&#172;p0^2éá&#203;&#184;3&#207;&#194;
                                                 {
                                                 GPIO_ResetBits(GPIOB,GPIO_Pin_13);
                                                 delay_ms(500);
                                         GPIO_SetBits(GPIOB,GPIO_Pin_13);
                                                         delay_ms(500);
                                                         if(t==3)t=0;
                                                 }
                                                 GPIO_ResetBits(GPIOB,GPIO_Pin_13);
                                         }
                                 }
       
       
             }
        key=CAN_Receive_Msg(canbuf103);//&#189;óê&#213;êy&#190;Y£&#172;2¢&#199;ò&#189;&#171;·μ&#187;&#216;μ&#196;êy&#190;Y3¤&#182;è&#184;3&#214;μ&#184;&#248;key
                         if(key){//è&#231;1&#251;&#189;óê&#213;μ&#189;êy&#190;Y
                          u8 t;
                                                 for(t=0;t<2;t++)//407·¢&#203;í3é1|103&#189;óêü3é1|£&#172;p0^3éá&#203;&#184;5&#207;&#194;
                                                 {
                                                 GPIO_ResetBits(GPIOB,GPIO_Pin_12);
                                                 delay_ms(1000);
                                         GPIO_SetBits(GPIOB,GPIO_Pin_12);
                                                         delay_ms(1000);
                                                         if(t==2)t=0;
                                                 }
                         GPIO_ResetBits(GPIOB,GPIO_Pin_12);
                         
                         
                         
                         }
       
       
        }

}

等待大家帮小弟这个大忙。大家相互学习。期待中。。。。。

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

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-9 11:32:10 | 显示全部楼层
小弟再补充一下,关于120欧姆电阻的问题,我的can转接板是没有120欧姆电阻的,但是原子的407开发板是在canL \canH之间有一个120欧姆的电阻。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-9 11:32:29 | 显示全部楼层
小弟再补充一下,关于120欧姆电阻的问题,我的can转接板是没有120欧姆电阻的,但是原子的407开发板是在canL \canH之间有一个120欧姆的电阻。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-9 11:47:06 | 显示全部楼层
这个是我使用的转接板,用一个51单片机的开发板转接的。另一张图片是我的实物测试连线图。
QQ截图20160509113327.png
20160509_113536.jpg
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-9 11:56:30 | 显示全部楼层
关于407和103到底能不能通信的问题,有一篇博客,该作者最后验证407和103由于时序的问题,很难将波特率一致,故而不能通信。http://blog.sina.com.cn/s/blog_a189aca10102vp92.html。请大家指教,到底这样的事情能不能搞通,希望能彻底解决can的通信困扰。相互学习。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-9 11:59:18 | 显示全部楼层
自己顶!为了学习!为了知识!为了真理!
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-9 21:42:31 | 显示全部楼层
不要沉了。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-10 20:38:03 | 显示全部楼层
要沉了,,,不要呀!!!
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-11 15:09:39 | 显示全部楼层
原子哥,你在哪里啊。求帮忙啊。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-5-11 19:51:59 | 显示全部楼层
检查波特率设置吧。 只要波特率设置正确一般都是没问题的。  另外,如果实在不行,找个CAN协议分析仪,来调试下吧。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-2-29
在线时间
41 小时
 楼主| 发表于 2016-5-12 18:19:27 | 显示全部楼层
正点原子 发表于 2016-5-11 19:51
检查波特率设置吧。 只要波特率设置正确一般都是没问题的。  另外,如果实在不行,找个CAN协议分析仪,来调 ...

谢谢原子哥,前面写的确实波特率计算有些错误,现在修改均为500kbps,依旧不行。没有can协议分析仪,还有什么其他方法吗?
407:
42/((1+7+6)*(5+1))=0.5
103:
36/((1+9+8)*(3+1))=0.5
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-5-13 20:43:30 | 显示全部楼层
二十一画生了 发表于 2016-5-12 18:19
谢谢原子哥,前面写的确实波特率计算有些错误,现在修改均为500kbps,依旧不行。没有can协议分析仪,还有 ...

没有的话,不好说,找两个一样的板子试试先了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2016-6-1 22:13:27 | 显示全部楼层
不知楼主解决了没, 我也是遇到同样的问题,stm32f407ZGT6 +TJA1050,stm32f103VBT6+TJA1050, 回环测试都没问题(发现回环测试不加1050也可以,表示不解),波特率407:42/((1+7+6)*6)=0.5K ; 103:36/((1+5+6)*6)=0.5K  
407(正常模式或回环模式)发送给103(正常模式)情况下,偶尔成功
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2021-4-30
在线时间
0 小时
发表于 2021-4-30 00:27:48 来自手机 | 显示全部楼层
如果波特率都设置好了,会不会是屏蔽过滤器没配置好
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 19:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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