chipKIT® Development Platform

Inspired by Arduino™

Network Shield - CAN Bus - can't RX, but TX works

Created Wed, 17 Dec 2014 17:51:23 +0000 by ddfndr


ddfndr

Wed, 17 Dec 2014 17:51:23 +0000

Hi,

I am using the Chipkit Network Shield and the CAN Bus for my project. Currently I am having some issues to receive messages. Transmitting messages works. The transmitted messages appear on my PC.

My current Setup looks like this:

  • Chipkit Network Shield connect to a CAN interface
  • The CAN interface is logging received messages and generating messages for transmission

This is my initialization function of CAN1. I used the example code and modified it.

void init_can1()
{
    CAN_BIT_CONFIG canBitConfig;

	/* Step 1: Switch the CAN module
	 * ON and switch it to Configuration
	 * mode. Wait till the switch is
	 * complete */

	CANEnableModule(CAN1,TRUE);

	CANSetOperatingMode(CAN1, CAN_CONFIGURATION);
	while(CANGetOperatingMode(CAN1) != CAN_CONFIGURATION);

	/* Step 2: Configure the CAN Module Clock. The
	 * CAN_BIT_CONFIG data structure is used
	 * for this purpose. The propagation,
	 * phase segment 1 and phase segment 2
	 * are configured to have 3TQ. The CANSetSpeed()
     * function sets the baud. */

	canBitConfig.phaseSeg2Tq            = CAN_BIT_3TQ;
	canBitConfig.phaseSeg1Tq            = CAN_BIT_3TQ;
	canBitConfig.propagationSegTq       = CAN_BIT_3TQ;
	canBitConfig.phaseSeg2TimeSelect    = TRUE;
	canBitConfig.sample3Time            = TRUE;
    canBitConfig.syncJumpWidth          = CAN_BIT_2TQ;

   CANSetSpeed(CAN1,&canBitConfig,SYS_FREQ,CAN_BUS_SPEED);

	/* Step 3: Assign the buffer area to the
     * CAN module.
     */
/* Note the size of each Channel area.
 * It is 2 (Channels) * 8 (Messages Buffers)
 * 16 (bytes/per message buffer) bytes. Each
 * CAN module should have its own message
 * area. */
	CANAssignMemoryBuffer(CAN1,CAN1MessageFifoArea,2 * 8 * 16);

	/* Step 4: Configure channel 0 for TX and size of
     * 8 message buffers with RTR disabled and low medium
     * priority. Configure channel 1 for RX and size
     * of 8 message buffers and receive the full message.
     */
CANConfigureChannelForTx(CAN1,CAN_CHANNEL0,8,CAN_TX_RTR_DISABLED,CAN_LOW_MEDIUM_PRIORITY);
    CANConfigureChannelForRx(CAN1,CAN_CHANNEL1,8,CAN_RX_FULL_RECEIVE);

	/* Step 5: Configure filters and mask.  */
    CANEnableFilter         (CAN1, CAN_FILTER0, FALSE);

	/* Step 6: Enable interrupt and events. Enable the receive
     * channel not empty event (channel event) and the receive
     * channel event (module event).
     * The interrrupt peripheral library is used to enable
     * the CAN interrupt to the CPU. */
    CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);
    CANEnableModuleEvent(CAN1, CAN_RX_EVENT, TRUE);
		CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_INVALID_RX_MESSAGE_EVENT, TRUE);
		CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_ANY_EVENT, TRUE);

    /* These functions are from interrupt peripheral
     * library. */
    INTSetVectorPriority(INT_CAN_1_VECTOR, INT_PRIORITY_LEVEL_4);
    INTSetVectorSubPriority(INT_CAN_1_VECTOR, INT_SUB_PRIORITY_LEVEL_0);
    INTEnable(INT_CAN1, INT_ENABLED);

	/* Step 7: Switch the CAN mode
	 * to normal mode. */
	CANSetOperatingMode(CAN1, CAN_NORMAL_OPERATION);
	while(CANGetOperatingMode(CAN1) != CAN_NORMAL_OPERATION);

}

The problem is:

  • TX works (at PC)
  • RX works (at PC)
  • TX works (at ChipKit)
  • RX don't (at ChipKit)

The interrupt is not triggerd. I've tried to register for CAN_RX_CHANNEL_ANY_EVENT, but still nothing happens. Maybe the configuration of the interrupt ist done incorrect. Any problem regarding the bus speed can be excluded, because the transmission of a CAN message from the Network Shield to the PC works fine.

Do you have any idea what I am doing wrong?

Thanks Dietrich


Jacob Christ

Sun, 04 Jan 2015 16:23:02 +0000

Did you figure this out? We at PONTECH are about to embark on CAN with chipKIT and its murky water for us. I found some posts from people earlier that were having success.

Jacob


ddfndr

Wed, 07 Jan 2015 12:56:34 +0000

Hi Jacob,

My configuration of the filter was wrong.To receive every message, I set it up like this:

CANConfigureFilter (CAN1, CAN_FILTER0, 0x1, CAN_SID);
CANConfigureFilterMask (CAN1, CAN_FILTER_MASK0, 0x0, CAN_SID, CAN_FILTER_MASK_IDE_TYPE);
CANLinkFilterToChannel (CAN1, CAN_FILTER0, CAN_FILTER_MASK0, CAN_CHANNEL1);
CANEnableFilter (CAN1, CAN_FILTER0, TRUE);

Now I am receiving correctly. Hope this helps.