STM32F704 CAN1给另一个单片机的CAN1发送消息。可是消息一直发送不出去,一直停在TX邮箱里。求解?

/************** CAN1 初始化 *************************/

void MX_CAN1_Init(void)

{

/*****设置CAN的波特率、工作模式**********/

  hcan1.Instance = CAN1;

  hcan1.Init.Prescaler = 15;

  hcan1.Init.Mode = CAN_MODE_NORMAL;       //正常模式

  hcan1.Init.SyncJumpWidth = CAN_SJW_4TQ;

  hcan1.Init.TimeSeg1 = CAN_BS1_3TQ;

  hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;

  hcan1.Init.TimeTriggeredMode = DISABLE;

  hcan1.Init.AutoBusOff = DISABLE;

  hcan1.Init.AutoWakeUp = DISABLE;

 // hcan1.Init.AutoRetransmission = DISABLE;

hcan1.Init.AutoRetransmission =ENABLE;

  hcan1.Init.ReceiveFifoLocked = DISABLE;

  hcan1.Init.TransmitFifoPriority = DISABLE;


  if (HAL_CAN_Init(&hcan1) != HAL_OK)

  {

   _Error_Handler(__FILE__, __LINE__);


  }

  /***********设置过滤器*************/

  CAN_FilterTypeDef  CAN1_FilerConf;   //定义一个CAN_FilterTypeDef类型的结构体变量

 

    CAN1_FilerConf.FilterIdHigh=0X0000;     //32位ID

    CAN1_FilerConf.FilterIdLow=0X0000;

    CAN1_FilerConf.FilterMaskIdHigh=0X0000;  //32位MASK(高16位)

    CAN1_FilerConf.FilterMaskIdLow=0X0000;   //32位MASK(低16位)

    CAN1_FilerConf.FilterFIFOAssignment=CAN_FILTER_FIFO0;   //过滤器关联到FIFO0

    CAN1_FilerConf.FilterBank=0;    //过滤器组的编码设为0

    CAN1_FilerConf.FilterMode=CAN_FILTERMODE_IDMASK;  //过滤器工作在屏蔽模式

    CAN1_FilerConf.FilterScale=CAN_FILTERSCALE_32BIT;

    CAN1_FilerConf.FilterActivation=ENABLE;       //激活滤波器

    CAN1_FilerConf.SlaveStartFilterBank=0;

    if(HAL_CAN_ConfigFilter(&hcan1,&CAN1_FilerConf)!=HAL_OK) 

    {

    _Error_Handler(__FILE__, __LINE__);

    }


}


//初始化CAN的TX和RX的IO口

void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct;

  if(canHandle->Instance==CAN1)

  {

  

    __HAL_RCC_CAN1_CLK_ENABLE();     //使能CAN1时钟

    __HAL_RCC_GPIOI_CLK_ENABLE();    //使能GPIOI时钟

__HAL_RCC_GPIOH_CLK_ENABLE();    //使能GPIOH时钟

  

/**CAN1 GPIO Configuration    

    PI9     ------> CAN1_RX

    PH13     ------> CAN1_TX

    */

    GPIO_InitStruct.Pin = GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 

    GPIO_InitStruct.Pull = GPIO_PULLUP;    //配置成上拉

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

    GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;

    HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_13;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  //复用推挽输出

GPIO_InitStruct.Pull = GPIO_PULLUP;   //配置成上拉

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

    GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;

    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);



    HAL_NVIC_SetPriority(CAN1_TX_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);




  }

}



//反初始化函数,执行初始化的逆向动作。

void HAL_CAN_MspDeInit(CAN_HandleTypeDef* canHandle)

{


  if(canHandle->Instance==CAN1)

  {

    /* Peripheral clock disable */

    __HAL_RCC_CAN1_CLK_DISABLE();

  

    /**CAN1 GPIO Configuration    

    PI9     ------> CAN1_RX

    PH13     ------> CAN1_TX 

    */

    HAL_GPIO_DeInit(GPIOI, GPIO_PIN_9);


    HAL_GPIO_DeInit(GPIOH, GPIO_PIN_13);


  /* USER CODE BEGIN CAN1_MspDeInit 1 */


  /* USER CODE END CAN1_MspDeInit 1 */

  }




//CAN发送消息,将指定的buffer数据发到CAN总线上

//len:数据个数,取值范围0-8, 其中0表示无数据 


void  CAN1_Send_Msg(uint8_t* TXDataBuffer,uint8_t len)

{

 

     CAN_TxHeaderTypeDef pTxHeader;

    // uint32_t TxMailbox[]={CAN_TX_MAILBOX2};   //CAN_TX_MAILBOX0邮箱作为TX发送邮箱


    pTxHeader.StdId=0X00;        //标准标识符

    pTxHeader.ExtId=0x00;        //扩展标识符(29位)

    pTxHeader.IDE=CAN_ID_STD;    //使用标准帧

    pTxHeader.RTR=CAN_RTR_DATA;  //数据帧

 pTxHeader.DLC=len;        //指定要发送的数据个数(字节数)

    pTxHeader.TransmitGlobalTime=DISABLE;

HAL_CAN_AddTxMessage(&hcan1,&pTxHeader,TXDataBuffer,TxMailbox);   //将* TXDataBuffer指针变量指向某个数组,将数组里的数据增加到TX邮箱,(具体增加到哪个具体邮箱,由单片机自行分配),单片机将分配的TX邮箱编号存入TxMailbox数组


 }


---------------------------

主函数:

int main(void)

{

 

    HAL_Init();


   SystemClock_Config();   /* Configure the system clock */

   delay_init(216);  //将系统时钟频率作为延时初始化


  /* Initialize all configured peripherals */

    MX_GPIO_Init();

    MX_CAN1_Init();   //CAN1初始化

    CAN1_Start();

   CAN1_Send_Msg(TxMessagesBuffer,1);     //添加一条消息,

while (1)

  { }


}


结果,消息一直存在TX邮箱里,发不出去。好郁闷啊,消息就这么一直在邮箱里。

硬件方面,我加了sn65hvd230作收发器。

已邀请:

yjjxifalu

赞同来自:

你用库函数中的geterror getstate函数看一下到底是什么问题

要回复问题请先登录注册