功能说明
• 引脚配置
• 引脚
• 引脚说明
• 外围接口选择
• 外围接口架构
• 总线协议
• MTSSP 同步串行协议
• I2C
• SPI
• UART 半双工
• 带有 RTS/CTS 流控制的 UART 全双工
本章介绍 MTi 1-s 引脚排列并提供有关支持的通信接口的详细信息。
引脚配置
MTi 1 系列模块的引脚配置(俯视图)
引脚
引脚映射取决于外围设备选择,如下表所示。#Peripheral interface selection 中解释了配置外设。
外设选择的引脚映射
[1] AUX 和 SYNC_PPS 引脚仅在 MTi-7 上可用
[2] I2C 地址,请参阅#I2C 地址列表。
[3]如果接口设置为 UART 全双工,CTS 不能保持未连接状态。如果不使用硬件流控制(HW flow control),则连接到 GND。
引脚说明
引脚说明 MTi 1 系列模块
外围接口选择
MTi 1 系列模块支持用于主机通信的UART、I2C 和 SPI 接口。主机可以通过外设选择引脚 PSEL0 和 PSEL1 选择活动接口。模块在启动时读取这些引脚的状态,并根据下表配置其外设接口。要更改所选接口,主机必须首先设置 PSEL0 和 PSEL1 引脚的所需状态,然后复位模块。该模块在 PSEL0 和 PSEL1 引脚上具有内部上拉电阻。如果这些引脚悬空,外设接口选择默认为 I2C(PSEL0 = 1,PSEL1 = 1)。
外围接口选择
外围接口架构
该模块的核心是使用 Xsens 专有的 Xbus 协议,该协议与所有 Xsens惯性传感器产品兼容。 该协议适用于所有接口、UART(异步串行端口接口)、I2C 和 SPI 接口。 I2C 和 SPI 接口与 UART 的不同之处在于它们是同步的,并且具有主从关系,从属不能自己发送数据。 这使得 Xbus 协议不能直接传输到这些接口。 为此,该模块引入了 MTi 同步串行协议 (MTi Synchronous Serial Protocol,MTSSP) 协议,该协议用于通过 I2C 和 SPI 接口交换标准 Xbus 协议消息。 下图显示了 MTSSP 如何适应模块的(简化的)通信架构。 该模块具有用于 Xbus 协议消息的通用输入和输出队列。 对于 I2C 和 SPI,MTSSP 层转换这些消息,而对于 UART 连接,模块按原样传输消息。
注:MTi 1 系列可通过 UART、SPI 和 I²C 接口访问模块,并在使用开发板时提供额外的 USB 接口。 请注意,仅在使用串行 (UART/USB) 通信时才支持图形软件工具,例如 MT Manager 和 Magnetic Field Mapper,以及大部分 MT SDK。 对于 I²C 或 SPI 通信,MT SDK 中提供了专用的“嵌入式示例代码”。
MTi 1 系列模块的通信架构(简化)
Xbus协议
Xbus 协议是 Xsens 用于与 MTi 1 系列接口的专有协议。所述MT低级通信协议文档是针对协议的完整参考。为了更好地理解 MTSSP 解释,建议先阅读协议参考。
MTSSP 同步串行协议
本节规定了 MTi 同步串行协议 (MTSSP)。MTi 1 系列模块使用 MTSSP 作为 I2C 和 SPI 接口的通信协议。嵌入式示例代码可在 MT 软件套件的 MT SDK 文件夹中找到,为协议的主机端提供参考实现。
数据流
MTSSP 通信根据主从模型发生。MTi 1 系列模块将始终充当从机角色,而模块的用户/集成/主机始终是主机。主机总是发起和驱动通信。主机要么向模块写入消息,要么从模块读取消息。
下图显示了主机(Master Device)和 MTi 1-s(从机Slave)之间的数据流。主机可以通过向控制管道发送 Xbus 消息来控制模块。模块认为在单个总线传输中接收的字节恰好是一个 Xbus 消息。MTi 1-s 将接收到的消息放入输入队列以供进一步处理。Xbus 解释器处理输入队列中的消息,并将响应消息放置在输出队列中。主设备可以从通知管道中读取这些响应消息。
主机可以通过向控制管道发送通常的 GotoConfig 和 GotoMeasurement(简化的Xbus)消息来在配置和测量模式之间切换模块。当置于测量模式时,模块会将生成的测量数据 (MTData2) 放置在测量管道中。主设备必须读取测量管道以接收测量数据。
为了让主机知道通知管道(Notification) 和 测量管道(Measurement )中消息的大小,它可以读取管道状态。管道状态包含通知和测量管道中(单个)下一条消息的字节大小。主机可以通过编写协议配置(Protocol Configuration)来调整协议的行为。Master 还可以读取协议配置来检查当前行为,并获取协议信息。
注:测量管道和通知管道都具有有限的大小,因此只能包含有限数量的(简化的)Xbus 消息。 管道中可以包含的消息数量取决于各个消息的大小。 两个管道都充当先进先出 (FIFO) 缓冲区:从任一管道读取时,将首先读取管道中最旧的消息。 一旦管道已满,新生成的消息将被 MTi 1-s 丢弃,并且(简化的 Xbus)错误消息(数据溢出,0x42 0x01 0x29 0x95)将添加到通知管道。 因此,主机及时读出新消息很重要,这样管道就不会被填满,从而导致丢失测量数据或通知。
有关 I2C 和 SPI 通信的最佳实践,请参阅BASE文章:MTi 1 系列的最佳实践 I2C 和 SPI
数据就绪信号
数据就绪信号(Data Ready Signal, DRDY)是由模块驱动的通知线路。它的默认行为是在通知或测量管道中指示新数据的可用性。默认情况下,当两个管道都为空时,该线路为低电平,当任一管道包含一个消息时,该线路将变为高电平。一旦主机读取了所有挂起的消息,DRDY 线将再次变低。
主机可以使用协议配置(Procotol Configuration)更改 DRDY 信号的行为。有关更多信息,请参阅 ConfigureProtocol 操作码(#List of defined opcodes)的说明。
操作码
主机用一个操作码(Opcodes)开始每次传输。操作码决定了传输的类型。定义的操作码如下表所列。在操作码之后,根据是读传输还是写传输,主设备读取或写入一个或多个数据字节。具体传输格式取决于底层总线协议(I2C或SPI)。
对于某些操作码,MTSSP 使用简化的 Xbus 消息。简化的 Xbus 消息是常规 Xbus 消息,其中去除了前导码(preamble)和 busID 字段以节省带宽。这些字段对应于常规 Xbus 消息的前两个字节。简化 Xbus 消息的校验和计算仍包括 busID,并假定其值为 0xFF。有关可用 Xbus 消息的概述,请参阅MT 低级通信协议文档。
定义的操作码列表
ProtocolInfo协议信息 (0x01)
ProtocolInfo 操作码允许 Master 读取活动的协议配置。报文格式如下(所有数据为小端,字节对齐):
struct MtsspInfo
{
uint8_t m_version;
uint8_t m_drdyConfig;
};
m_version:
m_drdyConfig:
配置协议 ConfigureProtocol (0x02)
ProtocolInfo 操作码允许 Master 更改活动协议配置。报文格式如下(所有数据为小端,字节对齐):
struct MtsspConfiguration
{
uint8_t m_drdyConfig;
};
m_drdyConfig:
控制管道 ControlPipe (0x03)
控制管道ControlPipe 操作码允许 Master 将消息写入控制管道。操作码后面的字节表示单个(简化的)Xbus 消息。
管道状态PipeStatus (0x04)
PipeStatus 操作码允许主机检索模块的通知和测量管道的状态。报文格式如下(所有数据为小端,字节对齐):
struct MtsspConfiguration
{
uint16_t m_notificationMessageSize;
uint16_t m_measurementMessageSize;
};
通知管道NotificationPipe (0x05)
主机使用通知管道NotificationPipe 操作码从通知管道中读取。读取的数据是单个简化的 Xbus 消息。
测量管道 (0x06)
主机使用测量管道MeasurementPipe 操作码从测量管道中读取。读取的数据是单个简化的 Xbus 消息 (MTData2)。
I2C
MTi 1 系列模块用作 I2C 从设备。MTi 1 系列模块的用户是 I2C 主设备。
用户可以通过 ADD0、ADD1 和 ADD2 引脚配置 I2C 从地址。模块在启动时读取这些引脚的状态,并根据下表配置从机地址。ADD0、ADD1 和 ADD2 引脚在内部被上拉,因此当未连接时,地址选择默认为 0x6B (ADD = 111)。
I2C 地址列表
已实现的 I2C 总线协议功能
注:[4] MTi-1 模块依靠 I2C 时钟拉伸(clock stretching)功能来克服处理时间的波动。 需要主机 支持此功能。
写入 MTi 1-s
写操作由单个 I2C 写传输组成。主机寻址模块,它发送的第一个字节是操作码opcode。后面的字节是数据字节。这些数据字节的解释取决于操作码,如#MTSSP 中所述。
模块可以接收的最大消息大小为 512 字节。如果主机发送超过 512 个字节,模块将重置其接收缓冲区,从而将接收到的消息减少到仅包含多余的字节。
下图显示了写消息操作的 I2C 传输:
从模块中读取
为了从模块中读取,主机首先执行 I2C 写传输以传输操作码。操作码告诉模块主机想要读取什么数据。该模块然后准备所请求的数据以进行传输。然后,主机执行 I2C 读取传输以检索数据。下图显示了所描述的读取方法的 I2C 传输。
或者,用户可以使用具有重复启动条件的 I2C 传输来执行读操作。下图描述了这种读取方法。
主机控制它读取的数据字节数。为了读取通知管道和测量管道,主机必须读取的字节数取决于待处理消息的大小。为了确定正确的字节数,主机应该首先读取管道状态Pipe Status 以获得未决消息的大小。
如果主机读取的字节数超出需要,模块将从头开始重新发送请求的数据。
SPI
MTi 1 系列模块用作 SPI 从设备。MTi 1 系列模块的用户是 SPI 主设备。
SPI配置
MTi 1 系列支持 4 线模式 SPI。使用的4条线路是:
• 片选Chip Select (SPI_nCS)
• 串行时钟Serial Clock (SPI_SCK)
• 主数据输入,从数据输出 (SPI_MISO)
• 主数据输出,从数据输入 (SPI_MOSI)
该模块使用 SPI 模式 3:它在时钟上升沿捕获数据,并在时钟下降沿锁存/传播数据。(CPOL=1 和 CPHA=1)。数据首先输出最高有效位(Most Significant Bit, MSB)。该模块使用 8 位数据格式。
数据传输
该模块使用单一类型的 SPI 传输进行所有通信。下图描述了这种基本转移。
主机通过拉低 SPI_nCS 开始传输,以选择从机。主机必须在传输期间保持 SPI_nCS 线为低电平。从设备会将 SPI_nCS 线的上升沿解释为传输结束。主机将它需要传输的数据放在 SPI_MOSI 线上。从设备将其数据放置在 SPI_MISO 线上。
主机首先发送操作码opcode。操作码决定了主机传输什么样的数据,以及主机要从从机读取什么样的数据(参见#MTSSP)。主机传输的第二到第四个字节是填充字(fill words)。需要这些填充字来给从设备时间来选择它必须在传输的剩余部分中发送的数据。主机和从机都可以自由选择填充字的值,接收端应该忽略它们的值。但是,MTi 1 系列模块(从机)传输的前 4 个字节始终为 0xFA、0xFF、0xFF、0xFF。
前四个字之后传输的是实际数据。主机有责任确定它必须传输多少字节。为了读取通知管道和测量管道,主机必须读取的字节数取决于待处理消息的大小。为了确定正确的字节数,主机应该首先读取管道状态Pipe Status 以获得未决消息的大小。
Timing
下表和图指定了适用于 SPI 传输层的时序约束。主机必须遵守这些限制。
SPI timing
UART 半双工
用户可以将 MTi 1 系列模块配置为在半双工模式下通过 UART 进行通信。UART 帧配置为 8 个数据位,无奇偶校验和 1 个停止位 (8N1)。除了 RX 和 TX 引脚外,模块还使用控制线 nRE 和 DE。模块使用这些控制输出来驱动共享介质上的 TX 信号,并驱动 RX 信号上的共享介质的信号。
此模式的典型用例是控制 RS485 收发器,其中共享介质是 RS485 信号,nRE 和 DE 线控制收发器内部的缓冲器。
当模块在其 TX 引脚上传输数据时,它会同时拉高 nRE 和 DE 线,否则会将这些线拉低。下图描述了相关信号的行为。
请注意,在此模式下,MTi 1-s 本身的 UART 仍以全双工模式运行。
带有 RTS/CTS 流控制的 UART 全双工
用户可以将 MTi 1-s 模块配置为在具有 RTS/CTS 流控制的全双工模式下通过 UART 进行通信。UART 帧配置为 8 个数据位,无奇偶校验和 1 个停止位 (8N1)。除了用于数据通信的 RX 和 TX 信号外,该模块还使用 RTS 和 CTS 信号进行硬件流控制。
CTS 信号是模块的输入。模块在它传输的每个字节开始时检查 CTS 线的状态。如果 CTS 为低,则模块传输字节。否则,它会推迟传输,直到 CTS 降低。当在传输字节期间用户发出 CTS 信号时,模块会在推迟进一步输出之前完成该字节的传输。模块不会重传该字节。下图显示了 TX 和 CTS 线的行为。
RTS 信号是模块的输出。如果 RTS 线为高电平,则模块忙且无法接收新数据。否则,模块的 UART 处于空闲状态并准备接收。接收到一个字节后,模块的直接内存访问 (direct memory access,DMA) 控制器会将字节传输到其接收先进先出 (FIFO) 缓冲区。模块将在此传输期间发出 RTS 信号。因此,随着接收到的每个字节,模块会很快升高 RTS 线。下图显示了这种行为。
该用户可以在没有硬件流量控制的情况下使用这种通信方式。在这种情况下,用户必须将 CTS 线连接到低电平 (GND) 才能使模块传输。