From b0ce7753aaf2bd3679539734dacdf5dab6d55f5a Mon Sep 17 00:00:00 2001 From: Alan Carvalho de Assis Date: Fri, 27 Oct 2017 06:11:37 -0600 Subject: [PATCH] drivers/can/mcp2515.c: Fix the MCP2515 Bit Rate Prescale calculation. --- drivers/can/mcp2515.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/can/mcp2515.c b/drivers/can/mcp2515.c index 59699037f00..11c22d50d32 100644 --- a/drivers/can/mcp2515.c +++ b/drivers/can/mcp2515.c @@ -76,11 +76,20 @@ #define MCP2515_TSEG2 MCP2515_PHSEG2 #define MCP2515_BRP ((uint8_t)(((float) MCP2515_CANCLK_FREQUENCY / \ ((float)(MCP2515_TSEG1 + MCP2515_TSEG2 + 1) * \ - (float)CONFIG_MCP2515_BITRATE)) - 1)) + (float)(2 * CONFIG_MCP2515_BITRATE))) - 1)) #define MCP2515_SJW CONFIG_MCP2515_SJW -#if MCP2515_TSEG1 > 16 -# error Invalid MCP2515 TSEG1 +#if MCP2515_PROPSEG < 1 +# error Invalid PROPSEG. It cannot be lower than 1 +#endif +#if MCP2515_PROPSEG > 8 +# error Invalid PROPSEG. It cannot be greater than 8 +#endif +#if MCP2515_PHSEG1 < 1 +# error Invalid PHSEG1. It cannot be lower than 1 +#endif +#if MCP2515_PHSEG1 > 8 +# error Invalid PHSEG1. It cannot be greater than 1 #endif #if MCP2515_TSEG2 < 2 # error Invalid TSEG2. It cannot be lower than 2 @@ -1404,7 +1413,7 @@ static int mcp2515_ioctl(FAR struct can_dev_s *dev, int cmd, unsigned long arg) mcp2515_readregs(priv, MCP2515_CNF1, ®val, 1); bt->bt_sjw = ((regval & CNF1_SJW_MASK) >> CNF1_SJW_SHIFT) + 1; - brp = ((regval & CNF1_BRP_MASK) >> CNF1_BRP_SHIFT) + 1; + brp = (((regval & CNF1_BRP_MASK) >> CNF1_BRP_SHIFT) + 1) * 2; mcp2515_readregs(priv, MCP2515_CNF2, ®val, 1); bt->bt_tseg1 = ((regval & CNF2_PRSEG_MASK) >> CNF2_PRSEG_SHIFT) + 1;