Skip to main content
ninad911
Associate II
April 22, 2016
Question

STM32F4 CAN Bus example using HAL Library

  • April 22, 2016
  • 10 replies
  • 30045 views
Posted on April 22, 2016 at 18:51

Hello,

   i am new to HAL Libraries. i am learning to work with CAN BUS using HAL Libraries. Can any one please post an example of STM32F CAN BUS using HAL Libraries.

as it will help to have an idea how should we program STM32 boards. 

Thanks in advance.

#stm32 #stm32 #hal #hal #can #can #cubemx #cubemx #!stm32f4

10 replies

Tesla DeLorean
Guru
April 22, 2016
Posted on April 22, 2016 at 19:51

STM32Cube_FW_F4_V1.9.0\Projects\STM324xG_EVAL\Examples\CAN\CAN_Networking

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
Walid FTITI_O
Visitor II
April 22, 2016
Posted on April 22, 2016 at 21:06

Hi saraf.ninad.001,

Please refere to the last version of

http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897/PF259243

 where you can find CAN examples that you can run int on your eval board.

For example refer to the CAN_Networking at this path:

STM32Cube_FW_F4_V1.11.0\Projects\STM324x9I_EVAL\Examples\CAN\CAN_Networking

-Hannibal-

ninad911
ninad911Author
Associate II
April 27, 2016
Posted on April 27, 2016 at 13:56

Hello clive1 and

Hannibal 

,

   Thankyou so much for your help. i will work on this. thanks again! 

ninad911
ninad911Author
Associate II
June 17, 2016

Posted on June 17, 2016 at 20:56

Hello, 

  i am trying to see the CAN Transmitted bits, but i am not understanding my mistake in my program. i have attached my main.c and main.h files. i am using STM32F446RE-Nucleo board using Hal library. Can someone please help me!!

 Thanks in advance.

Following is main.c file:-

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"
 
/* USER CODE BEGIN Includes */
//#define __HAL_RCC_CAN1_CLK_DISABLE();
/* USER CODE END Includes */
 
/* Private variables ---------------------------------------------------------*/
CAN_HandleTypeDef hcan1;
 
/* Private variables ---------------------------------------------------------*/
CAN_HandleTypeDef CanHandle;
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN1_Init(void);
 
int main(void)
{
 
 /* 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();
 
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 
 }
 /* USER CODE END 3 */
 
}
 
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
 
 RCC_OscInitTypeDef RCC_OscInitStruct;
 RCC_ClkInitTypeDef RCC_ClkInitStruct;
 
 __HAL_RCC_CAN1_CLK_ENABLE();
 __HAL_RCC_PWR_CLK_ENABLE();
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
 
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.HSICalibrationValue = 16;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 RCC_OscInitStruct.PLL.PLLM = 8;
 RCC_OscInitStruct.PLL.PLLN = 90;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
 RCC_OscInitStruct.PLL.PLLQ = 2;
 RCC_OscInitStruct.PLL.PLLR = 2;
 HAL_RCC_OscConfig(&RCC_OscInitStruct);
 
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
 
 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 
 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 
 /* SysTick_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
 
/**
 * @brief This function is executed in case of error occurrence.
 * @param None
 * @retval None
 */
static void Error_Handler(void)
{
 while(1)
 {
 }
}
 
 
/* CAN1 init function */
void MX_CAN1_Init(void)
{
 CAN_FilterConfTypeDef sFilterConfig;
 static CanTxMsgTypeDef TxMessage;
 static CanRxMsgTypeDef RxMessage;
 
 
 /*##-1- Configure the CAN peripheral #######################################*/
 hcan1.Instance = CAN1;
 hcan1.pTxMsg = &TxMessage;
 hcan1.pRxMsg = &RxMessage;
 
 
 hcan1.Instance = CAN1;
 hcan1.Init.Prescaler = 5;
 hcan1.Init.Mode = CAN_MODE_NORMAL;
 hcan1.Init.SJW = CAN_SJW_1TQ;
 hcan1.Init.BS1 = CAN_BS1_15TQ;
 hcan1.Init.BS2 = CAN_BS2_2TQ;
 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);
 if(HAL_CAN_Init(&hcan1) != HAL_OK)
 {
 /* Initialization Error */
 Error_Handler();
 }
 /*##-2- Configure the CAN Filter ###########################################*/
 sFilterConfig.FilterNumber = 0;
 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
 sFilterConfig.FilterIdHigh = 0x0000;
 sFilterConfig.FilterIdLow = 0x0000;
 sFilterConfig.FilterMaskIdHigh = 0x0000;
 sFilterConfig.FilterMaskIdLow = 0x0000;
 sFilterConfig.FilterFIFOAssignment = 0;
 sFilterConfig.FilterActivation = ENABLE;
 sFilterConfig.BankNumber = 14;
 
 if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
 {
 /* Filter configuration Error */
 Error_Handler();
 }
 
 /*##-3- Configure Transmission process #####################################*/
 hcan1.pTxMsg->StdId = 0x321;
 hcan1.pTxMsg->ExtId = 0x01;
 hcan1.pTxMsg->RTR = CAN_RTR_DATA;
 hcan1.pTxMsg->IDE = CAN_ID_STD;
 hcan1.pTxMsg->DLC = 2;
 
