一、PS2 手柄介绍:

PS2 由手柄与接收器两部分组成,手柄主要负责发送按键信息。都接通电源并打开手柄开关时,手柄与接收器自动配对连接(这是由于手柄与接收器之间依靠2.4G进行通信),在未配对成功的状态下,接收器绿灯闪烁,手柄上的灯也会闪烁,配对成功后,接收器上绿灯常亮,手柄上灯也常亮,这时可以按“MODE”键,选择手柄发送模式,红灯模式:遥杆输出模拟值;绿灯模式:遥杆对应上面四个按键,只有四个极限方向对应。
接收器和主机(单片机)相连,实现主机与手柄之间的通讯。
亚博智能给的又是用STM32F103C8T6,标准库的代码。这还是我从平衡小车那里弄来的源码,原本给的用来测试的源码还是用寄存器写的。然后以下是移植到STM32F407ZGT6基于HAL库的记录。

引脚定义

1 2 3 4 5 6 7 8 9
DI/DAT DO/CMD NC GND VDD CS/SEL CLK NC ACK

NC我合理猜测是空端口

二、编程实验

cube

GPIO

将三个GPIO口设置为推挽输出模式,一个设置为下拉输入模式。三个GPIO_Output的引脚分别对应MISO、CS和SCK,GPIO_Input的引脚对应的是MOSI。
USART

串口初始化

keil

主函数中初始化PS2
在while(1)中读取手柄按键

void PS2_Init(void)
{__HAL_RCC_GPIOD_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};/*Configure GPIO pins : PD0 PD1 PD2 */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/*Configure GPIO pin : PD3 */GPIO_InitStruct.Pin = GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLDOWN;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);
}

将IO口的初始化写在这里是为了方便之后的移植

unsigned char PS2_DataKey()
{uint8_t index = 0, i = 0;PS2_ClearData();HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1,GPIO_PIN_RESET);for(i=0;i<9;i++)   //更新扫描按键{Data[i] = PS2_ReadData(scan[i]);  } HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1,GPIO_PIN_SET);Handkey=(Data[4]<<8)|Data[3];     //这是16个按键  按下为0, 未按下为1for(index=0;index<16;index++){       if((Handkey&(1<<(MASK[index]-1)))==0)return index+1;}return 0;          //没有任何按键按下
}

对串口数据收发相关的把信号线,时钟线进行拉高拉低的操作我没有进行封装,主要是懒。

uint8_t PS2_ReadData(uint8_t command)
{uint8_t i,j=1;uint8_t res=0; for(i=0; i<=7; i++)          {if(command&0x01)HAL_GPIO_WritePin(GPIOD,GPIO_PIN_0,GPIO_PIN_SET);elseHAL_GPIO_WritePin(GPIOD,GPIO_PIN_0,GPIO_PIN_RESET);command = command >> 1;delay_us(10);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);delay_us(10);if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3) ) res = res + j;j = j << 1; HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);delay_us(10);    }HAL_GPIO_WritePin(GPIOD,GPIO_PIN_0,GPIO_PIN_SET) ;delay_us(50);return res;
}

记得这里的读数据延时是微秒级别的

三、实验结果

反正就是成功了

