Other Parts Discussed in Thread: SN65HVD233-HT, SN74LVC4245A, SN74LV244A
I am working on CAN bus.
I am using simple_tx and simple_rx code given in example folder (peripheral-CAN).
I have modified that code since I don't want to use UART and made code simple.
But this doesn't work for me.
Different hardware connections and corresponding output waveform, I have attached in following document. Please see that.
and the hardware connection :
All jumpers are in default position.
//////////////////////////////// SIMPLE_TX CODE #include <stdbool.h> #include <stdint.h> #include "inc/hw_can.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "driverlib/can.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" volatile uint32_t g_ui32MsgCount = 0; unsigned int sysClock; volatile bool g_bErrFlag = 0; void InitConsole(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // enable UART0 GPIO peripheral GPIOPinConfigure(GPIO_PD4_U2RX); GPIOPinConfigure(GPIO_PD5_U2TX); SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2); UARTClockSourceSet(UART2_BASE, UART_CLOCK_PIOSC); GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5); //UARTStdioConfig(0, 115200, sysClock); } void SimpleDelay(void) { SysCtlDelay(40000000); } void CANIntHandler(void) { uint32_t ui32Status; ui32Status = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE); if(ui32Status == CAN_INT_INTID_STATUS) { ui32Status = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL); g_bErrFlag = 1; } else if(ui32Status == 1) { CANIntClear(CAN1_BASE, 1); g_ui32MsgCount++; g_bErrFlag = 0; } else { } } int main(void) { tCANMsgObject sCANMessage; uint32_t ui32MsgData=0; uint8_t *pui8MsgData; pui8MsgData = (uint8_t *)&ui32MsgData; sysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000);SimpleDelay(); //InitConsole(); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);SimpleDelay(); GPIOPinConfigure(GPIO_PB0_CAN1RX); GPIOPinConfigure(GPIO_PB1_CAN1TX); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1); CANInit(CAN1_BASE);SimpleDelay(); CANBitRateSet(CAN1_BASE, SysCtlClockGet(), 500000);SimpleDelay(); CANIntRegister(CAN1_BASE, CANIntHandler); SimpleDelay(); CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);SimpleDelay(); IntEnable(INT_CAN1);SimpleDelay(); CANEnable(CAN1_BASE);SimpleDelay(); ui32MsgData = 0xAA; sCANMessage.ui32MsgID = 1; sCANMessage.ui32MsgIDMask = 0; sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE; sCANMessage.ui32MsgLen = sizeof(pui8MsgData); sCANMessage.pui8MsgData = pui8MsgData; while(1) { //UARTprintf("Sending msg: 0x%02X %02X %02X %02X",pui8MsgData[0], pui8MsgData[1], pui8MsgData[2],pui8MsgData[3]); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x02); CANMessageSet(CAN1_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_TX);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x08);SimpleDelay(); if(g_bErrFlag) { //UARTprintf(" error - cable connected?\n"); } else { //UARTprintf(" total count = %u\n", g_ui32MsgCount); } /*ui32MsgData++; if(ui32MsgData>=0x65) { ui32MsgData = 0x55; }*/ while(1) { } } return(0); } ///////////////////////////////////////////////// SIMPLE_TX CODE END
///////////////////////////////////////////////// SIMPLE_RX CODE #include <stdbool.h> #include <stdint.h> #include "inc/hw_can.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/can.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" unsigned int sysClock; volatile uint32_t g_ui32MsgCount = 0; volatile bool g_bRXFlag = 0; volatile bool g_bErrFlag = 0; void SimpleDelay(void) { SysCtlDelay(20000000); } //***************************************************************************** void InitConsole(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // enable UART0 GPIO peripheral GPIOPinConfigure(GPIO_PD4_U2RX); GPIOPinConfigure(GPIO_PD5_U2TX); SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2); UARTClockSourceSet(UART2_BASE, UART_CLOCK_PIOSC); GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5); //UARTStdioConfig(0, 115200, sysClock); } void CANIntHandler(void) { uint32_t ui32Status; ui32Status = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE); if(ui32Status == CAN_INT_INTID_STATUS) { ui32Status = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL); g_bErrFlag = 1; } else if(ui32Status == 1) { CANIntClear(CAN1_BASE, 1); g_ui32MsgCount++; g_bRXFlag = 1; g_bErrFlag = 0; } else { } } int main(void) { tCANMsgObject sCANMessage; uint8_t pui8MsgData[8]; sysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); //InitConsole(); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinConfigure(GPIO_PB0_CAN1RX); GPIOPinConfigure(GPIO_PB1_CAN1TX); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1);SimpleDelay(); CANInit(CAN1_BASE);SimpleDelay(); CANBitRateSet(CAN1_BASE, SysCtlClockGet(), 500000);SimpleDelay(); CANIntRegister(CAN1_BASE, CANIntHandler); SimpleDelay(); CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);SimpleDelay(); IntEnable(INT_CAN1);SimpleDelay(); CANEnable(CAN1_BASE);SimpleDelay(); sCANMessage.ui32MsgIDMask = 0; sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; sCANMessage.ui32MsgLen = 8; CANMessageSet(CAN1_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX); for(;;) { unsigned int uIdx; if(g_bRXFlag) { GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x08); SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x02); sCANMessage.pui8MsgData = pui8MsgData; CANMessageGet(CAN1_BASE, 1, &sCANMessage, 0); g_bRXFlag = 0; if(sCANMessage.ui32Flags & MSG_OBJ_DATA_LOST) { //UARTprintf("CAN message loss detected\n"); } //UARTprintf("Msg ID=0x%08X len=%u data=0x",sCANMessage.ui32MsgID, sCANMessage.ui32MsgLen); for(uIdx = 0; uIdx < sCANMessage.ui32MsgLen; uIdx++) { //UARTprintf("%02X ", pui8MsgData[uIdx]); if(pui8MsgData[uIdx]==0xAA) { GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x02);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x08);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x02);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x08);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x02);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x08);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x02);SimpleDelay(); GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1, 0x08);SimpleDelay(); } } //UARTprintf("total count=%u\n", g_ui32MsgCount); } } return(0); } ///////////////////////////////////////////////// SIMPLE_RX CODE END
I think I have done some mistake in hardware or in code. I am not able to debug that.
Amit suggested SN65HVD233-HT 3.3-V CAN Transceiver.
Is it issue of MCP2551 CAN Transceiver because of voltage levels(TTL)..???
I have tried LVTTL to TTL convertor and TTL to LVTTL convertor , SN74LV244A and SN74LVC4245A. Still getting same error.
Regards,
Krishnat