Neonode触摸传感器模块通信协议

发布时间:2024年01月12日

1通信协议

Neonode触摸传感器模块可以通过USB HID传输或I2C传输与主机系统通信。

2 可用的函数库

Neonode开发了以下函数库,以便于传感器模块的集成:
zForce软件开发工具包(SDK)是一个完整的函数库,用于通过USB HID接口进行通信。SDK允许用户通过USB与传感器模块通信,而无需解密序列化的ASN.1消息。

3 准备传感器进行通信

准备传感器模块以使用I2C或USB原始HID模式进行通信需要以下步骤。

3.1 USB原始HID模式

触摸传感器模块有一个称为操作模式的设置用于确定将向主机发送哪些数据
当通过USB通信时,有两种不同的操作模式来传递触摸数据,称为检测模式和检测模式HID。
默认情况下,传感器模块设置为操作模式检测模式HID。该模式根据用于触摸屏设备的HID标准将触摸数据传送到操作系统。为了让主机接收根据Neonode的ASN.1串行化协议串行化的触摸数据,必须将操作模式设置为检测模式。换句话说,将操作模式设置为检测模式允许主机通过USB原始HID模式接收触摸数据。
执行以下步骤,通过USB原始HID模式准备传感器模块。
1.接通触摸传感器模块的电源。
2.等待操作系统枚举设备,然后枚举应用程序中的传感器模块。根据使用的操作系统,应用程序可能需要操作系统的许可才能访问设备。
3.通过发送报告id为1的功能报告,将传感器模块设置为正确的操作模式(检测模式)。
4.等待传感器模块发出有数据要读取的信号。这是一个输入报告2,或者您可以轮询id为2的功能报告以获取新数据。
5.从id为2的功能报告中读取响应数据。读取的数据反映了传感器模块中的当前设置。
触摸传感器模块现在可以进行通信了。步骤完成后,传感器模块默认启用,并将开始发送ASN.1串行触摸通知。要禁用触摸通知,必须发送禁用请求。

3.2 I2C

使用以下步骤准备I2C上的触摸传感器模块。
1.接通触摸传感器模块的电源。
2.等待传感器模块断言数据就绪引脚(DR)。
3.启动2字节I2C读取操作。该读取的有效载荷应该是EE XX,其中XX是在第二I2C读取操作中要读取的字节量。
4.读取XX字节量(要读取的字节数由第一I2C读取操作的第二字节指示)。现在阅读一条名为BootComplete的消息。消息应该是

F0 11 40 02 00 00 63 0B 80 01 YY 81 02 03 YY 82 02 00 YY

其中YY通常是“00”,但可以有另一个值。这表示传感器模块现已启动。

根据提供的数据,BootComplete对应的字节如下:
F0 11 40 02 00 00 63 0B 80 01 YY 81 02 03 YY 82 02 00 YY
其中:
F0:表示I2C传输的起始字节;
11:表示传感器模块的I2C地址;
40:表示读取数据的命令码;
02:表示需要读取的数据长度的字节数;
00 00:表示需要读取的数据长度;
63 0B:表示BootComplete消息的起始字节;
80 01 YY:表示一个字段,其中 80 表示该字段的标识符,01 表示该字段的长度,YY 表示该字段的值。
81 02 03 YY:表示另一个字段,其中 81 表示该字段的标识符,02 表示该字段的长度,03 YY 表示该字段的值。
82 02 00 YY:表示另一个字段,其中 82 表示该字段的标识符,02 表示该字段的长度,00 YY 表示该字段的值。
因此,BootComplete对应的字节是63 0B 80 01 YY 81 02 03 YY 82 02 00 YY。
请注意,YY表示一个占位符,具体的值可能因传感器模块的状态而异。

5.要使触摸传感器模块开始发送触摸通知,请执行以下操作:
a.发送启用命令:

EE 09 40 02 02 00 65 03 81 01 00

b.阅读回复。回应应该是:

EF 09 40 02 02 00 65 03 81 01 00

触摸传感器模块现在可以进行通信了。当DR被断言时,传感器模块将发送触摸通知或新的BootComplete。BootComplete表示传感器模块由于某种原因已经重新启动;然后必须再次设置“启用”

4 zForce通信协议

要与Neonode触摸传感器模块进行通信,您需要两件事:
发送/接收信息
对信息进行编码/解码。
发送和接收可以通过以下方式之一进行:
?USB HID触摸数字化仪:传感器模块可以用作标准HID触摸数字仪,向操作系统报告触摸数据。
?USB RAW HID:传感器模块使用HID获取和设置功能报告作为管道进行读取和写入。
?I2C传输:传感器模块支持I2C通信,带有一个额外的引脚,用于在数据准备好读取时发出信号,这允许主机系统中断驱动。传感器模块充当I2C从设备,其I2C地址为0x50。
对于编码/解码,您需要了解消息的结构以及用于序列化它们的协议:
传感器消息的结构以ASN.1表示法定义。ASN.1是一种标准化的描述数据的方法(ISO/IEC 8824),无论语言实现、硬件系统和操作系统如何。
zForce通信协议使用可分辨编码规则(DER)来序列化消息。

