在线时间3 小时
UID2094481
注册时间2014-11-13
NXP金币0
该用户从未签到
新手上路

- 积分
- 35
- 最后登录
- 2018-11-13
|
大家好
参照S32K系统配置,CAN模块配置时使用外部晶振作为时钟源,通讯OK,将时钟源换位40mhz总线时钟后,通讯异常,求教原因
unsigned long i;
/* Activate Clock for FlexCAN and PORT */
PCC_HAL_SetClockMode(PCC, FLEXCAN_0, TRUE);
PCC_HAL_SetClockMode(PCC, PORT_PORTE, TRUE);
/* Configure Pin for CAN TX */
PORT_HAL_SetMuxModeSel(PORTE, 5, PORT_MUX_ALT5);
PORT_HAL_SetMuxModeSel(PORTE, 4, PORT_MUX_ALT5);
/* initCAN_0 */
CAN0->MCR |= CAN_MCR_MDIS_MASK; /* Make sure FlexCAN module is disabled */
CAN0->CTRL1 |= CAN_CTRL1_CLKSRC_MASK; /* CLKSRC=1: The CAN engine clock source is BUS_CLK (40MHz) */
CAN0->MCR &= ~CAN_MCR_MDIS_MASK; /* Enable FlexCAN module by clearing MCR[MDIS] bit */
while( (CAN0->MCR & CAN_MCR_LPMACK_MASK) != 0){} /* Wait until FlexCAN module is out of low power mode */
while( (CAN0->MCR & CAN_MCR_FRZACK_MASK) == 0){} /* Wait until FlexCAN goes into freeze mode */
CAN0->MCR &= ~CAN_MCR_IRMQ_MASK; /* 1: Individual Rx Masking and Queue Ennable */
CAN0->MCR |= CAN_MCR_AEN_MASK | /* AEN=1: Abort enabled */
CAN_MCR_SRXDIS_MASK; /* Disable self reception */
/* Configuration for CAN bit rate = 500kbps, 16 time quanta for 1 bit */
/* ftq = 16tq * 500kbps = 8MHz */
CAN0->CTRL1|=CAN_CTRL1_PRESDIV(4);
CAN0->CTRL1|=CAN_CTRL1_PSEG2(3);
CAN0->CTRL1|=CAN_CTRL1_PSEG1(3);
CAN0->CTRL1|=CAN_CTRL1_PROPSEG(6);
CAN0->CTRL1|=CAN_CTRL1_RJW(3);
CAN0->CTRL1|=CAN_CTRL1_SMP(1);
for(i=0; i<32; i++ ) { /* CAN0: clear 32 msg bufs x 4 words/msg buf = 128 words*/
CAN0->MB[i].CS = 0; /* Clear msg buf word */
CAN0->MB[i].ID = 0; /* Clear msg buf word */
CAN0->MB[i].WORD0 = 0; /* Clear msg buf word */
CAN0->MB[i].WORD1 = 0; /* Clear msg buf word */
}
for(i=0; i<16; i++ ) { /* In FRZ mode, init CAN0 16 msg buf filters */
CAN0->RXIMR[i] = 0xFFFFFFFF; /* Check all ID bits for incoming messages */
}
CAN0->RXMGMASK = 0x1FFFFFFF; /* Global acceptance mask: check all ID bits */
CAN0->MB[3].CS = 0x04000000; /* Msg Buf 4, word 0: Enable for reception */
/* EDL,BRS,ESI=0: CANFD not used */
/* CODE=4: MB set to RX inactive */
/* IDE=0: Standard ID */
/* SRR, RTR, TIME STAMP = 0: not applicable */
/* Node A receives msg with std ID 0x511 */
CAN0->MB[3].ID = 0x14440000; /* Msg Buf 4, word 1: Standard ID = 0x111 */
/* PRIO = 0: CANFD not used */
CAN0->MCR = 0x0000001F; /* Negate FlexCAN 1 halt state for 32 MBs */
while ((CAN0->MCR && CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) {}
/* Good practice: wait for FRZACK to clear (not in freeze mode) */
while ((CAN0->MCR && CAN_MCR_NOTRDY_MASK) >> CAN_MCR_NOTRDY_SHIFT) {}
/* Good practice: wait for NOTRDY to clear (module ready) */
最佳答案
请问修改时钟源的同时,是否修改了分频系数?关于分频系数详见参考手册S32K1XXRM的"53.5.9.7 Protocol timing"章节介绍。
[attach]448587[/attach]
|
|