Example of using Xbus library to communicate with an MTi-1 series device using a full-duplex UART connection.

Dependencies:   mbed-rtos mbed Xbus

Fork of MTi-1_example by Alex Young

Important Information

This example is deprecated and no longer maintained. There are new embedded examples available in the MT SDK folder of the MT Software Suite. For more information please visit: https://xsenstechnologies.force.com/knowledgebase/s/article/Introduction-to-the-MT-SDK-programming-examples-for-MTi-devices

Overview

The example program demonstrates connecting to an MTi-1 series device, restoring communications settings to default if necessary, and configuring the MTi to send data. For an MTi-1 the device is configured to send inertial sensor data, while MTi-2 and MTi-3 devices are configured to output orientation data using the onboard XKF3i filter.

Communication with the MTi-1 series device is implemented using a either a full-duplex UART, I2C or SPI bus. A reset line is used to reset the MTi during initialization. Data is output to a host PC terminal using a second UART.

For more information on the MTi-1 series communication protocol please refer to the datasheet: https://www.xsens.com/download/pdf/documentation/mti-1/mti-1-series_datasheet.pdf

Supported Platforms

The program has been tested on the following mbed platforms:

Using the Example

  1. To use the example program connect one of the supported mbed boards to the host PC and download the application from the mbed online compiler to the target device.
  2. With the mbed board unpowered (USB disconnected) wire the mbed board to the MTi-1 development board. The following connections are required:
    • In all cases:
      • 5V (or 3V3) main supply to VDD (P300-1)
      • MCU IO voltage (IORef) to VDDIO (P300-2)
      • GND to GND (P300-3)
      • MT_NRESET to nRST (P300-5)
    • For I2C communication:
      • MT_SCL to I2C_SCL (P300-9)
      • MT_SDA to I2C_SDA (P300-11)
      • MT_DRDY to DRDY (P300-15)
      • MT_ADD0 to ADD0 (P300-17)
      • MT_ADD1 to ADD1 (P300-19)
      • MT_ADD2 to ADD2 (P300-21)
    • For SPI communication:
      • MT_DRDY to DRDY (P300-15)
      • MT_SCLK to SPI_SCK (P300-17)
      • MT_MISO to SPI_MISO (P300-19)
      • MT_MOSI to SPI_MOSI (P300-21)
      • MT_nCS to SPI_nCS (P300-23)
    • For UART communication:
      • MT_RX to UART_TX (P300-9)
      • MT_TX to UART_RX (P300-11)

For more information on the MTi-1 development board please refer to the MTi-1 series user manual: https://www.xsens.com/download/pdf/documentation/mti-1/mti-1-series_dk_user_manual.pdf

Information

Check the defines at the top of main.cpp to determine which IO pins are used for the MT_xxx connections on each mbed platform.

Information

The active peripheral (I2C, SPI or UART) is selected on the MTi-1 development board through the PSEL0 and PSEL1 switches. Look on the bottom of the development board for the correct settings.

  1. Connect to the target using a serial terminal. The application is configured for:
    • Baudrate = 921600
    • Stop bits = 1
    • No parity bits
    • No flow control
  2. Reset the mbed board.
  3. You should be presented with a simple user interface as shown below:
MTi-1 series embedded example firmware.
Device ready for operation.
Found device with ID: 03880011.
Device is an MTi-3: Attitude Heading Reference System.
Output configuration set to:
        Packet counter: 65535 Hz
        Sample time fine: 65535 Hz
        Quaternion: 100 Hz
        Status word: 65535 Hz