亚博智能PS2手柄学习笔记相关推荐

  1. 使用亚博智能K210实现人脸特征提取和识别

    使用亚博智能K210实现人脸特征提取和识别 亚博智能K210开发板自带有使用C语言编程实现的人脸检测代码,即可以检测到摄像头范围内的人脸并将人脸框定出来,不能实现人脸的特征提取和人脸的识别.因此,我们 ...

  2. 小觅智能 |MSCKF 学习笔记

    转载自:https://mp.weixin.qq.com/s/shxmOtDOSVZn_eQKgs8LBw 小觅智能 |MSCKF 学习笔记 知乎觅 MYNTAI小觅智能 2019-10-31 VIO ...

  3. 多智能体系统仿真学习笔记:(一)ODE

    多智能体系统仿真学习笔记:(一)ODE (一)ODE的一般形式 Ⅰ.常微分方程 (ODE) Ⅱ.ODE方程组 Ⅲ.高阶ODE Ⅳ.复数ODE (二)Matlab中的ODE Ⅰ.Matlab中可求解的O ...

  4. 智能指针_auto_ptr2_学习笔记

    //1,release函数只是简单的转移对内存的拥有权,自己变成null,不会delete,一般在将所有权转移给别的智能指针的时候使用.具体可参加源码. 例:#include <memory&g ...

  5. 智能车K60学习笔记

    文章目录 K60学习笔记(开个坑,慢慢学) 基础知识 一系列定义或名称 简单位运算 中断(Interrupt) 8051 定时器中断 Kinetis K60介绍 K60模块 PORT模块 GPIO模块 ...

  6. 《智能控制技术》学习笔记-1.绪论,智能控制定义、分类、发展及应用场景

    一.引言 先修内容: 经典控制理论.现代控制理论.MATLAB 引入:智能理论是新兴学科,随着数字计算机和人工智能发展而来,发展得益于许多学科:人工智能.认知科学.现代自适应控制.最优控制.神经元网络 ...

  7. 智能社JS学习笔记(一)

    前言 转眼工作即将半年,这段时间自学了UI,html和css方面能比较熟练的掌握了,写过两套小程序的模板但只知其然不知其所以然(还是因为自己js基础知识掌握的不够啊)用bootstrap之类的框架能写 ...

  8. ESP32连接校园网,第一次接触网络通信,写一篇博客记录一下学习笔记。

    一.校园网服务器分析 我们的校园网,当我们连接上xxst时,处于它的局域网当中,只有我们获得认证授权之后才能访问外界网络,而认证授权这一操作对于单片机来说只不过是几行代码就能解决,而对于我没有系统学习 ...

  9. 浅谈FFT(快速博立叶变换)学习笔记

    0XFF---FFT是啥? FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform),它根据离散傅氏变换的奇.偶.虚.实等 特性,对离散傅立叶变换的算法进行改进 ...

最新文章

  1. 多模态学习研讨会:预训练是AI未来所需要的全部吗?
  2. 2021年春季学期-信号与系统-第四次作业参考答案-第三小题
  3. Script:收集11g Oracle实例IO性能信息
  4. Django中的Session与Cookie
  5. 在anaconda中安装tensorflow-GPU版本
  6. Cisco asa 5520 oid
  7. html5 web storage攻击,HTML5安全风险详析之二:Web Storage攻击
  8. Change Value to Reference(将值对象改为引用对象)
  9. python创建文本、判断该文件共有多少行_python如何判断文件有多少行
  10. matlab m文件的编写,Matlab实验报告(四)M文件的编写.doc
  11. qt html导pdf 页眉,如何使用wkhtmltopdf unpatched qt在每个页面上添加页眉和页脚?
  12. java i o是什么流_Java I/O 流,输入流、输出流
  13. linux中UDP编程
  14. 硬盘转速和平均寻道时间
  15. Python爬虫BeautifulSoup4小记
  16. Linux 查看自己的IP地址
  17. Go语言之父谈Go:大道至简
  18. 浏览器打开任意可执行exe文件方法
  19. oracle 分区表 变大,Oracle11G新特性:分区表分区默认segment大小64k变为8M
  20. LRU算法,走迷宫,数根,星际战争

热门文章

  1. pentaho源码分析
  2. linux下搭建基本web服务
  3. 长文干货! 一文搞懂IoC的依赖注入
  4. 报如下错误:android.util.AndroidRuntimeException: You cannot combine custom titles with other title featur
  5. FICO 里面的替代和校验 以及调试
  6. uniapp 子组件 mounted 刷新
  7. 推荐系统[四]:精排-详解排序算法LTR (Learning to Rank): poitwise, pairwise, listwise相关评价指标,超详细知识指南。
  8. TEB算法详解(TebLocalPlannerROS::computeVelocityCommands(2))
  9. 现实环境中,关于Teb Local Planner 参数调试总结
  10. 随心所欲——享受恬淡的心态