if(HAL_CAN_Transmit(&hcan1, 10) != HAL_OK)
 {
 /* Transmition Error */
 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
 HAL_Delay(100);
 }
}
 
void MX_GPIO_Init(void)
{
 
 GPIO_InitTypeDef GPIO_InitStruct;
 
 /* GPIO Ports Clock Enable */
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOH_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 
 /*Configure GPIO pin : PA5 */
 GPIO_InitStruct.Pin = GPIO_PIN_5;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 /* CAN1 TX GPIO pin configuration */
 GPIO_InitStruct.Pin = GPIO_PIN_12;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
 
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 /* CAN1 RX GPIO pin configuration */
 GPIO_InitStruct.Pin = GPIO_PIN_11;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
 
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 /*Configure GPIO pin : LD2_Pin */
 GPIO_InitStruct.Pin = LD2_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
 
 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
 
/**
 * @brief CAN MSP De-Initialization
 * This function frees the hardware resources used in this example:
 * - Disable the Peripheral's clock
 * - Revert GPIO configuration to their default state
 * @param hcan: CAN handle pointer
 * @retval None
 */
void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan)
{
 /*##-1- Reset peripherals ##################################################*/
 /*CANx_FORCE_RESET();
 CANx_RELEASE_RESET();*/
#define CANx_FORCE_RESET() __HAL_RCC_CAN1_FORCE_RESET()
#define CANx_RELEASE_RESET() __HAL_RCC_CAN1_RELEASE_RESET()
 
 /*##-2- Disable peripherals and GPIO Clocks ################################*/
 /* De-initialize the CAN1 TX GPIO pin */
 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12);
 /* De-initialize the CAN1 RX GPIO pin */
 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
}
}
#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
 
Following is main.h file:-
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H
 
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"
#include "stm32446e_eval.h"
 
/* Exported constants --------------------------------------------------------*/
/* User can use this section to tailor CANx instance used and associated
 resources */
/* Definition for CANx clock resources */
#define CANx CAN1
#define CANx_CLK_ENABLE() __HAL_RCC_CAN1_CLK_ENABLE()
#define CANx_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
 
#define CANx_FORCE_RESET() __HAL_RCC_CAN1_FORCE_RESET()
#define CANx_RELEASE_RESET() __HAL_RCC_CAN1_RELEASE_RESET()
 
/* Exported functions ------------------------------------------------------- */
void LED_Display(uint8_t Ledstatus);
 
#endif /* __MAIN_H */

naeen reddy
Associate
September 26, 2017
Posted on September 26, 2017 at 10:05

can u please send come for can communation in stm32f4 

mailto:naveenreddy4d@gmail.com

Tesla DeLorean
Guru
June 17, 2016
Posted on June 17, 2016 at 21:34

What is doing vs not doing?

How do you have this attached to the bus?

What else is attached to the bus?

What do expect it to do?

What does it actually do?

Do any of the functions return error?

What are those errors?

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
ninad911
ninad911Author
Associate II
June 23, 2016
Posted on June 23, 2016 at 20:34

Hello, 

  i understood my mistake in the program. i forgot to write the API of 'HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)'  in my program. 

Thanks for your help. 

ninad911
ninad911Author
Associate II
June 30, 2016

Posted on June 30, 2016 at 18:44

Hello, 

 i want to receive data on CAN Receiver of STM32F4 Discovery Board. i am transmitting signal from computer using trans-receiver to CAN 1 receiver. But i am unable to receive any data on my receiver. the transmission part is working properly in my code. can any one please help me. 