Press 'm' to start measuring and 'c' to return to config mode.
Committer:
Alex Young
Date:
Tue May 19 16:59:11 2015 +0200
Revision:
21:6015b8be3a00
Parent:
18:2073072bad51
Child:
28:ae74baf7e5ab
Add function to convert XsDataIdentifier to string

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Alex Young 18:2073072bad51 1 /*!
Alex Young 18:2073072bad51 2 * \file
Alex Young 18:2073072bad51 3 * \copyright
Alex Young 18:2073072bad51 4 * Copyright (C) Xsens Technologies B.V., 2015. All rights reserved.
Alex Young 18:2073072bad51 5 *
Alex Young 18:2073072bad51 6 * This source code is intended for use only by Xsens Technologies BV and
Alex Young 18:2073072bad51 7 * those that have explicit written permission to use it from
Alex Young 18:2073072bad51 8 * Xsens Technologies BV.
Alex Young 18:2073072bad51 9 *
Alex Young 18:2073072bad51 10 * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
Alex Young 18:2073072bad51 11 * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
Alex Young 18:2073072bad51 12 * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
Alex Young 18:2073072bad51 13 * PARTICULAR PURPOSE.
Alex Young 18:2073072bad51 14 */
Alex Young 18:2073072bad51 15
Alex Young 18:2073072bad51 16 #include "xbusmessage.h"
Alex Young 18:2073072bad51 17 #include "xbusdef.h"
Alex Young 18:2073072bad51 18 #include "xbusutility.h"
Alex Young 18:2073072bad51 19
Alex Young 18:2073072bad51 20 size_t XbusMessage_format(uint8_t* raw, struct XbusMessage const* message)
Alex Young 18:2073072bad51 21 {
Alex Young 18:2073072bad51 22 uint8_t* dptr = raw;
Alex Young 18:2073072bad51 23 *dptr++ = XBUS_PREAMBLE;
Alex Young 18:2073072bad51 24
Alex Young 18:2073072bad51 25 *dptr = XBUS_BUS_ID_STANDALONE;
Alex Young 18:2073072bad51 26 uint8_t checksum = 0;
Alex Young 18:2073072bad51 27 checksum -= *dptr++;
Alex Young 18:2073072bad51 28
Alex Young 18:2073072bad51 29 *dptr = message->mid;
Alex Young 18:2073072bad51 30 checksum -= *dptr++;
Alex Young 18:2073072bad51 31
Alex Young 18:2073072bad51 32 if (message->length < XBUS_EXTENDED_LENGTH)
Alex Young 18:2073072bad51 33 {
Alex Young 18:2073072bad51 34 *dptr = message->length;
Alex Young 18:2073072bad51 35 checksum -= *dptr++;
Alex Young 18:2073072bad51 36 }
Alex Young 18:2073072bad51 37 else
Alex Young 18:2073072bad51 38 {
Alex Young 18:2073072bad51 39 *dptr = XBUS_EXTENDED_LENGTH;
Alex Young 18:2073072bad51 40 checksum -= *dptr++;
Alex Young 18:2073072bad51 41 *dptr = message->length >> 8;
Alex Young 18:2073072bad51 42 checksum -= *dptr++;
Alex Young 18:2073072bad51 43 *dptr = message->length & 0xFF;
Alex Young 18:2073072bad51 44 checksum -= *dptr++;
Alex Young 18:2073072bad51 45 }
Alex Young 18:2073072bad51 46
Alex Young 18:2073072bad51 47 uint8_t* sptr = message->data;
Alex Young 18:2073072bad51 48 for (int i = 0; i < message->length; ++i)
Alex Young 18:2073072bad51 49 {
Alex Young 18:2073072bad51 50 *dptr = *sptr++;
Alex Young 18:2073072bad51 51 checksum -= *dptr++;
Alex Young 18:2073072bad51 52 }
Alex Young 18:2073072bad51 53 *dptr++ = checksum;
Alex Young 18:2073072bad51 54
Alex Young 18:2073072bad51 55 return dptr - raw;
Alex Young 18:2073072bad51 56 }
Alex Young 18:2073072bad51 57
Alex Young 18:2073072bad51 58 static uint8_t const* getPointerToData(enum XsDataIdentifier id, uint8_t const* data, uint16_t dataLength)
Alex Young 18:2073072bad51 59 {
Alex Young 18:2073072bad51 60 uint8_t const* dptr = data;
Alex Young 18:2073072bad51 61 while (dptr < data + dataLength)
Alex Young 18:2073072bad51 62 {
Alex Young 18:2073072bad51 63 uint16_t itemId;
Alex Young 18:2073072bad51 64 uint8_t itemSize;
Alex Young 18:2073072bad51 65 dptr = XbusUtility_readU16(&itemId, dptr);
Alex Young 18:2073072bad51 66 dptr = XbusUtility_readU8(&itemSize, dptr);
Alex Young 18:2073072bad51 67
Alex Young 18:2073072bad51 68 if (id == itemId)
Alex Young 18:2073072bad51 69 return dptr;
Alex Young 18:2073072bad51 70
Alex Young 18:2073072bad51 71 dptr += itemSize;
Alex Young 18:2073072bad51 72 }
Alex Young 18:2073072bad51 73 return NULL;
Alex Young 18:2073072bad51 74 }
Alex Young 18:2073072bad51 75
Alex Young 18:2073072bad51 76 static void readFloats(float* out, uint8_t const* raw, uint8_t floats)
Alex Young 18:2073072bad51 77 {
Alex Young 18:2073072bad51 78 for (int i = 0; i < floats; ++i)
Alex Young 18:2073072bad51 79 {
Alex Young 18:2073072bad51 80 raw = XbusUtility_readU32((uint32_t*)&out[i], raw);
Alex Young 18:2073072bad51 81 }
Alex Young 18:2073072bad51 82 }
Alex Young 18:2073072bad51 83
Alex Young 18:2073072bad51 84 bool XbusMessage_getDataItem(void* item, enum XsDataIdentifier id, struct XbusMessage const* message)
Alex Young 18:2073072bad51 85 {
Alex Young 18:2073072bad51 86 uint8_t const* raw = getPointerToData(id, message->data, message->length);
Alex Young 18:2073072bad51 87 if (raw)
Alex Young 18:2073072bad51 88 {
Alex Young 18:2073072bad51 89 switch (id)
Alex Young 18:2073072bad51 90 {
Alex Young 18:2073072bad51 91 case XDI_PacketCounter:
Alex Young 18:2073072bad51 92 raw = XbusUtility_readU16(item, raw);
Alex Young 18:2073072bad51 93 break;
Alex Young 18:2073072bad51 94
Alex Young 18:2073072bad51 95 case XDI_SampleTimeFine:
Alex Young 18:2073072bad51 96 case XDI_StatusWord:
Alex Young 18:2073072bad51 97 raw = XbusUtility_readU32(item, raw);
Alex Young 18:2073072bad51 98 break;
Alex Young 18:2073072bad51 99
Alex Young 18:2073072bad51 100 case XDI_Quaternion:
Alex Young 18:2073072bad51 101 case XDI_DeltaQ:
Alex Young 18:2073072bad51 102 readFloats(item, raw, 4);
Alex Young 18:2073072bad51 103 break;
Alex Young 18:2073072bad51 104
Alex Young 18:2073072bad51 105 case XDI_DeltaV:
Alex Young 18:2073072bad51 106 case XDI_Acceleration:
Alex Young 18:2073072bad51 107 case XDI_RateOfTurn:
Alex Young 18:2073072bad51 108 case XDI_MagneticField:
Alex Young 18:2073072bad51 109 readFloats(item, raw, 3);
Alex Young 18:2073072bad51 110 break;
Alex Young 18:2073072bad51 111
Alex Young 18:2073072bad51 112 default:
Alex Young 18:2073072bad51 113 return false;
Alex Young 18:2073072bad51 114 }
Alex Young 18:2073072bad51 115 return true;
Alex Young 18:2073072bad51 116 }
Alex Young 18:2073072bad51 117 else
Alex Young 18:2073072bad51 118 {
Alex Young 18:2073072bad51 119 return false;
Alex Young 18:2073072bad51 120 }
Alex Young 18:2073072bad51 121 }
Alex Young 18:2073072bad51 122
Alex Young 21:6015b8be3a00 123 char const* XbusMessage_dataDescription(enum XsDataIdentifier id)
Alex Young 21:6015b8be3a00 124 {
Alex Young 21:6015b8be3a00 125 switch (id)
Alex Young 21:6015b8be3a00 126 {
Alex Young 21:6015b8be3a00 127 case XDI_PacketCounter:
Alex Young 21:6015b8be3a00 128 return "Packet counter";
Alex Young 21:6015b8be3a00 129
Alex Young 21:6015b8be3a00 130 case XDI_SampleTimeFine:
Alex Young 21:6015b8be3a00 131 return "Sample time fine";
Alex Young 21:6015b8be3a00 132
Alex Young 21:6015b8be3a00 133 case XDI_Quaternion:
Alex Young 21:6015b8be3a00 134 return "Quaternion";
Alex Young 21:6015b8be3a00 135
Alex Young 21:6015b8be3a00 136 case XDI_DeltaV:
Alex Young 21:6015b8be3a00 137 return "Velocity increment";
Alex Young 21:6015b8be3a00 138
Alex Young 21:6015b8be3a00 139 case XDI_Acceleration:
Alex Young 21:6015b8be3a00 140 return "Acceleration";
Alex Young 21:6015b8be3a00 141
Alex Young 21:6015b8be3a00 142 case XDI_RateOfTurn:
Alex Young 21:6015b8be3a00 143 return "Rate of turn";
Alex Young 21:6015b8be3a00 144
Alex Young 21:6015b8be3a00 145 case XDI_DeltaQ:
Alex Young 21:6015b8be3a00 146 return "Orientation increment";
Alex Young 21:6015b8be3a00 147
Alex Young 21:6015b8be3a00 148 case XDI_MagneticField:
Alex Young 21:6015b8be3a00 149 return "Magnetic field";
Alex Young 21:6015b8be3a00 150
Alex Young 21:6015b8be3a00 151 case XDI_StatusWord:
Alex Young 21:6015b8be3a00 152 return "Status word";
Alex Young 21:6015b8be3a00 153
Alex Young 21:6015b8be3a00 154 default:
Alex Young 21:6015b8be3a00 155 return "Unknown data type";
Alex Young 21:6015b8be3a00 156 }
Alex Young 21:6015b8be3a00 157 }