Skip to content

Commit 610c8c8

Browse files
committed
CAN Extended mode fix
1 parent 003dd7c commit 610c8c8

File tree

2 files changed

+26
-22
lines changed

2 files changed

+26
-22
lines changed

targets/TARGET_RENESAS/TARGET_RZ_A1H/can_api.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -637,17 +637,17 @@ int can_write(can_t *obj, CAN_Message msg, int cc) {
637637
__NOP();
638638
}
639639

640-
if (((msg.format == CANStandard) && (msg.id <= 0x07FF)) || ((msg.format == CANExtended) && (msg.id <= 0x03FFFF))) {
640+
if (((msg.format == CANStandard) && (msg.id <= 0x07FF)) || ((msg.format == CANExtended) && (msg.id <= 0x1FFFFFFF))) {
641641
/* send/receive FIFO buffer isn't full */
642642
dmy_cfsts = CFSTS_TBL[obj->ch][CAN_SEND];
643643
if ((*dmy_cfsts & 0x02) != 0x02) {
644-
/* set format, frame type and send/receive FIFO buffer ID(b10-0 or b28-11) */
644+
/* set format, frame type and send/receive FIFO buffer ID(b10-0 or b28-0) */
645645
dmy_cfid = CFID_TBL[obj->ch][CAN_SEND];
646646
*dmy_cfid = ((msg.format << 31) | (msg.type << 30));
647647
if (msg.format == CANStandard) {
648648
*dmy_cfid |= (msg.id & 0x07FF);
649649
} else {
650-
*dmy_cfid |= ((msg.id & 0x03FFFF) << 11);
650+
*dmy_cfid |= (msg.id & 0x1FFFFFFF);
651651
}
652652
/* set length */
653653
dmy_cfptr = CFPTR_TBL[obj->ch][CAN_SEND];
@@ -686,14 +686,14 @@ int can_read(can_t *obj, CAN_Message *msg, int handle) {
686686
/* send/receive FIFO buffer isn't empty */
687687
dmy_cfsts = CFSTS_TBL[obj->ch][CAN_RECV];
688688
while ((*dmy_cfsts & 0x01) != 0x01) {
689-
/* get format, frame type and send/receive FIFO buffer ID(b10-0 or b28-11) */
689+
/* get format, frame type and send/receive FIFO buffer ID(b10-0 or b28-0) */
690690
dmy_cfid = CFID_TBL[obj->ch][CAN_RECV];
691691
msg->format = (CANFormat)(*dmy_cfid >> 31);
692-
msg->type = (CANType)(*dmy_cfid >> 30);
692+
msg->type = (CANType)((*dmy_cfid >> 30) & 0x1);
693693
if (msg->format == CANStandard) {
694694
msg->id = (*dmy_cfid & 0x07FF);
695695
} else {
696-
msg->id = ((*dmy_cfid >> 11) & 0x03FFFF);
696+
msg->id = (*dmy_cfid & 0x1FFFFFFF);
697697
}
698698
/* get length */
699699
dmy_cfptr = CFPTR_TBL[obj->ch][CAN_RECV];
@@ -813,7 +813,7 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
813813
int retval = 0;
814814

815815
if ((format == CANStandard) || (format == CANExtended)) {
816-
if (((format == CANStandard) && (id <= 0x07FF)) || ((format == CANExtended) && (id <= 0x03FFFF))) {
816+
if (((format == CANStandard) && (id <= 0x07FF)) || ((format == CANExtended) && (id <= 0x1FFFFFFF))) {
817817
/* set Global Reset mode and Channel Reset mode */
818818
can_set_global_mode(GL_RESET);
819819
can_set_channel_mode(obj->ch, CH_RESET);
@@ -824,11 +824,11 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
824824
/* set IDE format */
825825
*dmy_gaflid = (format << 31);
826826
if (format == CANExtended) {
827-
/* set receive rule ID for bit28-11 */
828-
*dmy_gaflid |= (id << 11);
827+
/* set receive rule ID for bit28-0 */
828+
*dmy_gaflid |= (id & 0x1FFFFFFF);
829829
} else {
830830
/* set receive rule ID for bit10-0 */
831-
*dmy_gaflid |= id;
831+
*dmy_gaflid |= (id & 0x07FF);
832832
}
833833
/* set ID mask bit */
834834
*dmy_gaflm = (0xC0000000 | mask);
@@ -971,6 +971,7 @@ static void can_set_frequency(can_t *obj, int f) {
971971
uint8_t brp = 0;
972972
uint8_t tseg1 = 0;
973973
uint8_t tseg2 = 0;
974+
uint8_t sjw = 0;
974975

975976
/* set clkc */
976977
if (RZ_A1_IsClockMode0() == false) {
@@ -993,9 +994,10 @@ static void can_set_frequency(can_t *obj, int f) {
993994
/* calculate TSEG1 bit and TSEG2 bit */
994995
tseg1 = (tq - 1) * 0.666666667;
995996
tseg2 = (tq - 1) - tseg1;
997+
sjw = (tseg2 > 4)? 4 : tseg2;
996998
/* set RSCAN0CmCFG register */
997999
dmy_cfg = CFG_MATCH[obj->ch];
998-
*dmy_cfg = ((tseg2 - 1) << 20) | ((tseg1 - 1) << 16) | brp;
1000+
*dmy_cfg = ((sjw - 1) << 24) | ((tseg2 - 1) << 20) | ((tseg1 - 1) << 16) | brp;
9991001
}
10001002

10011003
static void can_set_global_mode(int mode) {

targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/can_api.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -654,17 +654,17 @@ int can_write(can_t *obj, CAN_Message msg, int cc) {
654654
__NOP();
655655
}
656656

657-
if (((msg.format == CANStandard) && (msg.id <= 0x07FF)) || ((msg.format == CANExtended) && (msg.id <= 0x03FFFF))) {
657+
if (((msg.format == CANStandard) && (msg.id <= 0x07FF)) || ((msg.format == CANExtended) && (msg.id <= 0x1FFFFFFF))) {
658658
/* send/receive FIFO buffer isn't full */
659659
dmy_cfsts = CFSTS_TBL[obj->ch][CAN_SEND];
660660
if ((*dmy_cfsts & 0x02) != 0x02) {
661-
/* set format, frame type and send/receive FIFO buffer ID(b10-0 or b28-11) */
661+
/* set format, frame type and send/receive FIFO buffer ID(b10-0 or b28-0) */
662662
dmy_cfid = CFID_TBL[obj->ch][CAN_SEND];
663663
*dmy_cfid = ((msg.format << 31) | (msg.type << 30));
664664
if (msg.format == CANStandard) {
665665
*dmy_cfid |= (msg.id & 0x07FF);
666666
} else {
667-
*dmy_cfid |= ((msg.id & 0x03FFFF) << 11);
667+
*dmy_cfid |= (msg.id & 0x1FFFFFFF);
668668
}
669669
/* set length */
670670
dmy_cfptr = CFPTR_TBL[obj->ch][CAN_SEND];
@@ -703,14 +703,14 @@ int can_read(can_t *obj, CAN_Message *msg, int handle) {
703703
/* send/receive FIFO buffer isn't empty */
704704
dmy_cfsts = CFSTS_TBL[obj->ch][CAN_RECV];
705705
while ((*dmy_cfsts & 0x01) != 0x01) {
706-
/* get format, frame type and send/receive FIFO buffer ID(b10-0 or b28-11) */
706+
/* get format, frame type and send/receive FIFO buffer ID(b10-0 or b28-0) */
707707
dmy_cfid = CFID_TBL[obj->ch][CAN_RECV];
708708
msg->format = (CANFormat)(*dmy_cfid >> 31);
709-
msg->type = (CANType)(*dmy_cfid >> 30);
709+
msg->type = (CANType)((*dmy_cfid >> 30) & 0x1);
710710
if (msg->format == CANStandard) {
711711
msg->id = (*dmy_cfid & 0x07FF);
712712
} else {
713-
msg->id = ((*dmy_cfid >> 11) & 0x03FFFF);
713+
msg->id = (*dmy_cfid & 0x1FFFFFFF);
714714
}
715715
/* get length */
716716
dmy_cfptr = CFPTR_TBL[obj->ch][CAN_RECV];
@@ -830,7 +830,7 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
830830
int retval = 0;
831831

832832
if ((format == CANStandard) || (format == CANExtended)) {
833-
if (((format == CANStandard) && (id <= 0x07FF)) || ((format == CANExtended) && (id <= 0x03FFFF))) {
833+
if (((format == CANStandard) && (id <= 0x07FF)) || ((format == CANExtended) && (id <= 0x1FFFFFFF))) {
834834
/* set Global Reset mode and Channel Reset mode */
835835
can_set_global_mode(GL_RESET);
836836
can_set_channel_mode(obj->ch, CH_RESET);
@@ -841,11 +841,11 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
841841
/* set IDE format */
842842
*dmy_gaflid = (format << 31);
843843
if (format == CANExtended) {
844-
/* set receive rule ID for bit28-11 */
845-
*dmy_gaflid |= (id << 11);
844+
/* set receive rule ID for bit28-0 */
845+
*dmy_gaflid |= (id & 0x1FFFFFFF);
846846
} else {
847847
/* set receive rule ID for bit10-0 */
848-
*dmy_gaflid |= id;
848+
*dmy_gaflid |= (id & 0x07FF);
849849
}
850850
/* set ID mask bit */
851851
*dmy_gaflm = (0xC0000000 | mask);
@@ -988,6 +988,7 @@ static void can_set_frequency(can_t *obj, int f) {
988988
uint8_t brp = 0;
989989
uint8_t tseg1 = 0;
990990
uint8_t tseg2 = 0;
991+
uint8_t sjw = 0;
991992

992993
/* set clkc */
993994
if (RZ_A1_IsClockMode0() == false) {
@@ -1010,9 +1011,10 @@ static void can_set_frequency(can_t *obj, int f) {
10101011
/* calculate TSEG1 bit and TSEG2 bit */
10111012
tseg1 = (tq - 1) * 0.666666667;
10121013
tseg2 = (tq - 1) - tseg1;
1014+
sjw = (tseg2 > 4)? 4 : tseg2;
10131015
/* set RSCAN0CmCFG register */
10141016
dmy_cfg = CFG_MATCH[obj->ch];
1015-
*dmy_cfg = ((tseg2 - 1) << 20) | ((tseg1 - 1) << 16) | brp;
1017+
*dmy_cfg = ((sjw - 1) << 24) | ((tseg2 - 1) << 20) | ((tseg1 - 1) << 16) | brp;
10161018
}
10171019

10181020
static void can_set_global_mode(int mode) {

0 commit comments

Comments
 (0)