大家好,又见面了,我是你们的朋友全栈君。
最近买了个ps2手柄,结果买家发的例程全都是好几年前的库函数版本,尝试移植基本没啥可能。虽然PS2手柄已经被开发很久了,不过我看网上用hal库来写控制的很少,例程也都是用库函数写的,因此写篇文章来帮助刚开始接触PS2又懒得用库函数的同学。
提一下,方便理解代码
这个已经被破解很久了,具体的时序就这样。PS2手柄开启,接收器正常工作并接受以后,数据可以通过spi通信来发送接受,然后就可以通过单片机来完成数据接收和发送。

很明显可以看到是一一对应。

( 当然你也可以选择同步接受和发送,spi是支持的)
这个网上资料也很多了,我就大概提一下,提到编程需要知道的程度。
在连接好PS2手柄和接收器以后,接收器绿灯常亮(一般可以先试试只接电源,开启手柄,看能否配对成功),硬件没问题的情况下就可以开始编程了。

接受完数据以后就是处理数据,然后用在你想用的地方就好了。
我这边用的是st的nucleo-f104开发板,只要你的开发板支持SPI和串口通信就好了。

根据PS2硬件资料,这里的SPI不能乱配置,需要注意的地方如下

串口自己设置就好,能证明你正常接收到数据就行。
uint8_t cmd[3] = {0x01,0x42,0x00}; // 请求接受数据
uint8_t PS2data[9] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //存储手柄返回数据
void PS2_Get(void) //接受ps2数据
{
uint8_t i = 0;
HAL_GPIO_WritePin(ENABLE_GPIO_Port,ENABLE_Pin,GPIO_PIN_RESET); //拉高,开始通讯
HAL_SPI_TransmitReceive(&hspi1,&cmd[0],&PS2data[0],1,0xffff); // 发送0x01,请求接受数据
delay_us(10);
HAL_SPI_TransmitReceive(&hspi1,&cmd[1],&PS2data[1],1,0xffff); // 发送0x42,接受0x01(PS2表示开始通信)
delay_us(10);
HAL_SPI_TransmitReceive(&hspi1,&cmd[2],&PS2data[2],1,0xffff); // 发送0x00,接受ID(红绿灯模式)
delay_us(10);
for(i = 3;i <9;i++)
{
HAL_SPI_TransmitReceive(&hspi1,&cmd[2],&PS2data[i],1,0xffff); // 接受数据
delay_us(10);
}
HAL_GPIO_WritePin(ENABLE_GPIO_Port,ENABLE_Pin,GPIO_PIN_SET); //拉低,准备下次通讯
}这样子就能将数据存储在单片机里了。
我估计反正也没人看,就随便提一嘴。
按键的话,定义存储的结构是uint8_t,没有按键按下的时候返回值(二进制看)11111111,有一个按键按下时就会有对应一个1变成0,比如10111111,具体测试一下就知道了。通过位运算就可以很简单的把所有按键值提取出来,做到全按键无冲突。
摇杆我个人习惯时1-1000范围均匀变化,手柄返回的值是0-255变化,这个强制转换也就很简单可以完成了。建议一直开着红灯模式,不然摇杆不返回模拟值,调小车占空比也是这个范围嘛。
附个一个周期正常传输数据的图(逻辑分析仪)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131134.html原文链接:https://javaforall.cn