Other Parts Discussed in Thread: EK-TM4C1294XL
Hi all,
I am trying to create a program for CAN bus loop back testing. However, my program below does not seems to work. Please advise.
int main(void)
{
//Enable clock to CAN and GPIO Port A
//Wait for the CAN Module and GPIO Port A Peripheral to be ready
*((uint32_t *)(SYSCTL_RCGCCAN)) |= (0x01 << 0);
*((uint32_t *)(SYSCTL_RCGCGPIO)) |= (0x00001 << 0);
while(!(*(uint32_t *)(SYSCTL_PRCAN) & (0x01 << 0)));
while(!(*(uint32_t *)(SYSCTL_PRGPIO) & (0x00001 << 0)));
//Configure the GPIO alternate function as UART
*((uint32_t *)(GPIO_PORTA_AHB + GPIO_O_AFSEL)) |= (0x03 << 0);
*((uint32_t *)(GPIO_PORTA_AHB + GPIO_O_DEN)) |= (0x03 << 0);
*((uint32_t *)(GPIO_PORTA_AHB + GPIO_O_PCTL)) |= (0x07 << 4 | 0x07 << 0);
//Initialize and configure CAN Module Bit Timing
*((uint32_t *)(CAN0 + CAN_O_CTL)) |= (0x1 << 0);
*((uint32_t *)(CAN0 + CAN_O_CTL)) |= (0x1 << 6);
*((uint32_t *)(CAN0 + CAN_O_BIT)) = (0x2 << 12 | 0x3 << 8 |
0x2 << 6 | 0x2 << 0);
*((uint32_t *)(CAN0 + CAN_O_CTL)) &= ~(0x1 << 0);
*((uint32_t *)(CAN0 + CAN_O_CTL)) &= ~(0x1 << 6);
//Configure CAN Module to Loopback Mode
*((uint32_t *)(CAN0 + CAN_O_CTL)) |= (0x1 << 7);
*((uint32_t *)(CAN0 + CAN_O_TST)) |= (0x1 << 4);
*((uint32_t *)(CAN0 + CAN_O_CTL)) |= (0x1 << 1);
//Configure Receive Message Object
*((uint32_t *)(CAN0 + CAN_O_IF1CMSK)) = (0x0 << 7 | 0x1 << 4 | 0x1 << 1 | 0x1 << 0);
*((uint32_t *)(CAN0 + CAN_O_IF1MSK1)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1MSK2)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1ARB1)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1ARB2)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1MCTL)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1ARB2)) = (0x1 << 15 | 0x5 << 2);
*((uint32_t *)(CAN0 + CAN_O_IF1MCTL)) = (0x1 << 7 | 0x8 << 0);
*((uint32_t *)(CAN0 + CAN_O_IF1CRQ)) = 1;
while(*(uint32_t *)(CAN_O_IF1CRQ) & 0x8000);
//Configure Transmit Message Object
*((uint32_t *)(CAN0 + CAN_O_IF1CMSK)) = (0x1 << 7 | 0x1 << 4 | 0x1 << 1 | 0x1 << 0);
*((uint32_t *)(CAN0 + CAN_O_IF1MSK1)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1MSK2)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1ARB1)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1ARB2)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1MCTL)) = 0;
*((uint32_t *)(CAN0 + CAN_O_IF1ARB2)) = (0x1 << 15 | 0x1 << 13 | 0x5 << 2);
*((uint32_t *)(CAN0 + CAN_O_IF1MCTL)) = (0x1 << 8 | 0x1 << 7 | 0x8 << 0);
*((uint32_t *)(CAN0 + CAN_O_IF1DA1)) = 0x1111;
*((uint32_t *)(CAN0 + CAN_O_IF1DA2)) = 0x2222;
*((uint32_t *)(CAN0 + CAN_O_IF1DB1)) = 0x3333;
*((uint32_t *)(CAN0 + CAN_O_IF1DB2)) = 0x4444;
*((uint32_t *)(CAN0 + CAN_O_IF1CRQ)) = 2;
while(*(uint32_t *)(CAN_O_IF1CRQ) & 0x8000);
//Initiate a Transmit Request
*((uint32_t *)(CAN0 + CAN_O_IF1MCTL)) |= (0x1 << 8);
*((uint32_t *)(CAN0 + CAN_O_IF2CMSK)) = (0x0 << 7 | 0x1 << 6 | 0x1 << 5 | 0x1 << 4 | 0x1 << 1 | 0x1 << 0);
*((uint32_t *)(CAN0 + CAN_O_IF2CRQ)) = 1;
while(*(uint32_t *)(CAN_O_IF2CRQ) & 0x8000);
while(1);
}