2014-12-05 119 views
1

我正在使用STM32F429微控制器,需要实现CAN2和PCAN View之间的CAN总线通信。我能够从CAN2发送消息,但我无法收到任何消息。我正在使用TJA1041A CAN收发器在微控制器中。问题是,在调试过程中,我的CAN总线正常初始化,但它没有进入接收命令,虽然我已初始化FIFO0.Herewith我正在执行该程序以供进一步参考。我使用了STM32 HAL用于编程的立方体。STM32F429未收到CAN消息

/** 
 
    ****************************************************************************** 
 
    * File Name   : main.c 
 
    * Date    : 05/12/2014 09:43:55 
 
    * Description  : Main program body 
 
    ****************************************************************************** 
 
    * 
 
    * COPYRIGHT(c) 2014 STMicroelectronics 
 
    * 
 
    * Redistribution and use in source and binary forms, with or without modification, 
 
    * are permitted provided that the following conditions are met: 
 
    * 1. Redistributions of source code must retain the above copyright notice, 
 
    *  this list of conditions and the following disclaimer. 
 
    * 2. Redistributions in binary form must reproduce the above copyright notice, 
 
    *  this list of conditions and the following disclaimer in the documentation 
 
    *  and/or other materials provided with the distribution. 
 
    * 3. Neither the name of STMicroelectronics nor the names of its contributors 
 
    *  may be used to endorse or promote products derived from this software 
 
    *  without specific prior written permission. 
 
    * 
 
    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 
    * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 
    * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 
 
    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 
    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 
    * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 
    * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
 
    * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
 
    * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 
    * 
 
    ****************************************************************************** 
 
    */ 
 

 
/* Includes ------------------------------------------------------------------*/ 
 
#include "stm32f4xx_hal.h" 
 

 
/* USER CODE BEGIN Includes */ 
 

 
/* USER CODE END Includes */ 
 

 
/* Private variables ---------------------------------------------------------*/ 
 
CAN_HandleTypeDef hcan1; 
 
CAN_HandleTypeDef hcan2; 
 

 
/* USER CODE BEGIN PV */ 
 

 
/* USER CODE END PV */ 
 

 
/* Private function prototypes -----------------------------------------------*/ 
 
void SystemClock_Config(void); 
 
static void MX_GPIO_Init(void); 
 
static void MX_CAN1_Init(void); 
 
static void MX_CAN2_Init(void); 
 

 
/* USER CODE BEGIN PFP */ 
 

 
/* USER CODE END PFP */ 
 

 
/* USER CODE BEGIN 0 */ 
 

 
/* USER CODE END 0 */ 
 

 
int main(void) 
 
{ 
 

 
    /* USER CODE BEGIN 1 */ 
 

 
    /* USER CODE END 1 */ 
 

 
    /* MCU Configuration----------------------------------------------------------*/ 
 

 
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 
 
    HAL_Init(); 
 

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

 
    /* Initialize all configured peripherals */ 
 
    MX_GPIO_Init(); 
 
    MX_CAN1_Init(); 
 
    MX_CAN2_Init(); 
 

 
    /* USER CODE BEGIN 2 */ 
 
__GPIOD_CLK_ENABLE(); 
 

 
GPIO_InitTypeDef GPIO_Initpins; 
 
    
 
GPIO_Initpins.Mode = GPIO_MODE_OUTPUT_PP ; 
 
GPIO_Initpins.Pin = GPIO_PIN_5|GPIO_PIN_7; 
 
GPIO_Initpins.Pull = GPIO_NOPULL ; 
 
HAL_GPIO_Init(GPIOD, &GPIO_Initpins); 
 
    
 
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_SET); 
 
    /* USER CODE END 2 */ 
 

 
    /* USER CODE BEGIN 3 */ 
 
    /* Infinite loop */ 
 
    CanTxMsgTypeDef TxMess; 
 
    
 
    TxMess.StdId = 0x123; 
 
    TxMess.DLC = 0x0; 
 
    TxMess.Data[0] = 0x12; 
 
    TxMess.IDE = 0; 
 
    TxMess.RTR = 0; 
 
    
 
    hcan2.pTxMsg = &TxMess; 
 
    HAL_CAN_Transmit(&hcan2,50); 
 
    HAL_Delay(500); 
 
    
 