Thanks in advance!

Following is my code

0690X000006C8khQAC.jpg

ninad911
ninad911Author
Associate II
July 4, 2016
Posted on July 04, 2016 at 10:00

the code is working now with some changes. 

thanks for the help. 

Dahiana Pulido
Associate
January 5, 2017
Posted on January 05, 2017 at 19:36

Hi!, I'm working with HAL_CAN libraries and now i'm having your receive problem , Can you tell me how you can fix your problem?, i'm new with that libraries. Thanks

Tesla DeLorean
Guru
January 5, 2017
Posted on January 05, 2017 at 19:51

Please be aware that the forum was just ported to a new platform, old users and posts may not be responsive.

Ask yourself if framing a new question, with complete details of the part you are using and the code and configuration you have now might be more productive?

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
PRABU Appunu
Visitor II
June 14, 2018
Posted on June 14, 2018 at 13:50

Hi Clive , 

i am using STM32F417 MCU , am trying test CAN1,CAN2 Transmit & Receive .with below code , For CAN1 am able to transmit and receive data on CAN bus using PCAN viewer.

But when am transmitting data on CAN2 am not able to receive any data on bus.Am getting bit stuff error on PCAN viewer.

I have enabled CAN1,CAN2 both to be able to use CAN2 .

What should i missed in CAN2 configuration being slave (from ST point of design) ?.Though its not a slave on CAN network.I suppose CAN2 alone can transmit data on CAN bus.

The dependency of CAN2 from CAN1 is comes into picture when there is a reception issue due to filter config.

But is there any dependency for transmit as well ?

Here is my code ,,,,i used CAN1 init just for the purpose of CAN2 to work .

I would like to transmit data from CAN2 to PCAN (USB -CAN) device .

I have already verified my tranceiver using CAN1 ,So am sure about the hardware setup.

Thanks in advance for your help .

/* USER CODE BEGIN PV */

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

CAN_HandleTypeDef CanHandle1;

CAN_HandleTypeDef CanHandle2;

CAN_TxHeaderTypeDef TxHeader;

CAN_RxHeaderTypeDef RxHeader;

uint8_t TxData[8];

uint8_t RxData[8];

uint32_t TxMailbox;

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 */

CAN1_Config();

CAN2_Config();

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* Set the data to be transmitted */

TxData[0] = 0x11;

TxData[1] = 0x22;

TxData[2] = 0x33;

TxData[3] = 0x44;

TxData[4] = 0x55;

TxData[5] = 0x66;

TxData[6] = 0x77;

TxData[7] = 0x88;

/* Start the Transmission process */

if (HAL_CAN_AddTxMessage(&CanHandle2, &TxHeader, TxData, &TxMailbox) != HAL_OK)

{

/* Transmission request Error */

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);

Error_Handler();

}

//while(HAL_CAN_GetTxMailboxesFreeLevel(&CanHandle) != 3) {}

HAL_Delay(10);

HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);

HAL_Delay(100);

HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);

HAL_Delay(100);

//CAN2_RX();

}

}

static void CAN1_Config(void)

{

CAN_FilterTypeDef sFilterConfig;

uint32_t Clk;

/*##-1- Configure the CAN peripheral #######################################*/

CanHandle1.Instance = CAN1;

CanHandle1.Init.TimeTriggeredMode = DISABLE;

CanHandle1.Init.AutoBusOff = DISABLE;

CanHandle1.Init.AutoWakeUp = DISABLE;

CanHandle1.Init.AutoRetransmission = DISABLE;

CanHandle1.Init.ReceiveFifoLocked = DISABLE;

CanHandle1.Init.TransmitFifoPriority = DISABLE;

CanHandle1.Init.Mode = CAN_MODE_NORMAL;//CAN_MODE_LOOPBACK;

CanHandle1.Init.SyncJumpWidth = CAN_SJW_1TQ;

CanHandle1.Init.TimeSeg1 = CAN_BS1_11TQ;

CanHandle1.Init.TimeSeg2 = CAN_BS2_2TQ;

CanHandle1.Init.Prescaler = 12;//3

if (HAL_CAN_Init(&CanHandle1) != HAL_OK)

{

/* Initialization Error */

Error_Handler();

}

// /*##-2- Configure the CAN Filter ###########################################*/

// sFilterConfig.FilterBank = 0;

// sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//CAN_FILTERMODE_IDMASK;

// sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

// sFilterConfig.FilterIdHigh = 0x0000;//(0x321<< 5);

// sFilterConfig.FilterIdLow = 0x0000;

// sFilterConfig.FilterMaskIdHigh = 0x0000;//; 0xFFE0;

// sFilterConfig.FilterMaskIdLow = 0x0000;

// sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

// sFilterConfig.FilterActivation = ENABLE;

// sFilterConfig.SlaveStartFilterBank = 13;

// if (HAL_CAN_ConfigFilter(&CanHandle1, &sFilterConfig) != HAL_OK)

// {

// /* Filter configuration Error */

// Error_Handler();

// }

// /*##-3- Start the CAN peripheral ###########################################*/

// if (HAL_CAN_Start(&CanHandle1) != HAL_OK)

// {

// /* Start Error */

// Error_Handler();

// }

}