4.1 串行化协议快速启动

触摸传感器模块与根据zForce序列化协议序列化的消息进行通信。这里快速介绍一下您需要发送的信息,以及如何解读收到的信息。

编码整数
ASN.1编码的整数,例如表示扫描频率或触摸活动区域大小的值,由一个或多个字节表示:
? 如果整数在0到127之间,则用一个字节(00到7F)表示。
? 如果整数在128和32767之间,则用两个字节(00 80到7F FF)表示。
因此,消息的长度因参数值而异。

启用触摸传感器模块
执行以下操作以启用触摸传感器模件,即告诉模块开始发送触摸通知。
1.通过发送带有Enable命令的请求来启用传感器模块:

EE 09 40 02 02 00 65 03 81 01 00

这使传感器模块能够发送触摸通知。
2.阅读回复。回应应该是:

EF 09 40 02 02 00 65 03 81 01 00

3.触摸传感器模块现已启用。之后,等待传感器模块指示它有东西要发送,这意味着设备将发送触摸通知或BootComplete。BootComplete表示设备由于某种原因已重新启动,因此重新运行初始化并使传感器模块能够再次开始接收触摸通知。

禁用触摸传感器模块
执行以下操作可禁用触摸传感器模块,即告诉模块停止发送触摸通知。
1.通过发送带有以下命令的请求来禁用传感器模块:

EE 08 40 02 02 00 65 02 80 00

这将禁用传感器模块发送触摸通知。
2.阅读回复。回应应该是:

EF 08 40 02 02 00 65 02 80 00

3.触摸传感器模块现已禁用。
设备配置
设备配置是一个命令,包括传感器模块的不同设置,例如触摸活动区域。发送设备配置消息时,不需要发送所有指定的设置,但传感器模块的响应将包括完整的设备配置消息。
这是一条使用设备配置命令更改触摸活动区域的示例消息:

EE 1A 40 02 02 00 73 14 A2 12 80 02 00 B5 81 01 43 82 02 06 98 83 02 04 34 85 01 FF

下表解释了该消息:
在这里插入图片描述
传感器模块对上述消息的响应将包含完整的设备配置消息,以及请求中未设置的部分。
在使用ENABLE(启用)请求启用传感器模块之前,应设置触摸激活区域。

设置频率
要将手指频率设置为200 Hz,将空闲频率设置为63 Hz,请使用以下命令的请求:

EE 0D 40 02 00 00 68 07 80 02 00 C8 82 01 3F

解码触摸通知
一个数据包可以包含最多10次触摸,还可以选择包含时间戳。在不包括时间戳的数据包上,结尾缺少58 02 TT TT字节,相应地调整了长度字节。对于一触式(下图),开头的F0 15将为F0 11,中间的A0 0F将为A0 0B。对于两次和三次触摸,相同的字节减少4。
一次触摸
包含一次触摸的数据包看起来像:

F0 15 40 02 02 00 A0 0 f 42 09 II VV XX X YY GG JJ 58 02 TT

其中数据定义如下:
在这里插入图片描述

包含两个触摸的数据包看起来像:

F0 20 40 02 02 00 A0 1A 42 09 II VV XX XX YY YY GG GG JJ 42 09 II VV XX XX YY YY GG GG JJ 58 02 TT TT

其中,直到并包括“JJ”的第一个“II”和随后的字节来自第一次触摸,并且直到并包括”JJ“的第二个“Ⅱ”和随后字节来自第二次触摸。

其中:
F0:表示I2C传输的起始字节;
20:表示传感器模块的I2C地址;
40:表示读取数据的命令码;
02:表示需要读取的数据长度的字节数;
02 00:表示需要读取的数据长度;
A0 1A:表示第一个触摸的起始字节;
42 09 II:表示第一个触摸的标识符和长度;
VV:表示第一个触摸的某个字段的值;
XX XX:表示第一个触摸的另一个字段的值;
YY YY:表示第一个触摸的另一个字段的值;
GG GG:表示第一个触摸的另一个字段的值;
JJ:表示第一个触摸的结束字节;
42 09 II:表示第二个触摸的标识符和长度;
VV:表示第二个触摸的某个字段的值;
XX XX:表示第二个触摸的另一个字段的值;
YY YY:表示第二个触摸的另一个字段的值;
GG GG:表示第二个触摸的另一个字段的值;
JJ:表示第二个触摸的结束字节;
58 02 TT TT:表示某个字段的标识符和长度。
因此,该数据包包含两个触摸的数据。具体的触摸数据内容可能因传感器模块而异。

三次触摸
包含三次触摸的数据包看起来像:

F0 2B 40 02 00 A0 25 42 09 II VV XX YY YY GG GG JJ 42 09 II VV XX YY y YY GG GG JJ 44 09 II vvv XX y YY ggg JJ 58 02 TT

4.2 USB HID传输

当通过USB连接时,触摸传感器模块在两种模式下全速(12 Mbit/s)通信:原始HID模式(也称为HID管道)和HID触摸数字化器模式。一旦插入传感器模块,HID触摸数字化仪模式就会自动启动。要使用原始HID模式,必须更改模块的操作模式。
HID触摸数字化仪模式
触摸传感器模块充当HID输入设备,直接与操作系统通信,完全即插即用。

写入特征报告1
在写入传感器模块时,无论实际消息有多长,都需要发送完整的257字节。请查看下面的代码片段,了解如何做到这一点。

uint8_t operationMode[] = { 0x01, 0x17, 0xEE, 0x15, 0x40, 0x02, 0x02, 0x00, 0x67, 0x0F, 0x80, 0x01, 0xFF, 0x81, 0x01, 0x00, 0x82, 0x01, 0x00, 0x83, 0x01, 0x00, 0x84, 0x01, 0x00 }; // 前两个字节是标头。第一个字节是特征报告,第二个字节是以下数据的长度。
uint8_t data[257]; 
memcpy(data, operationMode, sizeof(operationMode)); 

int requestType = 0x00 | (0x01 << 5) | 0x01; // USB_HOST_TO_DEVICE | USB_TYPE_CLASS | USB_RECIPIENT_INTERFACE 
int request = 0x09; // SET_CONFIGURATION = 0x09 
int value = 0x0301; // 0x03表示特征报告,0x01表示特征报告1
int index = 0x0000; 
int length = sizeof(data);
int timeout = 0; 
connection.controlTransfer( requestType, request, value, index, data, length, timeout);

读取功能报告2
读取功能报告2时,消息的长度始终为258字节。

uint8_t data[258];
int requestType = 0x80 | (0x01 << 5) | 0x01; // USB_DEVICE_TO_HOST | USB_TYPE_CLASS | USB_RECIPIENT_INTERFACE 
int request = 0x01; // CLEAR_FEATURE = 0x01
int value = 0x0302; // 0x03 for feature report, 0x02 for feature report 2 
int index = 0x0000; 
int length = sizeof(data);
int timeout = 0; 
connection.controlTransfer( requestType, request, value, index, data, length, timeout);

HID报告描述符见文档

4.3 I2C传输

介绍
每个I2C总线由两条线(信号)组成:时钟线(SCL)和数据线(SDA)。I2C总线上的设备要么是主设备,要么是从设备。主机始终是驱动时钟线的设备。从设备是对主设备作出响应的设备。只有主设备可以通过I2C总线启动传输。每个从设备都有一个唯一的地址。
本节中的所有字节都以十六进制形式写入,除非另有说明。
触摸传感器模块不使用寄存器或内存访问进行通信,因此STM32微控制器的文档不适用。
触摸传感器模块使用一个名为DataReady(DR)的信号来通知主机有数据要读取,并且可以初始化读取操作。

模块地址

传感器模块的从I2C地址为0x50(7位)。
地址本身由7个比特组成,但总是发送8个比特。如果主设备正在读取或写入,额外的位会通知从设备。
如果位为0,则主设备正在向从设备写入。
如果位为1,则主设备正在从设备读取。
产生的地址字节为0xA1(读取)和0xA0(写入)。
在这里插入图片描述

语法

I2C传输协议很简单,语法在两个方向(读或写)上都是相同的:
在这里插入图片描述
发送数据
要向触摸传感器模块发送数据,主机会启动对传感器模块地址的写入操作,并写入全部有效载荷。(不要将I2C FrameStart常量与指示序列化消息是请求的类型字节混淆。两个字节的值都是EE,但含义完全不同。)
示例:向传感器模块发送带有ENABLE命令的请求:

EE 0B EE 09 40 02 02 00 65 03 81 01 00

接收数据
当有数据可供主机接收时,传感器模块会触发DataReady信号。为了最大限度地提高性能并最大限度地减少I2C总线上的负载,主机应按一定的顺序读取数据:
1。传感器模块断言DataReady
2。主机为I2C 7位地址0x50启动两个字节的I2C读取操作。
3.传感器模块填充前两个字节FrameStart和DataSize。
4.主机对地址0x50发起I2C读取操作,读取XX字节(如DataSize所示)。
5.传感器模块取消断言DataReady。

BootComplete
当传感器模块已经完成引导,并且诸如I2C模块之类的硬件已经配置时,命令BootComplete被放入发送队列中。DataReady信号被触发,主机需要读取数据以确认模块已准备好运行。如果传感器模块先于主机系统通电,则主机系统需要检查DataReady信号是否处于活动状态,在这种情况下,它需要读取数据。

文章来源:https://blog.csdn.net/shouchen1/article/details/135528452
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。