/* USER CODE END 2 */ 
 

 
    
 

 
CanRxMsgTypeDef RMess; 
 
    
 
    RMess.FIFONumber = CAN_FIFO1; 
 
    RMess.FMI = 14; 
 
    RMess.StdId = 0x541; 
 
    RMess.DLC = 0; 
 
    RMess.RTR = 0; 
 
    RMess.IDE = CAN_ID_STD; 
 
    hcan2.pRxMsg = &RMess; 
 
    
 
    HAL_CAN_Receive_IT(&hcan2,CAN_FIFO1); 
 
    /* USER CODE BEGIN 3 */ 
 
    /* Infinite loop */ 
 
    while (1) 
 
    { 
 
    
 
    HAL_CAN_Receive(&hcan2,CAN_FIFO1,0); 
 
    
 
    } 
 
    /* USER CODE END 3 */ 
 

 
} 
 

 
/** System Clock Configuration 
 
*/ 
 
void SystemClock_Config(void) 
 
{ 
 

 
    RCC_OscInitTypeDef RCC_OscInitStruct; 
 
    RCC_ClkInitTypeDef RCC_ClkInitStruct; 
 

 
    __PWR_CLK_ENABLE(); 
 

 
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); 
 

 
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; 
 
    RCC_OscInitStruct.HSEState = RCC_HSE_ON; 
 
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; 
 
    HAL_RCC_OscConfig(&RCC_OscInitStruct); 
 

 
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; 
 
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; 
 
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 
 
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 
 
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 
 
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); 
 

 
} 
 

 
/* CAN1 init function */ 
 
void MX_CAN1_Init(void) 
 
{ 
 

 
    hcan1.Instance = CAN1; 
 
    hcan1.Init.Prescaler = 16; 
 
    hcan1.Init.Mode = CAN_MODE_NORMAL; 
 
    hcan1.Init.SJW = CAN_SJW_1TQ; 
 
    hcan1.Init.BS1 = CAN_BS1_1TQ; 
 
    hcan1.Init.BS2 = CAN_BS2_1TQ; 
 
    hcan1.Init.TTCM = DISABLE; 
 
    hcan1.Init.ABOM = DISABLE; 
 
    hcan1.Init.AWUM = DISABLE; 
 
    hcan1.Init.NART = DISABLE; 
 
    hcan1.Init.RFLM = DISABLE; 
 
    hcan1.Init.TXFP = DISABLE; 
 
    HAL_CAN_Init(&hcan1); 
 

 
    /*CAN_FilterConfTypeDef CAN_Filters; 
 
    
 
    CAN_Filters.BankNumber = 0; 
 
    CAN_Filters.FilterActivation = ENABLE; 
 
    CAN_Filters.FilterFIFOAssignment = CAN_FILTER_FIFO0 ; 
 
    CAN_Filters.FilterIdHigh = 0x00; 
 
    CAN_Filters.FilterIdLow = 0x00; 
 
    CAN_Filters.FilterMaskIdHigh = 0x00; 
 
    CAN_Filters.FilterMaskIdLow = 0x00; 
 
    CAN_Filters.FilterMode = CAN_FILTERMODE_IDMASK; 
 
    CAN_Filters.FilterNumber = 0; 
 
    CAN_Filters.FilterScale = CAN_FILTERSCALE_32BIT; 
 
    
 
    HAL_CAN_ConfigFilter(&hcan1, &CAN_Filters);*/ 
 

 
} 
 

 
/* CAN2 init function */ 
 
void MX_CAN2_Init(void) 
 
{ 
 
    hcan2.Instance = CAN2; 
 
    hcan2.Init.Prescaler = 2; 
 
    hcan2.Init.Mode = CAN_MODE_NORMAL; 
 
    hcan2.Init.SJW = CAN_SJW_1TQ; 
 
    hcan2.Init.BS1 = CAN_BS1_5TQ; 
 
    hcan2.Init.BS2 = CAN_BS2_2TQ; 
 
    hcan2.Init.TTCM = DISABLE; 
 
    hcan2.Init.ABOM = DISABLE; 
 
    hcan2.Init.AWUM = DISABLE; 
 
    hcan2.Init.NART = DISABLE; 
 
    hcan2.Init.RFLM = DISABLE; 
 
    hcan2.Init.TXFP = DISABLE; 
 
    HAL_CAN_Init(&hcan2); 
 
    
 
} 
 

 
/** Configure pins as 
 
     * Analog 
 
     * Input 
 
     * Output 
 
     * EVENT_OUT 
 
     * EXTI 
 
*/ 
 
