2015-08-09 05:42 AM
Hi,
I am using CAN bus on STM32F407 using standard peripheral library.
When I unplug CAN bus connector, the CPU halts. After reconnecting CAN bus connector, the CPU is still freezing and needs hardware restart.
I want to microcontroller continues running after the bus disconnected.
I have used debugger and I see the CPU stuck in assert line:
uint8_t
CAN_TransmitStatus
(CAN_TypeDef* CANx, uint8_t TransmitMailbox)
{
uint32_t state = 0;
/* Check the parameters */
assert_param(
IS_CAN_ALL_PERIPH
(CANx));
assert_param(
IS_CAN_TRANSMITMAILBOX
(TransmitMailbox));
sticks here!!!!
// ===================================================
CAN_InitTypeDef
CAN_InitStructure;
CAN_FilterInitTypeDef
CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
CanTxMsg TxMessage;
volatile
uint8_t
StatusCAN =
0
;
volatile
uint16_t
CanBusTxFailureCounter =
0x0000
;
volatile
uint16_t
CanBusTxFailureCounterMax =
0xFFFF
;
void
CAN_Config
(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
/* CAN GPIOs configuration **************************************************/
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);
/* Connect CAN pins to AF9 */
GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);
/* Configure CAN RX and TX pins */
GPIO_InitStructure
.GPIO_Pin
= CAN_RX_PIN | CAN_TX_PIN;
GPIO_InitStructure
.GPIO_Mode
= GPIO_Mode_AF;
GPIO_InitStructure
.GPIO_Speed
= GPIO_Speed_50MHz;
GPIO_InitStructure
.GPIO_OType
= GPIO_OType_PP;
GPIO_InitStructure
.GPIO_PuPd
= GPIO_PuPd_UP;
GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);
/* CAN configuration ********************************************************/
/* Enable CAN clock */
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);
/* CAN register init */
CAN_DeInit(CANx);
/* CAN cell init */
CAN_InitStructure
.CAN_TTCM
= DISABLE;
CAN_InitStructure
.CAN_ABOM
= DISABLE;
CAN_InitStructure
.CAN_AWUM
= DISABLE;
CAN_InitStructure
.CAN_NART
= DISABLE;
CAN_InitStructure
.CAN_RFLM
= DISABLE;
CAN_InitStructure
.CAN_TXFP
= DISABLE;
CAN_InitStructure
.CAN_Mode
= CAN_Mode_Normal;
CAN_InitStructure
.CAN_SJW
= CAN_SJW_1tq;
/* CAN Baudrate = 500 Kbit/
s
(CAN clocked at 42 MHz) */
// CAN_BitRate = CAN_CLK / (CAN_Prescaler * (CAN_SJW + CAN_BS1 + CAN_BS2)) - 500Kbit/s = 42MHz/(4 * (1 + 12 + 8))
CAN_InitStructure
.CAN_BS1
= CAN_BS1_12tq;
CAN_InitStructure
.CAN_BS2
= CAN_BS2_8tq;
CAN_InitStructure
.CAN_Prescaler
= 4;
CAN_Init(CANx, &CAN_InitStructure);
/* CAN filter init */
CAN_FilterInitStructure
.CAN_FilterNumber
= 0;
CAN_FilterInitStructure
.CAN_FilterMode
= CAN_FilterMode_IdMask;
CAN_FilterInitStructure
.CAN_FilterScale
= CAN_FilterScale_32bit;
CAN_FilterInitStructure
.CAN_FilterIdHigh
= 0x0000;
CAN_FilterInitStructure
.CAN_FilterIdLow
= 0x0000;
CAN_FilterInitStructure
.CAN_FilterMaskIdHigh
= 0x0000;
CAN_FilterInitStructure
.CAN_FilterMaskIdLow
= 0x0000;
CAN_FilterInitStructure
.CAN_FilterFIFOAssignment
= 0;
CAN_FilterInitStructure
.CAN_FilterActivation
= ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* Transmit Structure preparation */
//
TxMessage
.StdId
= 0x300;
TxMessage
.ExtId
= 0x01;
TxMessage
.RTR
= CAN_RTR_DATA;
TxMessage
.IDE
= CAN_ID_STD;
TxMessage
.DLC
= 8;
//
TxMessage
.Data
[0] = 0x00;
/* Enable FIFO 0 message pending Interrupt */
CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);
NVIC_InitStructure
.NVIC_IRQChannel
= CAN1_RX0_IRQn;
NVIC_InitStructure
.NVIC_IRQChannelPreemptionPriority
= 0x0;
NVIC_InitStructure
.NVIC_IRQChannelSubPriority
= 0x1;
NVIC_InitStructure
.NVIC_IRQChannelCmd
= ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void
CANBusTaskID3FFh
(void){
TxMessage
.StdId
= 0x3FF;
TxMessage
.Data
[0] = 0x00;
TxMessage
.Data
[1] = 0x00;
TxMessage
.Data
[2] = 0x00;
TxMessage
.Data
[3] = 0x00;
TxMessage
.Data
[4] = (((uint16_t)(CC*80)) & 0xFF00) >> 8; //MSB
TxMessage
.Data
[5] = ((uint16_t)(CC*80)) & 0x00FF; //LSB
TxMessage
.Data
[6] = (((uint16_t)(DC*50))& 0xFF00) >> 8; //MSB;
TxMessage
.Data
[7] = ((uint16_t)(DC*50)) & 0x00FF; //LSB;
StatusCAN = CAN_Transmit(CAN1,&TxMessage);
CanBusTxFailureCounter = 0;
while((
CAN_TransmitStatus
(CAN1, StatusCAN) != CANTXOK) && (CanBusTxFailureCounter != CanBusTxFailureCounterMax) ) // Wait on Transmit
{
CanBusTxFailureCounter++;
}
}
#halt-cpu #can-bus #unplug-connec2015-08-09 07:20 AM
So is it asserting because it sees the wrong/incorrect parameter?
If it is address that to resolve the problem. You can also turn off the assertion.2015-08-09 12:45 PM
Hi clive,
Thank you for your reply. As you saw I have the same problem with I2C port. I didn't change the input type, I just disconnected the CAN bus connector. I will test it without assert.