SLAU533D September   2013  – April 2017

 

  1.   MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP)
    1.     Trademarks
    2. 1 Getting Started
      1. 1.1 Key Features
      2. 1.2 Kit Contents
      3. 1.3 Out-of-Box Experience
        1. 1.3.1 Step 1: Install a Software Development Platform
        2. 1.3.2 Step 2: Connect the Hardware
        3. 1.3.3 Step 3: Verify the storage volume has been loaded
        4. 1.3.4 Step 4: Open a text editor, and press the buttons
        5. 1.3.5 Step 5: Customize the strings
    3. 2 Hardware
      1. 2.1 Block Diagram
      2. 2.2 Hardware Features
        1. 2.2.1 MSP430F5529
        2. 2.2.2 eZ-FET lite Onboard Emulator
        3. 2.2.3 Integrated Full-Speed USB Hub
        4. 2.2.4 Power
        5. 2.2.5 Clocking
        6. 2.2.6 Application (or "Backchannel") UART
        7. 2.2.7 Emulator and Target Isolation Jumper Block
        8. 2.2.8 Isolation Jumper Block: 3.3-V and 5-V Jumpers
        9. 2.2.9 Isolation Jumper Block: Emulator Connection and Application UART
      3. 2.3 Measure Current Draw of MSP430 MCU
      4. 2.4 Using an External Power Source
        1. 2.4.1 External 3.3-V Power Source
        2. 2.4.2 External 5-V Power Source Without USB Connection
        3. 2.4.3 External 5-V Power Source With USB Connection
      5. 2.5 Using the eZ-FET lite Emulator With a Different Target
      6. 2.6 USB BSL Button
      7. 2.7 BoosterPack Plug-in Module Pinout
      8. 2.8 Design Files
      9. 2.9 Hardware Change Log
    4. 3 Software Examples
      1. 3.1 MSP430 Software Libraries: driverlib and the USB API
      2. 3.2 Viewing the Code
        1. 3.2.1 CCS
        2. 3.2.2 IAR
      3. 3.3 Example Project Software Organization
      4. 3.4 USB Configuration Files
      5. 3.5 Out-of-Box Experience: emulStorageKeyboard
        1. 3.5.1  Flowchart
        2. 3.5.2  Pre-Initialization
        3. 3.5.3  Initialization
          1. 3.5.3.1 Configuring the Keyboard
          2. 3.5.3.2 Configuring the MSC Interface
        4. 3.5.4  Handling SCSI Commands
        5. 3.5.5  LPM0 Entry
        6. 3.5.6  LPM0 Exit
        7. 3.5.7  Emulated Storage Volume
        8. 3.5.8  Sending Data as a USB Keyboard
        9. 3.5.9  Properly Handling USB Unplug Events
        10. 3.5.10 Non-Maskable Interrupt (NMI) Vector
      6. 3.6 Example: simpleUsbBackchannel
        1. 3.6.1 What It Does
        2. 3.6.2 Installing the CDC Interface
        3. 3.6.3 Operating the Example
        4. 3.6.4 Backchannel UART Library: bcUart.c, bcUart.h
        5. 3.6.5 Code Description: Initialization
          1. 3.6.5.1 Stopping the Watchdog
          2. 3.6.5.2 Configuring VCORE
          3. 3.6.5.3 Configuring Clocks
          4. 3.6.5.4 Configuring Ports
          5. 3.6.5.5 Initializing the Backchannel UART
          6. 3.6.5.6 Configuring USB
        6. 3.6.6 Code Description: Main Loop
        7. 3.6.7 Modifying to Use an HID-Datapipe Interface
      7. 3.7 Starting Device Manager
    5. 4 Additional Resources
      1. 4.1 LaunchPad Development Kit Websites
      2. 4.2 Information on the MSP430F5529
      3. 4.3 Download CCS, IAR, mspgcc, or Energia
      4. 4.4 USB Developers Package
      5. 4.5 MSP430Ware and TI Resource Explorer
      6. 4.6 F5529 Code Examples
      7. 4.7 MSP430 Application Notes
      8. 4.8 TI E2E Community
      9. 4.9 Community at Large
    6. 5 FAQs
    7. 6 Schematics
  2.   Revision History

Code Description: Main Loop

The following code sample shows the main loop.

while(1) { // Receive backchannel UART bytes, send over USB rxByteCount = bcUartReceiveBytesInBuffer(buf_bcuartToUsb); if(rxByteCount) { cdcSendDataInBackground(buf_bcuartToUsb, rxByteCount, CDC0_INTFNUM, 1000); //hidSendDataInBackground(buf_bcuartToUsb, rxByteCount, HID0_INTFNUM, 1000); } // Receive USB bytes, send over backchannel UART rxByteCount = cdcReceiveDataInBuffer(buf_usbToBcuart, sizeof(buf_usbToBcuart), CDC0_INTFNUM); /*rxByteCount = hidReceiveDataInBuffer(buf_usbToBcuart, sizeof(buf_usbToBcuart), HID0_INTFNUM); */ if(rxByteCount) { bcUartSend(buf_usbToBcuart, rxByteCount); } }

The main loop does the following actions for both the backchannel UART and USB CDC interface:

  • Copies data from their respective input buffers.
  • If any data was present, retransmits the data over the other interface.

When data arrives at the USCI_A1 backchannel UART, it is immediately copied to the receive buffer, bcUartRcvBuf. Then, because this main loop never sleeps, it frequently checks if any bytes are waiting in the receive buffer using bcUartReceiveBytesInBuffer(). If bytes are waiting, the bytes are copied into buf_bcuartToUsb. Then cdcSendDataInBackground() sends them over the application's CDC interface to the host PC.

The same happens in the other direction. When data arrives over the USB CDC interface, the USB hardware module places them into the USB endpoint buffers. The main loop calls cdcReceiveDataInBuffer(), which checks if any bytes have been received; if so, they are copied into buf_usbtoBcuart. Then, bcUartSend() sends them over the backchannel UART.

When data is sent over a UART, communication generally happens quickly, because it is low-level and has essentially no overhead. After a byte is written to the TXBUF register, the time is very brief before TXBUF is ready to send the next byte. Therefore, bcUartSend() does not return until all bytes are sent. Hardware flow control could theoretically keep execution here indefinitely, but it is usually a safe assumption that the eZ-FET lite's MSP430, which is at the other end of this hardware UART connection, will quickly de-assert flow control and be ready to receive data.

Sending data over a USB interface is very different. Multiple communication layers, both hardware and software, exist between the MSP430 application and the bus. There is a higher potential for the host and bus to respond slowly. So, sending data over USB is an interrupt-driven process, involving multiple interrupts over time. Polling in one place until all data is sent is possible but carries some risk of blocking execution.

The USB API provides two construct functions for CDC interfaces. cdcSendDataWaitTilDone() waits until the sending is complete before proceeding to the next line of code. cdcSendDataInBackground() only initiates the sending operation and returns immediately while data is sent in the background behind subsequent lines of code. However, cdcSendDataInBackground() always checks to ensure there is not a previous send operation still open and polls until that operation is complete. Both functions have a retry parameter, so they can only block for a limited amount of time.

This example of USB sending and receiving is sufficient for simple situations, but its handling of events like surprise removal of the USB cable is simplistic. If USB is present, it sends data. If not, then it simply returns an error (which is not even checked) and moves forward. More sophisticated applications may need to pay attention to return codes and consider USB surprise removals. The emulStorageKeyboard example in Section 3.5 demonstrates this.