void MX_GPIO_Init(void) 
 
{ 
 

 
    /* GPIO Ports Clock Enable */ 
 
    __GPIOH_CLK_ENABLE(); 
 
    __GPIOB_CLK_ENABLE(); 
 
    __GPIOA_CLK_ENABLE(); 
 

 
} 
 

 
/* USER CODE BEGIN 4 */ 
 

 
/* USER CODE END 4 */ 
 

 
#ifdef USE_FULL_ASSERT 
 

 
/** 
 
    * @brief Reports the name of the source file and the source line number 
 
    * where the assert_param error has occurred. 
 
    * @param file: pointer to the source file name 
 
    * @param line: assert_param error line source number 
 
    * @retval None 
 
    */ 
 
void assert_failed(uint8_t* file, uint32_t line) 
 
{ 
 
    /* USER CODE BEGIN 6 */ 
 
    /* User can add his own implementation to report the file name and line number, 
 
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 
 
    /* USER CODE END 6 */ 
 

 
} 
 

 
#endif 
 

 
/** 
 
    * @} 
 
    */ 
 

 
/** 
 
    * @} 
 
*/ 
 

 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

由于

+0

有人已经发现了上述问题的解决方案? – user2870154 2014-12-18 11:40:34

回答

0

如果CAN2可以发送消息,CAN1(主)和CAN2(从)之间的时钟和主 - 从配置确定。

如果有接收问题,这些应该与FIFO配置或验收过滤器配置有关。

您配置了FIFO,但看起来您没有配置“CAN2StartBank”。 CAN1和CAN2也共享滤波器组,并且默认情况下,这些组被划分为一半,所以前半部分用于CAN1,后半部分用于CAN2。

从参考手册章节 “可以过滤寄存器”:

可以筛选主寄存器(CAN_FMR)

地址偏移量:在0x200复位值:0x2A1C 0E01此

寄存器的所有位由软件设置和清除。 ... CAN2SB [5:0]:CAN2开始存储区这些位由

设置并清零

软件。它们定义在

范围为0的CAN2接口(Slave)的开始银行27注:当CAN2SB [5:0] = 28天,所有的过滤器,以

CAN1可以使用。当CAN2SB [5:0]设置为0时,没有过滤器被分配给CAN1的 。

您设置

CAN_Filters.BankNumber = 0; 

,但你应该选择从下半年默认设置银行或CAN2StartBank值更改为0,如果你不需要CAN1。

您还必须确保在过滤器配置期间过滤器处于初始化模式。

可以筛选主寄存器(CAN_FMR)

位0 FINIT:过滤器初始化模式初始化模式为滤波器组

0:有源滤波器模式。

1:过滤器

初始化模式可悲的是我没有的硬件,现在自己一个人进行测试。

+0

感谢您的回复......甚至改变了我的BankNumber = 14后,我无法从PCAN设备接收的任何消息。 CAN1-> FMR&=〜((uint32_t)CAN_FMR_CAN2SB); CAN1-> FMR | =(uint32_t的)(sFilterConfig-> BankNumber << 8); – user2870154 2015-01-12 13:34:43

+0

以上是从银行的声明,并因为我不要求CAN1 coonection我只使用CAN2 – user2870154 2015-01-12 13:35:45

0

您应该采取FilterNumber 14为CAN2接口;默认情况下,在复位后,CAN2SB [5:0]以01110 = dec 14启动 - 因此CAN1接口应该使用滤波器0..13和CAN2 14..27。您可以通过CAN_SlaveStartBank(uint_8)方法将起始库从14更改为1..27内的任何值。

0

尝试滤波器组设置为大于14的CAN2接口,它似乎有一个关于银行setting.We错误有同样的问题,但设置15日后,它的工作原理。