static void CAN2_Config(void)

{

CAN_FilterTypeDef sFilterConfig;

uint32_t Clk;

/*##-1- Configure the CAN peripheral #######################################*/

CanHandle2.Instance = CAN2;

CanHandle2.Init.TimeTriggeredMode = DISABLE;

CanHandle2.Init.AutoBusOff = DISABLE;

CanHandle2.Init.AutoWakeUp = DISABLE;

CanHandle2.Init.AutoRetransmission = DISABLE;

CanHandle2.Init.ReceiveFifoLocked = DISABLE;

CanHandle2.Init.TransmitFifoPriority = DISABLE;

CanHandle2.Init.Mode = CAN_MODE_NORMAL;//CAN_MODE_LOOPBACK;

CanHandle2.Init.SyncJumpWidth = CAN_SJW_1TQ;

CanHandle2.Init.TimeSeg1 = CAN_BS1_11TQ;

CanHandle2.Init.TimeSeg2 = CAN_BS2_2TQ;

CanHandle2.Init.Prescaler = 12;//3

if (HAL_CAN_Init(&CanHandle2) != HAL_OK)

{

/* Initialization Error */

Error_Handler();

}

/*##-2- Configure the CAN Filter ###########################################*/

sFilterConfig.FilterBank = 14;

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//CAN_FILTERMODE_IDMASK;

sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

sFilterConfig.FilterIdHigh = 0x0000;//(0x321<< 5);

sFilterConfig.FilterIdLow = 0x000E;

sFilterConfig.FilterMaskIdHigh = 0x0000;//; 0xFFE0;

sFilterConfig.FilterMaskIdLow = 0x0000;

sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

sFilterConfig.FilterActivation = ENABLE;

sFilterConfig.SlaveStartFilterBank = 27;

if (HAL_CAN_ConfigFilter(&CanHandle2, &sFilterConfig) != HAL_OK)

{

/* Filter configuration Error */

Error_Handler();

}

/*##-3- Start the CAN peripheral ###########################################*/

if (HAL_CAN_Start(&CanHandle2) != HAL_OK)

{

/* Start Error */

Error_Handler();

}

// /*##-4- Activate CAN RX notification #######################################*/

// if (HAL_CAN_ActivateNotification(&CanHandle2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)

// {

// /* Notification Error */

//

// Error_Handler();

// }

}

Thanks

BR

Prabu.A
Tesla DeLorean
Guru
June 14, 2018
Posted on June 14, 2018 at 14:11

Not a huge fan of the HAL/CubeMX implementation.

I'd probably focus on the GPIO clock and pin configurations (assorted MSP code), and the external transceiver.

Does Loop-Back function normally?

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
PRABU Appunu
Visitor II
June 14, 2018
Posted on June 14, 2018 at 15:29

HI Clive

Thanks for the reply. I could see the Tx starting pulse on CAN bus .

I just verified  GPIO clock and TX,RX pins. Looks fine.

About the external  transceiver as i said ,it was working for CAN1.

I did loopback test for CAN1(OK) , but not for CAN2.i used exactly same config of CAN1 for CAN2 . 

Prabu

Tesla DeLorean
Guru
June 14, 2018
Posted on June 14, 2018 at 17:04

I don't like what you did with the Filter ID, but don't know if that impacts the situation

Seems like an issue at the HAL level, you'd need to dig into that a bit, not really something I can expend resources on.

I'd proof the hardware with the SPL.

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..