野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14790|回复: 2

can通讯不成功

[复制链接]
发表于 2017-8-12 20:08:08 | 显示全部楼层 |阅读模式
1火花
用教程里的can回环测试没问题,新做的板子用的是STM32F103R8T6 收发模块用的TJA1050  CAN TX PA12 RXPA11 用的内部晶振总线频率64M,按照教程里的配置1M波特率始终无法和霸道实验板通讯 麻烦大神看看配置哪里出了问题

#include "bsp_can.h"
#include "led.h"
char CAN_data[]="ABCD1234";

/*
* 函数名:CAN_GPIO_Config
* 描述  :CAN的GPIO 配置
* 输入  :无
* 输出  : 无
* 调用  :内部调用
*/
static void CAN_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;          

  /* Enable GPIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
       
        //重映射引脚
//        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);

         /* Configure CAN TX pins */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         // 复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Configure CAN RX  pins */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                     // 上拉输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);

       
}

/*
* 函数名:CAN_NVIC_Config
* 描述  :CAN的NVIC 配置,第1优先级组,0,0优先级
* 输入  :无
* 输出  : 无
* 调用  :内部调用
*/
static void CAN_NVIC_Config(void)
{
           NVIC_InitTypeDef NVIC_InitStructure;
                /* Configure one bit for preemption priority */
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
                 /*中断设置*/
                NVIC_InitStructure.NVIC_IRQChannel = CAN_RX_IRQ;           //CAN1 RX0中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                   //抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                           //子优先级为0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*
* 函数名:CAN_Mode_Config
* 描述  :CAN的模式 配置
* 输入  :无
* 输出  : 无
* 调用  :内部调用
*/
static void CAN_Mode_Config(void)
{
        CAN_InitTypeDef        CAN_InitStructure;
        /************************CAN通信参数设置**********************************/
        /* Enable CAN clock */
  RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

        /*CAN寄存器初始化*/
        CAN_DeInit(CANx);
        CAN_StructInit(&CAN_InitStructure);

        /*CAN单元初始化*/
        CAN_InitStructure.CAN_TTCM=DISABLE;                           //MCR-TTCM  关闭时间触发通信模式使能
        CAN_InitStructure.CAN_ABOM=ENABLE;                           //MCR-ABOM  自动离线管理
        CAN_InitStructure.CAN_AWUM=ENABLE;                           //MCR-AWUM  使用自动唤醒模式
        CAN_InitStructure.CAN_NART=DISABLE;                           //MCR-NART  禁止报文自动重传          DISABLE-自动重传
        CAN_InitStructure.CAN_RFLM=DISABLE;                           //MCR-RFLM  接收FIFO 锁定模式  DISABLE-溢出时新报文会覆盖原有报文  
        CAN_InitStructure.CAN_TXFP=DISABLE;                           //MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;  //正常工作模式 CAN_Mode_Normal      回环 CAN_Mode_LoopBack
        CAN_InitStructure.CAN_SJW=CAN_SJW_2tq;                   //BTR-SJW 重新同步跳跃宽度 2个时间单元
         
        /* ss=1 bs1=5 bs2=3 位时间宽度为(1+10+5) 波特率即为时钟周期tq*(1+3+5)  */
        CAN_InitStructure.CAN_BS1=CAN_BS1_10tq;                   //BTR-TS1 时间段1 占用了10个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_5tq;                   //BTR-TS1 时间段2 占用了5个时间单元       
       
        /* CAN Baudrate = 1 MBps (1MBps已为stm32的CAN最高速率) (CAN 时钟频率为 APB1 = 32 MHz) */
        CAN_InitStructure.CAN_Prescaler =2;                   ////BTR-BRP 波特率分频器  定义了时间单元的时间长度 32/(1+10+5)/2=1 Mbps
        CAN_Init(CANx, &CAN_InitStructure);
}

/*
* 函数名:CAN_Filter_Config
* 描述  :CAN的过滤器 配置
* 输入  :无
* 输出  : 无
* 调用  :内部调用
*/
static void CAN_Filter_Config(void)
{
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;

        /*CAN筛选器初始化*/
        CAN_FilterInitStructure.CAN_FilterNumber=0;                                                //筛选器组0
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;        //工作在掩码模式
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;        //筛选器位宽为单个32位。
//                CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;        //筛选器位宽为单个16位。

        /* 使能筛选器,按照标志的内容进行比对筛选,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
   //要筛选的ID 高位,第0 位保留,第1 位为RTR 标志,第2 位为IDE 标志,从第3 位开始是EXID
        CAN_FilterInitStructure.CAN_FilterIdHigh= ((((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF0000)>>16;                //要筛选的ID高位

        CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要筛选的ID低位

//        CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0xFFFF;                        //筛选器高16位每位必须匹配
                CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0X00;                        //筛选器高16位每位必须匹配

//        CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0xFFFF;                        //筛选器低16位每位必须匹配
        CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0x00;                        //筛选器低16位每位必须匹配
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ;                                //筛选器被关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                        //使能筛选器
        CAN_FilterInit(&CAN_FilterInitStructure);
        /*CAN通信中断使能*/
        CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);
}


