Skip to main content
Graduate II
November 13, 2023
Solved

Stm32F4 CANbus Acknowledgment error problem

  • November 13, 2023
  • 6 replies
  • 6900 views

Hello everyone. The last time I opened a form related to bit timing, I realized that the problem was in the Canbus transceiver. I added 1-2 revisions and replaced it with the MCP2551 transceiver. Even though there is a device on the other side, I get an acknowledgment error and the logic analyzer is as follows.

    This topic has been closed for replies.
    Best answer by Sergen

    Solution: First, I changed the CAN2 mode to loopback and tried to receive data, but I could not receive it. Then I edited the time segment 1 and 2 values ​​and after receiving the data in loopback mode, I tried normal mode and my system worked.

    6 replies

    Graduate II
    November 13, 2023

    On the CAN bus, connect CANH with CANH, and CANL with CANL.

    Then maybe remove one of the 120R resistors.

    SergenAuthor
    Graduate II
    November 13, 2023

    Thanks for your support, I will give you feedback when I try it

    SergenAuthor
    Graduate II
    November 14, 2023

    I found the problem. The message is going to the other party's RX line incorrectly. How can I fix this

    Graduate II
    November 14, 2023

    Post some code

    SergenAuthor
    Graduate II
    November 15, 2023

    Transmit

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

     

    /* USER CODE BEGIN Init */

     

    /* USER CODE END Init */

     

    /* Configure the system clock */

    SystemClock_Config();

     

    /* USER CODE BEGIN SysInit */

     

    /* USER CODE END SysInit */

     

    /* Initialize all configured peripherals */

    MX_GPIO_Init();

    MX_CAN2_Init();

    /* USER CODE BEGIN 2 */

     

    HAL_CAN_Start(&hcan2);

    TxHeader.DLC = 1;

    TxHeader.IDE = CAN_ID_STD;

    TxHeader.RTR = CAN_RTR_DATA;

    TxHeader.StdId = 0x407;

    TxData[0] = 0xFA;

    HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING);

    /* USER CODE END 2 */

     

    /* Infinite loop */

    /* USER CODE BEGIN WHILE */

    while (1)

    {

    // int state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

    // if(state){

    HAL_CAN_AddTxMessage(&hcan2,&TxHeader,TxData,&TxMailbox);

    // HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13,GPIO_PIN_SET);

    // }

    // else{

    // HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13,GPIO_PIN_RESET);

    // }

    HAL_Delay(200);

    /* USER CODE END WHILE */

     

    /* USER CODE BEGIN 3 */

    }

    /* USER CODE END 3 */

    }

    SergenAuthor
    Graduate II
    November 15, 2023

    Receiver

    /* USER CODE BEGIN Includes */

    CAN_RxHeaderTypeDef RxHeader;

    uint8_t RxData[2];

    /* USER CODE END Includes */

     

    /* Private typedef -----------------------------------------------------------*/

    /* USER CODE BEGIN PTD */

     

    /* USER CODE END PTD */

     

    /* Private define ------------------------------------------------------------*/

    /* USER CODE BEGIN PD */

     

    /* USER CODE END PD */

     

    /* Private macro -------------------------------------------------------------*/

    /* USER CODE BEGIN PM */

     

    /* USER CODE END PM */

     

    /* Private variables ---------------------------------------------------------*/

    CAN_HandleTypeDef hcan;

     

    /* USER CODE BEGIN PV */

     

    /* USER CODE END PV */

     

    /* Private function prototypes -----------------------------------------------*/

    void SystemClock_Config(void);

    static void MX_GPIO_Init(void);

    static void MX_CAN_Init(void);

    /* USER CODE BEGIN PFP */

    void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan){

    HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&RxHeader,RxData);

    }

    /* USER CODE END PFP */

     

    /* Private user code ---------------------------------------------------------*/

    /* USER CODE BEGIN 0 */

     

    /* USER CODE END 0 */

     

    /**

    * @brief The application entry point.

    * @retval int

    */

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

     

    /* USER CODE BEGIN Init */

     

    /* USER CODE END Init */

     

    /* Configure the system clock */

    SystemClock_Config();

     

    /* USER CODE BEGIN SysInit */

     

    /* USER CODE END SysInit */

     

    /* Initialize all configured peripherals */

    MX_GPIO_Init();

    MX_CAN_Init();

    /* USER CODE BEGIN 2 */

    HAL_CAN_Start(&hcan);

    HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);

    /* USER CODE END 2 */

     

    /* Infinite loop */

    /* USER CODE BEGIN WHILE */

    while (1)

    {

    /* USER CODE END WHILE */

     

    /* USER CODE BEGIN 3 */

    }

    /* USER CODE END 3 */

    }

    Graduate II
    November 16, 2023

    Edit your post and use Code Sample so it formats your code which makes it easier to read your code

    UseCode Snippet.png

    SergenAuthor
    Graduate II
    November 17, 2023

    thanks

    Graduate II
    November 16, 2023

    I found the problem. The message is going to the other party's RX line incorrectly

    What do you exactly mean? Some hardware wiring problem?

    SergenAuthor
    Graduate II
    November 17, 2023

    I did but let me do it again

    SergenAuthorAnswer
    Graduate II
    November 22, 2023

    Solution: First, I changed the CAN2 mode to loopback and tried to receive data, but I could not receive it. Then I edited the time segment 1 and 2 values ​​and after receiving the data in loopback mode, I tried normal mode and my system worked.