[TI]/LuminaryMicro2010. 6. 17. 18:05

Luminary Micro Cortex-M3 CAN 통신

Luminary Micro Cortex-M3 CAN 통신

■ CAN protocol version 2.0 part A/B
■ Bit rates up to 1 Mbps
32 message objects with individual identifier masks
■ Maskable interrupt
■ Disable Automatic Retransmission mode for Time-Triggered CAN (TTCAN) applications
■ Programmable Loopback mode for self-test operation
■ Programmable FIFO mode enables storage of multiple message objects
■ Gluelessly attaches to an external CAN interface through the CANnTX and CANnRX signals

CAN 블록도



CAN 핀맵
Luminary Micro에서 출시되는 Cortex-M3시리즈는 동일한 핀맵을 가지고 있는것 같다. PD0(CANrx), PD1(CANtx)로 할당되어 있다.
아래 그림은 64핀 패키지의 LM3S5732의 핀맵이다. LM3S2965도 동일하지만 100핀이므로 핀번호는 다르다.



CAN 메세지 전송하기
CAN데이터를 전송하려면 먼저 CAN Message Object를 초기화하고 전송해야 한다.
tCANMsgObject g_MsgObjectRx;

//메세지 오브젝트 초기화
void CANConfigureNetwork(void)
{
    //TX용 CAN 메시제 오프젝트 초기화
    g_MsgObjectTx.ulMsgID = 0x02;   //CAN ID
    g_MsgObjectTx.ulMsgIDMask = 0;

    //인터럽트 설정
    g_MsgObjectTx.ulFlags = MSG_OBJ_TX_INT_ENABLE;

    //메세지 크기
    g_MsgObjectTx.ulMsgLen = MAX_CAN_MSG_SIZE;
    //메시지 버퍼 설정
    g_MsgObjectTx.pucMsgData = g_CanTxMsgBuffer;
}

//CAN 메세지 전송
void SendCanMsg(unsigned char MsgId, unsigned char ucEvent, unsigned char Data)
{
    //MsgId : Message Object의 번호(수신측에서는 의미없는 값이다.)
 
    g_MsgObjectTx.pucMsgData[0] = ucEvent;
    g_MsgObjectTx.pucMsgData[1] = Data;

 /*
    //필요에 따라서 설정
    g_MsgObjectTx.pucMsgData[2] = 0;
    g_MsgObjectTx.pucMsgData[3] = 0;
 
    g_MsgObjectTx.pucMsgData[4] = 0;
    g_MsgObjectTx.pucMsgData[5] = 0;
    g_MsgObjectTx.pucMsgData[6] = 0;
    g_MsgObjectTx.pucMsgData[7] = 0;
 */ 
 
    CANMessageSet(CAN0_BASE, MsgId, &g_MsgObjectTx, MSG_OBJ_TYPE_TX);
}



CAN메세지 수신하기
CAN데이터를 전송하려면 먼저 CAN Message Object를 초기화 해야 수신할 수 있다. 수신하고 싶은 ID를 msg.ulMsgID 에 정의 하고 CANMessageSet()함수로 설정 할 수 있다. 물론 message object개수(1~32)만큼 설정 가능하다.

//메세지 오브젝트 초기화
void CANConfigureNetwork(void)
{
 tCANMsgObject msg;

    //수신할 CAN ID
    msg.ulMsgID = 0x02;
    msg.ulMsgIDMask = 0;//0xFF;

    //인터럽트 사용
    msg.ulFlags = MSG_OBJ_RX_INT_ENABLE;

    //수신할 버퍼와 크기
    msg.ulMsgLen = MAX_CAN_MSG_SIZE;
    msg.pucMsgData = g_CanTxMsgBuffer;

    //수신할 message object 초기화 (message object : 1~32)
    CANMessageSet(CAN0_BASE, 1, &msg, MSG_OBJ_TYPE_RX);
}


CAN 인터럽트 핸들러
void CANHandler(void)
{
    unsigned long rx_id_status;

    //CAN 인터럽트의 상태값을 읽어온다
    rx_id_status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
   
     //읽은후 지운다
    CANIntClear(CAN0_BASE, rx_id_status); 
     
 //CAN 인터럽트 처리
 if(rx_id_status)
 {
  //message object 깂을 읽어온다 - 읽어오면 지워진다
  CANMessageGet(CAN0_BASE, rx_id_status, &g_MsgObjectRx, 1);
  
  DebugPrint("[ID%02X %02X:%02x:%02x] : ",
        rx_id_status,    //message object 번호
     g_MsgObjectRx.ulMsgID,  //수신한 CAN ID
     g_MsgObjectRx.ulMsgIDMask,
     g_MsgObjectRx.ulMsgLen 
     );

  //수신한 데이터 출력
  DebugPrint("%02x %02x %02x %02x | %02x %02x %02x %02x\r\n",
    g_MsgObjectRx.pucMsgData[0],
    g_MsgObjectRx.pucMsgData[1],
    g_MsgObjectRx.pucMsgData[2],
    g_MsgObjectRx.pucMsgData[3],
    g_MsgObjectRx.pucMsgData[4],
    g_MsgObjectRx.pucMsgData[5],
    g_MsgObjectRx.pucMsgData[6],
    g_MsgObjectRx.pucMsgData[7]    
    ); 
 }
}


