OpenEdv-开源电子网

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

STM32F072can总线收发问题

[复制链接]

3

主题

4

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2021-1-7
在线时间
7 小时
发表于 2021-1-7 22:04:14 | 显示全部楼层 |阅读模式
用的cubemax库can收发器用的tja1042,回环模式下收发正常也能触发cec_can_handle,但是跟can盒通讯的时候会出现两个问题,第一个问题是开始发的16条数据,can盒收不到数据,波形如下,第二个问题是can盒发送,不触发中断,并且cantest显示发送失败

can盒能接受到数据但是tsr寄存器还是显示erro

can盒能接受到数据但是tsr寄存器还是显示erro

前面16次发送失败的波形,tsr寄存器显示erro

前面16次发送失败的波形,tsr寄存器显示erro
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

4

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2021-1-7
在线时间
7 小时
 楼主| 发表于 2021-1-7 22:06:13 | 显示全部楼层
代码用的是hal库void filter1_init(void)
{


        INT16U StdIdArray[1] ={0x055}; //定义一组标准CAN ID,可更改
        INT16U mask,tmp,num,i;//屏蔽码计算
                       

        CAN_FilterTypeDef filter1;


       
  mask =0x000;                                                //下面开始计算屏蔽码
  num =sizeof(StdIdArray)/sizeof(StdIdArray[0]);
  for(i =0; i<num; i++)                //屏蔽码位StdIdArray[]数组中所有成员的同或结果
  {
    tmp =StdIdArray[i] ^ (~StdIdArray[0]);        //所有数组成员与第0个成员进行同或操作
    mask &=tmp;
  }
       
        filter1.FilterBank=0;//过滤器编号
        filter1.FilterMode=CAN_FILTERMODE_IDMASK;//掩码模式
        filter1.FilterScale=CAN_FILTERSCALE_32BIT;
        filter1.FilterIdHigh=(StdIdArray[0]<<5); //验证码,可默认0x0000
        filter1.FilterIdLow=0x0000;
        filter1.FilterMaskIdHigh=(mask<<5); //屏蔽码,可默认0x0000最大
        filter1.FilterMaskIdLow=0x0000;
        filter1.FilterFIFOAssignment=CAN_FILTER_FIFO0;//FIFO0
        filter1.FilterActivation=ENABLE;
       
        if(HAL_CAN_ConfigFilter(&hcan,&filter1)!=HAL_OK)
        {
                Error_Handler();
        }
        HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);//使能中断
       
}
void can_start(void)
{
        MX_CAN_Init();//CAN参数初始化
        filter1_init();//滤波器初始化

      
}


/* CAN init function */
void MX_CAN_Init(void)
{
  //250Kbps  24000/(()*)
  //500Kbps   
  //125Kbps   
  hcan.Instance = CAN;
  hcan.Init.Prescaler = 6;
  hcan.Init.Mode = CAN_MODE_LOOPBACK;
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg2 = CAN_BS2_7TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_8TQ;
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = DISABLE;
  hcan.Init.AutoWakeUp = DISABLE;
  hcan.Init.AutoRetransmission = DISABLE;
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_CAN_Start(&hcan);//启动CAN
        HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);//使能中断

}

void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(canHandle->Instance==CAN)
  {
  /* USER CODE BEGIN CAN_MspInit 0 */

  /* USER CODE END CAN_MspInit 0 */
    /* CAN clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**CAN GPIO Configuration
    PA11     ------> CAN_RX
    PA12     ------> CAN_TX
    */


    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_CAN;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

                /* CAN interrupt Init */
                HAL_NVIC_SetPriority(CEC_CAN_IRQn, 0, 0);
                HAL_NVIC_EnableIRQ(CEC_CAN_IRQn);

  }
}



void USER_CAN_Send()
{
        HAL_Delay(100);
       
//        HAL_CAN_ActivateNotification(&hcan, CAN_IT_TX_MAILBOX_EMPTY);//开启发送中断



//test数据发送
        TxHeader.StdId = 0x055; //标准格式,包含3位优先级,2位固定码均为0,(R和DP),8位报文代码

//  TxHeader.ExtId=  0x080155AA;  //扩展码其中八位,高:目标地址;低:源地址

  TxHeader.RTR = CAN_RTR_DATA;

  TxHeader.IDE = CAN_ID_STD;

  TxHeader.DLC = 8;//发送字节数
// TxHeader.TransmitGlobalTime = DISABLE;

  TxData[0] = 0x01;
  TxData[1] = 0x52;
  TxData[2] = 0x55;
  TxData[3] = 0x55;
  TxData[4] = 0x44;
  TxData[5] = 0xAA;
  TxData[6] = 0xAA;
  TxData[7] = 0xAA;


        HAL_Delay(100);

  
        if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK)
        {
                /* Transmission request Error */
                Error_Handler();
        }               
        HAL_Delay(100);
        TxData[0]++;


}

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 23:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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