PS2手柄介绍
PS2手柄由手柄与接收器两部分组成,手柄主要负责发送按键信息;接收器与单片机(也可叫做主机)相连,用于接收手柄发来的信息,并传递给单片机,单片机也可通过接收器,向手柄发送命令,配置手柄的发送模式。
DI/DAT:信号流向,从手柄到主机,此信号是一个 8bit 的串行数据,同步传送于时钟的下降沿。信号的读取在时钟由高到低的变化过程中完成。
DO/CMD:信号流向,从主机到手柄,此信号和 DI 相对,信号是一个 8bit 的串行数据,同步传送于时钟的下降沿。
NC:空端口;
GND:电源地;
VDD:接收器工作电源,电源范围 3~5V;
CS/SEL:用于提供手柄触发信号。在通讯期间,处于低电平;
CLK:时钟信号,由主机发出,用于保持数据同步;
ACK:从手柄到主机的应答信号。此信号在每个 8bits 数据发送的最后一个周期变低并且 CS 一直保持低电平,如果 CS 信号不变低,约 60 微秒 PS 主机会试另一个外设。在编程时未使用 ACK 端口。
通讯时序如下:
时钟频率 250KHz(4us),如果接收数据不稳定,可以适当的增加频率。在通讯过程中,一串数据通讯完成后 CS 才会由低转高,不是 1 个字节通讯完成后就由低转高,在通讯期间,一直处于低电平。
在时钟下降沿时,完成数据(1bit)的发送与接收,发送和接收是同时完成的。当单片机想读手柄数据或向手柄发送命令时,将会拉低 CS 线电平,并发出一个命令“0x01”;手柄会回复它的 ID“0x41=绿灯模式,0x73=红灯模式”;在手柄发送 ID 的同时,单片机将传送 0x42,请求数据;随后手柄发送出 0x5A,告诉单片机“数据来了”。
idle:数据线空闲,该数据线无数据传送。
一个通讯周期有 9 个字节(8 位),这些数据是依次按位传送。
当有按键按下,对应位为“0”,其他位为“1”,例如当键“SELECT”被按下时,Data[3]=11111110B。
在设置了震动模式后,我们就能发送 WW、YY 来控制震动电机。WW,用来控制右侧的小震动电机,0x00 关,其他值为开;YY 用来控制左侧的大震动电机,0x40~0xFF 电机开,值越大,电机转动越快,震动越明显。具体的设置请看下面的程序部分。
红灯模式时:左右摇杆发送模拟值,0x00~0xFF 之间,且摇杆按下的键值 L3、R3 有效;
绿灯模式时:左右摇杆模拟值为无效,推到极限时,对应发送 UP、RIGHT、DOWN、LEFT、△、○、╳、□,按键 L3、R3 无效。
最后特别需要提醒的是:
按下遥控器的 MODE 键,手柄可配置成“ 红灯模式”或者“ 绿灯模式”,当遥控器侧面的 “MODE LED”亮为红灯模式,反之为绿灯模式,“红灯模式”和“绿灯模式”的主要区别是摇杆模拟值得输出。
我用STM32CubeMX写了一份PS2的代码,创作不易,需要点积分,或者在下方评论区留下邮箱,我看到就发。PS2代码