CAN Messaging

Vorraussetzungen: [HW] Controller

Übung

Das ARM-CAN Controller Board LM3S5632 MCU wird mit Hilfe der Texas Instruments (früher Luminary Micro) Software Library programmiert. Die Library beinhaltet alle Funktionen um die Register eines Microcontrollers zu manipulieren. Das LM3S5632 beinhaltet ein CAN 2.0 Controller mit 32 Message Objekten welche automatisch Nachrichten senden und empfangen.

Die am meisten genutzten Funktionen mit CAN Controllern sind CANMessageSet und CANMessageGet. Die Erste konfiguriert eine der 32 Message Objekte um eine Nachricht zu senden oder zu empfangen und die andere um die gesendete oder empfangene Nachricht auszulesen. Beide nutzen eine tCANMsgObject Struktur um Message ID, Maske, Flaggen und Payload zu spezifizieren.

Das folgende Programm zeigt wir man einen CAN Controller einrichtet und auf eine Nachricht wartet:

//*****************************************************************************
//
// CAN message receiving.
//
//*****************************************************************************
 
#include <inc/hw_ints.h>
#include <inc/hw_memmap.h>
#include <inc/hw_types.h>
#include <driverlib/sysctl.h>
#include <driverlib/can.h>
 
//*****************************************************************************
//
// Main function.
//
//*****************************************************************************
int main(void)
{	
	tCANMsgObject psMsg;
	unsigned char pucData[8];
 
	//
	// Set the clocking to run from the PLL at 50MHz
	//
	SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
	   SYSCTL_XTAL_8MHZ);
 
	//
	// Enable peripherals.
	//	
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
	SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);		
 
	//
	// Configure CAN pins.
	//
	GPIOPinTypeCAN(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);	
 
	//
	// Enable the CAN controller.
	//    
	CANInit(CAN0_BASE);
	CANBitRateSet(CAN0_BASE, SysCtlClockGet(), CAN_BITRATE);
	CANEnable(CAN0_BASE);	
 
	//
	// Create receive message object.
	//	
	psMsg.ulMsgID     = 0x01;
	psMsg.ulMsgIDMask = 0xFF;
	psMsg.ulFlags     = MSG_OBJ_NO_FLAGS;	
	psMsg.pucMsgData  = pucData;
 
	//
	// Set message object on box 1.
	//
	CANMessageSet(CAN0_BASE, 1, &psEchoMsg, MSG_OBJ_TYPE_RX);
 
	//
	// Loop forever.
	//
	while (1)
	{	
		//
		// CAN message received ?
		//
		if (CANStatusGet(CAN0_BASE, CAN_STS_NEWDAT) & 1)
		{
			//
			// Get the message.
			//
			CANMessageGet(CAN0_BASE, CAN_MSG_OBJ_RX, &psMsg, true);
 
			//
			// Access pucData here.
			// To get the length of the data read psMsg.ulMsgLen
			//
		}
	}
}