急!急!急!各位大神帮我看看双节点CAN通讯为什么接不到数据啊

2019-07-20 19:27发布

原子哥,求助啊。


各位大神,我想使用两块STM32F407ZET6的板子通过CAN通讯,但是总借不到数据啊。请问为什么

这分别是我的 接收板和发送板的 MAIN.C  和CAN.C 的程序
***********************************接收板main.c************************************
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"

nt main(void)
{
        u8 key;
        u8 i=0,t=0;
        u8 cnt=0;
        u8 canbuf[8];
        u8 res;
        u8 mode=1;         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);   
        uart_init(115200);        
        LED_Init();                                                
        KEY_Init();                                 
        delay_ms(1000);
        cnt=CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);
  if(cnt==0)
        {printf("InitSuccess");}
  else printf("InitFail");        
        
while(1)
        {
                key=CAN1_Receive_Msg(canbuf);
                if(key!=0)
                {
                  printf("RECEIVED ");
                }
          else printf("NO  DATA ");

        delay_ms(1000);
                 
        }
        
}

*******************************接收板CAN.C***********************************
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);                                                                                                                    

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
        
  
          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;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);
         
        
           CAN_InitStructure.CAN_TTCM=DISABLE;        
          CAN_InitStructure.CAN_ABOM=DISABLE;        
          CAN_InitStructure.CAN_AWUM=DISABLE;
          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;        
          CAN_InitStructure.CAN_BS1=tbs1;
          CAN_InitStructure.CAN_BS2=tbs2;
          CAN_InitStructure.CAN_Prescaler=brp;         
          CAN_Init(CAN1, &CAN_InitStructure);  
        
          CAN_FilterInitStructure.CAN_FilterNumber=0;         
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
          CAN_FilterInit(&CAN_FilterInitStructure);
               
//#if CAN1_RX0_INT_ENABLE
        
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);            
  
          NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
//#endif
        return 0;
}   

//#if CAN1_RX0_INT_ENABLE        
                    
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 ",i,RxMessage.Data);
}

u8 CAN1_Receive_Msg(u8 *buf)
{                                      
        u32 i;
        CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;               
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
    for(i=0;i<RxMessage.DLC;i++)
    buf=RxMessage.Data;  
        return RxMessage.DLC;        
}
***************************发送板MAIN***********************************
int main(void)
{
        u8 key;
        u8 i=0,t=0;
        u8 cnt=0;
        u8 canbuf[8];
        u8 res;
        u8 mode=1;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);  
        uart_init(115200);        
        LED_Init();                                       
        KEY_Init();                        
        CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);  
        
        
while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)
                {
                        for(i=0;i<8;i++)
                        {
                                canbuf=cnt+i;
                        }
                        res=CAN1_Send_Msg(canbuf,8);
                                                   
                }
         
        }
}

**********************************发送版CAN.C********************************

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);                                                                                                                    

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
        
   
          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;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
         
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);
         
         
           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= mode;
          CAN_InitStructure.CAN_SJW=tsjw;        
          CAN_InitStructure.CAN_BS1=tbs1;
          CAN_InitStructure.CAN_BS2=tbs2;
          CAN_InitStructure.CAN_Prescaler=brp;         
          CAN_Init(CAN1, &CAN_InitStructure);  
   
            
          CAN_FilterInitStructure.CAN_FilterNumber=0;         
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
          CAN_FilterInit(&CAN_FilterInitStructure);
               
//#if CAN1_RX0_INT_ENABLE
        
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);            
  
          NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
//#endif
        return 0;
}   

//#if CAN1_RX0_INT_ENABLE        
                    
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 ",i,RxMessage.Data);
}
//#endif


u8 CAN1_Send_Msg(u8* msg,u8 len)
{        
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;         
  TxMessage.ExtId=0x12;
  TxMessage.IDE=0;               
  TxMessage.RTR=0;               
  TxMessage.DLC=len;                                                        
  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++;        
  if(i>=0XFFF)return 1;
  return 0;               

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
ProMethus
1楼-- · 2019-07-20 21:47
已经解决了。是TJA1050的问题
jxhzht1990
2楼-- · 2019-07-21 00:58
 精彩回答 2  元偷偷看……
ProMethus
3楼-- · 2019-07-21 06:57
jxhzht1990 发表于 2016-10-19 21:38
应该对比下原子哥的例子程序,除此之外可以先自查下线路两端有没有接入120欧姆的终端电阻。您这时钟看起来 ...

我就是用原子哥的例程改的,两块板子外接TJA1050模块。但不知道为什么无法通讯

一周热门 更多>