LM3S2965 -> LM3S5732 CAN테스트 결과
message object 번호 1의 내용은 CAN ID 2를 8바이트 수신해서 출력하고 있다.
[ID01 02:00:08] : 01 9d 00 00 | 00 00 00 00
[ID01 02:00:08] : 01 9e 00 00 | 00 00 00 00
[ID01 02:00:08] : 01 9f 00 00 | 00 00 00 00
[ID01 02:00:08] : 01 a0 00 00 | 00 00 00 00
Posted by nexp

댓글을 달아 주세요

[TI]/LuminaryMicro2009. 10. 24. 12:02

[LM3S3748 EVM] LuminaryMicro Cortex-M3 USB 테스트

[LM3S3748 EVM] LuminaryMicro Cortex-M3 USB 테스트



USB OTG기능이 있는 Luminary Micro사의 Cortex-M3 LM3S3748 의 USB기능을 테스트 했다.


PC Host 테스트 프로그램
Visual Studio 2008을 이용하여 데이터 송수신을 테스트 할 수 있는 예제를 작성하였다.



테스트 동영상



[LM3S3748 EVM] USB Host Module




LM3S3748 USB회로 구성시 주의 사항
USB블럭으로 인가되는 전원 포트가 PB1과 공유하도록 되어 있다.
자세하게 보지 않으면 실수 할 수 있는데... PB1/USB0VBUS 핀을 USB전원으로 연결해야 한다.
연결되지 않으면 USB동작을 하지 하지 않는다.
메뉴얼에 블록도로 좀 자세하게 나와 있으면 좋을것 같은데... 아쉬운 부분이다.
Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2010.06.21 03:46 [ ADDR : EDIT/ DEL : REPLY ]

[TI]/LuminaryMicro2009. 9. 21. 21:15

Luminary Micro Cortex-M3 UART H/W FIFO 사용하기

Luminary Micro Cortex-M3 UART H/W FIFO 사용하기

Luminary Micro Cortex-M3 는 H/W UART FIFO가 있어 UART처리가 상당히 편리하다.




FIFO Operation


LM3S608 UART FIFO 테스트 예제 코드
기존 S/W FIFO를 만들어 사용하던 코드를 그대로 사용하기 위해 #define문으로 코드를 약간 수정하였다.

#define IsRingEmpty()               !UARTCharsAvail(UART0_BASE)
#define GetRingBuffer()             UARTCharGetNonBlocking(UART0_BASE)

void UARTIntHandler1(void)
{
    unsigned long ulStatus;

      // Get the interrrupt status.
      ulStatus = UARTIntStatus(UART0_BASE, true);

      // Clear the asserted interrupts.
      UARTIntClear(UART0_BASE, ulStatus);

     ProcessDataPacket();
}


void ProcessDataPacket(void)
{
 unsigned char rx_data;

  //수신패킷 처리
  if(!IsRingEmpty())
  {
   rx_data = GetRingBuffer();
         :
  }
}

Posted by nexp

댓글을 달아 주세요

[TI]/LuminaryMicro2009. 5. 1. 21:23

[LM3S3748 EVM] USB Host Controller 보드 제작

[LM3S3748 EVM] USB Host Controller 보드 제작



Luminary Micro Cortex-M3 LM3S3748 USB Host Controller 보드를 제작했다. [M-Type EVM] 형태로 제작해 동일 핀맵으로 테스트 가능하도록 했다.



확장 테스트 보드 연결



USB Host테스트

Posted by nexp

댓글을 달아 주세요

  1. 김대안

    이거 만든 보드 파시나요? 파시면 하나만 사고 싶은데

    2009.09.16 14:39 [ ADDR : EDIT/ DEL : REPLY ]

[TI]/LuminaryMicro2009. 3. 7. 21:41

Luminary BLDC Motor Driver DK 테스트

Luminary BLDC Motor Driver DK 테스트



BLDC Motor Controller Consol Board
CAN 인터페이스로 Driver보드에 속도 및 위치 제어 신호를 보내는 역할을 하는 테스트 보드로 CAN으로 Driver 보드의 펌웨어까지 업데이트 가능하다.


Luminary Micro의 BLDC Motor Driver
CAN인터페이스로 속도 및 위치 제어 신호를 받아 모터를 제어 하거나 외부에서 PWM, Direction 신호를 공급해 모터를 드라이브 할 수있다.



테스트 동영상
Host MCU(LM3S2965)에서 CAN통신으로 전압설정을 하면 모터가 구동되는 예제로 12V까지 설정 가능하다. CAN ID는 12개 까지 설정 가능하다.



소스코드()


Feature
• Quiet control of brushed DC motors
– 15 kHz PWM frequency
• Two options for Speed control
– Industry-standard R-C servo type (PWM) interface
– Controller Area Network (CAN) interface
• CAN communication
– Full configurability of module options
– Real-time monitoring of current, voltage, speed,
and speed
– Load firmware over CAN
• Status LED indicates Run, Direction, and Fault Conditions
• Motor brake/coast selector
• Limit switch inputs for forward and reverse directions
• Quadrature encoder input (QEI) and Analog input
• Colored screw terminals for all power wiring
– Headers (0.1 inch pitch) for all control signals
• Easy to customize
– Includes full source code, example applications, and
design files
– Develop using tools from Keil, IAR, Code Sourcery, or
Code Red (using a Stellaris evaluation kit or preferred
ARM Cortex-M3 debugger)
– Supported by Stellaris Peripheral Driver Library
Posted by nexp

댓글을 달아 주세요