CAN: Reduce nesting level via code transformations.
This commit is contained in:
parent
06d1a5ca80
commit
571c4d37d0
@ -150,26 +150,25 @@ void sys_tick_handler(void)
|
|||||||
static int temp32 = 0;
|
static int temp32 = 0;
|
||||||
static u8 data[8] = {0, 1, 2, 0, 0, 0, 0, 0};
|
static u8 data[8] = {0, 1, 2, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
temp32++;
|
|
||||||
|
|
||||||
/* We call this handler every 1ms so 1000ms = 1s on/off. */
|
/* We call this handler every 1ms so 1000ms = 1s on/off. */
|
||||||
if (temp32 == 1000) {
|
if (++temp32 != 1000)
|
||||||
temp32 = 0;
|
return;
|
||||||
|
|
||||||
/* Transmit CAN frame. */
|
temp32 = 0;
|
||||||
data[0]++;
|
|
||||||
if (can_transmit(CAN1,
|
/* Transmit CAN frame. */
|
||||||
0, /* (EX/ST)ID: CAN ID */
|
data[0]++;
|
||||||
false, /* IDE: CAN ID extended? */
|
if (can_transmit(CAN1,
|
||||||
false, /* RTR: Request transmit? */
|
0, /* (EX/ST)ID: CAN ID */
|
||||||
8, /* DLC: Data length */
|
false, /* IDE: CAN ID extended? */
|
||||||
data) == -1)
|
false, /* RTR: Request transmit? */
|
||||||
{
|
8, /* DLC: Data length */
|
||||||
gpio_set(GPIOA, GPIO6); /* LED0 off */
|
data) == -1)
|
||||||
gpio_set(GPIOA, GPIO7); /* LED1 off */
|
{
|
||||||
gpio_clear(GPIOB, GPIO0); /* LED2 on */
|
gpio_set(GPIOA, GPIO6); /* LED0 off */
|
||||||
gpio_set(GPIOB, GPIO1); /* LED3 off */
|
gpio_set(GPIOA, GPIO7); /* LED1 off */
|
||||||
}
|
gpio_clear(GPIOB, GPIO0); /* LED2 on */
|
||||||
|
gpio_set(GPIOB, GPIO1); /* LED3 off */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
153
lib/can.c
153
lib/can.c
@ -31,9 +31,8 @@ void can_reset(u32 canport)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int can_init(u32 canport,
|
int can_init(u32 canport, bool ttcm, bool abom, bool awum, bool nart,
|
||||||
bool ttcm, bool abom, bool awum, bool nart, bool rflm, bool txfp,
|
bool rflm, bool txfp, u32 sjw, u32 ts1, u32 ts2, u32 brp)
|
||||||
u32 sjw, u32 ts1, u32 ts2, u32 brp)
|
|
||||||
{
|
{
|
||||||
u32 wait_ack = 0x00000000;
|
u32 wait_ack = 0x00000000;
|
||||||
u32 can_msr_inak_timeout = 0x0000FFFF;
|
u32 can_msr_inak_timeout = 0x0000FFFF;
|
||||||
@ -52,58 +51,57 @@ int can_init(u32 canport,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check the acknowledge. */
|
/* Check the acknowledge. */
|
||||||
if ((CAN_MSR(canport) & CAN_MSR_INAK) != CAN_MSR_INAK) {
|
if ((CAN_MSR(canport) & CAN_MSR_INAK) != CAN_MSR_INAK)
|
||||||
ret = 1;
|
return 1;
|
||||||
} else {
|
|
||||||
/* Set the automatic bus-off management. */
|
|
||||||
if (ttcm)
|
|
||||||
CAN_MCR(canport) |= CAN_MCR_TTCM;
|
|
||||||
else
|
|
||||||
CAN_MCR(canport) &= ~CAN_MCR_TTCM;
|
|
||||||
|
|
||||||
if (abom)
|
/* Set the automatic bus-off management. */
|
||||||
CAN_MCR(canport) |= CAN_MCR_ABOM;
|
if (ttcm)
|
||||||
else
|
CAN_MCR(canport) |= CAN_MCR_TTCM;
|
||||||
CAN_MCR(canport) &= ~CAN_MCR_ABOM;
|
else
|
||||||
|
CAN_MCR(canport) &= ~CAN_MCR_TTCM;
|
||||||
|
|
||||||
if (awum)
|
if (abom)
|
||||||
CAN_MCR(canport) |= CAN_MCR_AWUM;
|
CAN_MCR(canport) |= CAN_MCR_ABOM;
|
||||||
else
|
else
|
||||||
CAN_MCR(canport) &= ~CAN_MCR_AWUM;
|
CAN_MCR(canport) &= ~CAN_MCR_ABOM;
|
||||||
|
|
||||||
if (nart)
|
if (awum)
|
||||||
CAN_MCR(canport) |= CAN_MCR_NART;
|
CAN_MCR(canport) |= CAN_MCR_AWUM;
|
||||||
else
|
else
|
||||||
CAN_MCR(canport) &= ~CAN_MCR_NART;
|
CAN_MCR(canport) &= ~CAN_MCR_AWUM;
|
||||||
|
|
||||||
if (rflm)
|
if (nart)
|
||||||
CAN_MCR(canport) |= CAN_MCR_RFLM;
|
CAN_MCR(canport) |= CAN_MCR_NART;
|
||||||
else
|
else
|
||||||
CAN_MCR(canport) &= ~CAN_MCR_RFLM;
|
CAN_MCR(canport) &= ~CAN_MCR_NART;
|
||||||
|
|
||||||
if (txfp)
|
if (rflm)
|
||||||
CAN_MCR(canport) |= CAN_MCR_TXFP;
|
CAN_MCR(canport) |= CAN_MCR_RFLM;
|
||||||
else
|
else
|
||||||
CAN_MCR(canport) &= ~CAN_MCR_TXFP;
|
CAN_MCR(canport) &= ~CAN_MCR_RFLM;
|
||||||
|
|
||||||
/* Set bit timings. */
|
if (txfp)
|
||||||
CAN_BTR(canport) = sjw | ts2 | ts1 |
|
CAN_MCR(canport) |= CAN_MCR_TXFP;
|
||||||
(u32)(CAN_BTR_BRP_MASK & (brp - 1));
|
else
|
||||||
|
CAN_MCR(canport) &= ~CAN_MCR_TXFP;
|
||||||
|
|
||||||
/* Request initialization "leave". */
|
/* Set bit timings. */
|
||||||
CAN_MCR(canport) &= ~CAN_MCR_INRQ;
|
CAN_BTR(canport) = sjw | ts2 | ts1 |
|
||||||
|
(u32)(CAN_BTR_BRP_MASK & (brp - 1));
|
||||||
|
|
||||||
/* Wait for acknowledge. */
|
/* Request initialization "leave". */
|
||||||
wait_ack = 0x00000000;
|
CAN_MCR(canport) &= ~CAN_MCR_INRQ;
|
||||||
while ((wait_ack != can_msr_inak_timeout) &&
|
|
||||||
((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)) {
|
|
||||||
wait_ack++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)
|
/* Wait for acknowledge. */
|
||||||
ret = 1;
|
wait_ack = 0x00000000;
|
||||||
|
while ((wait_ack != can_msr_inak_timeout) &&
|
||||||
|
((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)) {
|
||||||
|
wait_ack++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)
|
||||||
|
ret = 1;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,42 +207,43 @@ int can_transmit(u32 canport, u32 id, bool ext, bool rtr, u8 length, u8 *data)
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != -1) { /* Check if we have an empty mailbox. */
|
/* Check if we have an empty mailbox. */
|
||||||
if (ext) {
|
if (ret == -1)
|
||||||
/* Set extended ID. */
|
return ret;
|
||||||
CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_EXID_SHIFT;
|
|
||||||
/* Set extended ID indicator bit. */
|
|
||||||
CAN_TIxR(canport, mailbox) |= CAN_TIxR_IDE;
|
|
||||||
} else {
|
|
||||||
/* Set standard ID. */
|
|
||||||
CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_STID_SHIFT;
|
|
||||||
/* Unset extended ID indicator bit. */
|
|
||||||
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_IDE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set/clear remote transmission request bit. */
|
if (ext) {
|
||||||
if (rtr)
|
/* Set extended ID. */
|
||||||
CAN_TIxR(canport, mailbox) |= CAN_TIxR_RTR; /* Set */
|
CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_EXID_SHIFT;
|
||||||
else
|
/* Set extended ID indicator bit. */
|
||||||
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_RTR; /* Clear */
|
CAN_TIxR(canport, mailbox) |= CAN_TIxR_IDE;
|
||||||
|
} else {
|
||||||
/* Set the DLC. */
|
/* Set standard ID. */
|
||||||
CAN_TDTxR(canport, mailbox) &= 0xFFFFFFFF0;
|
CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_STID_SHIFT;
|
||||||
CAN_TDTxR(canport, mailbox) |= length & CAN_TDTxR_DLC_MASK;
|
/* Unset extended ID indicator bit. */
|
||||||
|
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_IDE;
|
||||||
/* Set the data. */
|
|
||||||
CAN_TDLxR(canport, mailbox) = 0;
|
|
||||||
CAN_TDHxR(canport, mailbox) = 0;
|
|
||||||
for (i = 0; (i < 4) && (i < length); i++)
|
|
||||||
CAN_TDLxR(canport, mailbox) |= (u32)data[i] << (8 * i);
|
|
||||||
for (i = 4; (i < 8) && (i < length); i++)
|
|
||||||
CAN_TDHxR(canport, mailbox)
|
|
||||||
|= (u32)data[i] << (8 * (i - 4));
|
|
||||||
|
|
||||||
/* Request transmission. */
|
|
||||||
CAN_TIxR(canport, mailbox) |= CAN_TIxR_TXRQ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set/clear remote transmission request bit. */
|
||||||
|
if (rtr)
|
||||||
|
CAN_TIxR(canport, mailbox) |= CAN_TIxR_RTR; /* Set */
|
||||||
|
else
|
||||||
|
CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_RTR; /* Clear */
|
||||||
|
|
||||||
|
/* Set the DLC. */
|
||||||
|
CAN_TDTxR(canport, mailbox) &= 0xFFFFFFFF0;
|
||||||
|
CAN_TDTxR(canport, mailbox) |= length & CAN_TDTxR_DLC_MASK;
|
||||||
|
|
||||||
|
/* Set the data. */
|
||||||
|
CAN_TDLxR(canport, mailbox) = 0;
|
||||||
|
CAN_TDHxR(canport, mailbox) = 0;
|
||||||
|
for (i = 0; (i < 4) && (i < length); i++)
|
||||||
|
CAN_TDLxR(canport, mailbox) |= (u32)data[i] << (8 * i);
|
||||||
|
for (i = 4; (i < 8) && (i < length); i++)
|
||||||
|
CAN_TDHxR(canport, mailbox) |= (u32)data[i] << (8 * (i - 4));
|
||||||
|
|
||||||
|
/* Request transmission. */
|
||||||
|
CAN_TIxR(canport, mailbox) |= CAN_TIxR_TXRQ;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user