吐槽一下

最近买了个ps2手柄,结果买家发的例程全都是好几年前的库函数版本,尝试移植基本没啥可能。虽然PS2手柄已经被开发很久了,不过我看网上用hal库来写控制的很少,例程也都是用库函数写的,因此写篇文章来帮助刚开始接触PS2又懒得用库函数的同学。

SPI通信协议

提一下,方便理解代码

这个已经被破解很久了,具体的时序就这样。PS2手柄开启,接收器正常工作并接受以后,数据可以通过spi通信来发送接受,然后就可以通过单片机来完成数据接收和发送。

  • SPI, serial peripheral interface, 串行外围设备接口。高速的,全双工的,同步通信总线。有四个引脚。需要注意的是,可能有的人被串口通信坑过,于是就把主机和从机的收发接口反接,SPI通信是一一对应的连接。DO借DO,DI接DI,时钟和CS引脚也是如此。

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

  • 连接好后,CS引脚维持高电平,通信开始时把CS电平拉低(当然你也可以反过来,平时维持低电平通信高电平)每次发送接受数据时,时钟(CLK,SCLK等)引脚如下图变换,此时DO和DI口开始交换数据(沿时钟上升沿或下降沿,可以在cubemx里设置)

( 当然你也可以选择同步接受和发送,spi是支持的)

PS2通信协议

这个网上资料也很多了,我就大概提一下,提到编程需要知道的程度。

在连接好PS2手柄和接收器以后,接收器绿灯常亮(一般可以先试试只接电源,开启手柄,看能否配对成功),硬件没问题的情况下就可以开始编程了。

  • 首先用单片机给PS2发送一个0x01,然后PS2会给你返回一个ID(说明此时是绿灯mode还是红灯mode),单片机再给他发送一个0x42(请求接受数据),PS2返回0x5a(表示可以开始传输数据),剩下的就是接受他的摇杆和按键数据了,下面这个图可以十分精确的说明。

接受完数据以后就是处理数据,然后用在你想用的地方就好了。

配置cubemx

我这边用的是st的nucleo-f104开发板,只要你的开发板支持SPI和串口通信就好了。

  • 首先是配置时钟,没啥好说的。

  • 配置SPI,选几个你插着舒服的引脚就好了。

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

  1. 全双工模式,主机
  2. 不使能硬件nss,自己多设置一个输出引脚当CS就好
  3. LSB先输出
  4. CPOL设置为High
  5. CPHA设置为第一个边沿
  6. 64分频(非常重要,PS2支持的通信频率只有250khz,要是你单片机通信频率过高会造成PS2只返回给你0xff,就是一直给你拉高电平)

串口自己设置就好,能证明你正常接收到数据就行。

  • 主程序非常简单,就是上面说的先拉低CS脚,发送一个0x01,等10us,然后发送0x42,并且接收data[1],就是手柄的ID(绿灯模式是0x41),然后再发送接收,根据接收到的数据判断哪一位按下(按下为0,否则为1)。具体时序网上都有。
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变化,这个强制转换也就很简单可以完成了。建议一直开着红灯模式,不然摇杆不返回模拟值,调小车占空比也是这个范围嘛。

附个一个周期正常传输数据的图(逻辑分析仪)

HAL库控制PS2手柄相关推荐

  1. 【STM32F4系列】【HAL库】【自制库】ps2手柄模块驱动

    外观和电气连接 外观 手柄外观如下 接收器外观 这是接收器和底座 电气连接 需要4根连接线 单片机输出是CLK DO CS 单片机输入是DI 电源电压是3.3-5v 注意模块和单片机共地 模块不支持高 ...

  2. 【STM32】标准库与HAL库对照学习教程十三--软件IIC控制AT24C02

    [STM32]标准库与HAL库对照学习教程十三--软件IIC控制AT24C02 一.前言 二.准备工作 三.AT24C02(EEPROM)介绍 1.AT24C02简介 2.引脚功能 3.设备地址 四. ...

  3. HAL库是什么,HAL库的定义

     1.HAL 库的定义 HAL是 Hardware Abstraction Layer 的缩写,中文名:硬件抽象层.HAL 库是 ST 为 STM32 最新推出的抽象层嵌入式软件,可以更好的确保跨 S ...

  4. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  5. STM32的HAL库分析及使用

    STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配 ...

  6. STM32标准库、HAL库特点与应用

    新手在入门STM32的时候,一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发. 对于刚入门的朋友可能没法直观了解这些不同开发发方式彼此之间的区别,本文试图以一种非常直白的方 ...

  7. STM32如何配置HAL库

    STM32如何配置HAL库 前言   相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好.黑猫也好 ...

  8. STM32 HAL库与标准库的区别_浅谈句柄、MSP函数、Callback函数

    最近笔者开始学习STM32的HAL库,由于以前一直用标准库进行开发,于是发现了HAL库几点好玩的地方,在此分享. 1.句柄 在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例) 我 ...

  9. 一文搞懂HAL库是什么及如何使用

    关注.星标公众号,直达精彩内容 文章来源:网路素材 前言   相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的 ...

  10. stm32cube,hal库来实现PS2手柄数据发送

    stm32cube,hal库来实现PS2手柄数据发送 很久前买了个PS2的手柄,如下,之前 以前不会使用cube来配置工程,导致写程序很麻烦,对我这样的新手很不友好,看卖家提供的程序也很麻烦,拉高拉低 ...

最新文章

  1. C语言关键字static与extern的详细解释
  2. 固定收益证券(fixed income)
  3. 2018蓝桥杯省赛---java---B---1(第几天)
  4. 省编码市编码区县编码_无浪费编码
  5. Java的原始字符串文字
  6. 【转】谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
  7. 设计模式- 创建型模式, 建造者模式(2)
  8. iPhone:创建、连接和使用静态库(过时了,仅参考)
  9. WF4.0 Beta1 CancellationScope 取消容器
  10. flutter 获取定位_定位Flutter内存问题如何做
  11. html文本绘制,HTML5绘制实心的文本
  12. 考研数学笔记:曲率数学公式推导
  13. 魏秀参:如何理解全连接层的作用?
  14. js实现的万年历显示
  15. 我的第一个python程序源代码_科学网—我的第一个Python程序——删除代码前行号的小工具 - 闫小勇的博文...
  16. 连接超时与读取超时概述
  17. java飞机_使用java写出飞机小游戏
  18. java freemarker转PDF和Word
  19. PlaySound函数以及sndPlaySound函数用法总结
  20. HBase 在滴滴出行的应用场景和最佳实践

热门文章

  1. 一款好用且开源的图像处理软件----imageJ
  2. 5G下行候选新波形简介(1)--FBMC、UFMC、GFDM
  3. 倍福--控制雷赛步进电机
  4. js 利用audio buffers[int16Array]计算分贝
  5. 晶振PCB layout注意事项
  6. Quartus-II实现D触发器的三种方式
  7. Linux应用层例程7 CAN 应用编程基础
  8. VB.net,VB2005实现TCP协议编程
  9. excel函数提取计算机登录名,excel常用函数怎么提取姓氏?excel常用函数提取姓氏的方法...
  10. 数据结构与算法分析(C++版) 张铭 等译