/*
* 函数名:CAN_Config
* 描述  :完整配置CAN的功能
* 输入  :无
* 输出  : 无
* 调用  :外部调用
*/
void CAN_Config(void)
{
  CAN_GPIO_Config();
  CAN_NVIC_Config();
  CAN_Mode_Config();
  CAN_Filter_Config();   
}


/**
  * @brief  初始化 Rx Message数据结构体
  * @param  RxMessage: 指向要初始化的数据结构体
  * @retval None
  */
void Init_RxMes(CanRxMsg *RxMessage)
{
  uint8_t ubCounter = 0;

        /*把接收结构体清零*/
  RxMessage->StdId = 0x00;
  RxMessage->ExtId = 0x00;
  RxMessage->IDE = CAN_ID_STD; // 扩展 CAN_ID_EXT  标准 CAN_ID_STD
  RxMessage->DLC = 0;
  RxMessage->FMI = 0;
  for (ubCounter = 0; ubCounter < 8; ubCounter++)
  {
    RxMessage->Data[ubCounter] = 0x00;
  }
}


/*
* 函数名:CAN_SetMsg
* 描述  :CAN通信报文内容设置,设置一个数据内容为0-7的数据包
* 输入  :发送报文结构体
* 输出  : 无
* 调用  :外部调用
*/         
void CAN_SetMsg(CanTxMsg *TxMessage)
{          
        uint8_t ubCounter = 0;

//  TxMessage->StdId=0x1314;                                                 
  TxMessage->ExtId=0x1314;                                         //使用的扩展ID
  TxMessage->IDE=CAN_ID_EXT;                                         //扩展模式
//        TxMessage->IDE= CAN_ID_STD;
  TxMessage->RTR=CAN_RTR_DATA;                                 //发送的是数据
  TxMessage->DLC=8;                                                         //数据长度为8字节
       
        /*设置要发送的数据0-7*/
        for (ubCounter = 0; ubCounter < 8; ubCounter++)
  {
//    TxMessage->Data[ubCounter] = ubCounter;
                TxMessage->Data[ubCounter] = CAN_data[ubCounter];
  }
}

extern __IO uint32_t flag ;                 //用于标志是否接收到数据,在中断函数中赋值
extern CanRxMsg RxMessage;                                 //接收缓冲区

void CAN_RX_IRQHandler(void)
{
        /*从邮箱中读出报文*/
        CAN_Receive(CANx, CAN_FIFO0, &RxMessage);

   printf("%s\r\n",RxMessage.Data);       
        /* 比较ID是否为0x1314 */
        if((RxMessage.ExtId==0x1314) && (RxMessage.IDE==CAN_ID_EXT) && (RxMessage.DLC==8) )
        {
                                                //接收成功  

        }
        else
        {
                                                     //接收失败
        }
}
/**************************END OF FILE************************************/












回复

使用道具 举报

发表于 2017-8-14 09:04:58 | 显示全部楼层
用内部晶振搞出来的波特率不一样的
回复

使用道具 举报

发表于 2017-8-14 11:55:46 | 显示全部楼层
估计是波特率的问题
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-1 23:35 , Processed in 0.026514 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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