I wrote CAN FD and several functions, but I erased all of them except CAN FD.
I want to know how to use ECR and ESR1 registers.
The MCU I am using is S32K144W
Can I read the value with PEMICRO EXPRESSION?
CAN0->CTRL1 |= CAN_CTRL1_ERRMSK_MASK;
CAN0->ESR1=CAN_ESR1_ERRINT_MASK; Should I MASK the register directly like this?
I've looked up a lot of posts in the community, but I've seen it say ESR1 [ERRINT] like this, but I can't find how to use it.
I saw the data sheet that it can be recorded in freeze mode. But even looking at it, I have no idea how to use it. The code doesn't say freeze mode separately, but it's something I erased. I've already done it.
I just want to write a code that initializes CAN if I read the error count in ECR and get more than a few errors, but I'm wasting a lot of time. Please teach me.
#include "sdk_project_config.h"
#include <stdint.h>
#include <stdbool.h>
#include "core_cm4.h"
#define TX_MAILBOX (1UL)
#define TX_MSG_ID 0x300
#define RX_MAILBOX (0UL)
#define RX_MSG_ID 0x400
uint8_t TXD[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
flexcan_msgbuff_t recvBuff;
void FlexCANInit(void)
{
FLEXCAN_DRV_Init(INST_FLEXCAN_CONFIG_1, &flexcanState0, &flexcanInitConfig0);
flexcan_data_info_t dataInfo =
{
.data_length = 2U,
.msg_id_type = FLEXCAN_MSG_ID_STD,
.enable_brs = true,
.fd_enable = true,
.fd_padding = 0U,
};
FLEXCAN_DRV_ConfigRxMb(INST_FLEXCAN_CONFIG_1, RX_MAILBOX, &dataInfo, 0x00);
FLEXCAN_DRV_Receive(INST_FLEXCAN_CONFIG_1, RX_MAILBOX, &recvBuff);
CAN0->CTRL1 |= CAN_CTRL1_ERRMSK_MASK;
CAN0->ESR1=CAN_ESR1_ERRINT_MASK;
//FLEXCAN_DRV_ConfigTxMb(INST_FLEXCAN_CONFIG_1,TX_MAILBOX,&dataInfo,0x300);
//CAN0->FDCTRL |= CAN_FDCTRL_FDRATE(1)|CAN_FDCTRL_TDCEN_MASK|CAN_FDCTRL_TDCOFF(7)|CAN_FDCTRL_MBDSR0(3);//CAN_FDCTRL_TDCVAL_MASK|
}
void CAN0TX_Init(void) // 레지스터 방식 TX
{
#define MSG_BUF_SIZE 16
CAN0->IFLAG1 = 0x00000001;
CAN0->RAMn[ 0*MSG_BUF_SIZE + 0] = 0xCC4F0000; //CS설정 데이터시트 1712페이지
CAN0->RAMn[ 0*MSG_BUF_SIZE + 1] = 0x0C000000; //첫번째 워드는 ID를 설정함 원하는 ID값(HEX) *4 현재0x300
CAN0->RAMn[ 0*MSG_BUF_SIZE + 2] = 0xA5112233; // 두번째 데이터 워드는 데이터 한 워드당 4바이트
CAN0->RAMn[ 0*MSG_BUF_SIZE + 3] = 0x44556677; // 세번째 데이터 워드는 데이터
CAN0->RAMn[ 0*MSG_BUF_SIZE + 4] = 0x12341234; // 네번째 데이터 워드는 데이터
CAN0->RAMn[ 0*MSG_BUF_SIZE + 5] = 0x12498234; // 다섯번째 데이터 워드는 데이터
}
void BoardInit(void)
{
CLOCK_DRV_Init(&clockMan1_InitConfig0); //클럭설정 SPLL에 분주4로 시스템클럭 40Mhz
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0); // 핀 입출력, 기능 설정(PWM ADC 등)
}
int main(void)
{
BoardInit(); //핀 및 클럭
FlexCANInit();//보더레이트 및
while(1)
{
//SendCANData(TX_MAILBOX, TX_MSG_ID, TXD, 16UL); //계속 ID300으로 TX
CAN0TX_Init ();
}
}
-------------
Additionally, I tried a method using chatgpt, but it only popped up as zero and could not be read.
uint8_t getReceiveErrorCounter() {
// Freeze 모드로 진입하여 레지스터 읽기
CAN0->MCR |= CAN_MCR_HALT_MASK; // Freeze mode로 진입
// RXERRCNT 레지스터 읽기
uint8_t rxErrCounter = (CAN0->ECR & CAN_ECR_RXERRCNT_MASK) >> CAN_ECR_RXERRCNT_SHIFT;
// Freeze 모드 해제
CAN0->MCR &= ~CAN_MCR_HALT_MASK; // Freeze mode 해제
return rxErrCounter;
}
int main(){
uint8_t rxErrCounter = getReceiveErrorCounter();
}