PS2手柄移植到STM32上面的小笔记[通俗易懂]

您所在的位置:网站首页 ps1手柄接线图 PS2手柄移植到STM32上面的小笔记[通俗易懂]

PS2手柄移植到STM32上面的小笔记[通俗易懂]

2024-07-14 00:57:05| 来源: 网络整理| 查看: 265

大家好,又见面了,我是你们的朋友全栈君。

一、硬件准备:战舰开发板、PS2手柄接收器、PS2手柄、连接线

在这里插入图片描述在这里插入图片描述

二、硬件连接: PS2手柄接收器有六个引脚,和单片机连接IO口连接,如下图:

接收器信号

单片机IO

GND

GND

VCC

3.3V

DI/DAT

PB12

DO/CMD

PB13

CS

PB14

CLK

PB15

在这里插入图片描述在这里插入图片描述

三、PS2通信简介 通讯时序如下,感觉和SPI很像,也是四线 DI与DO是一对同时传输的8 bit串行数据,传输的时候需要CS为低电平,CLK由高变低。 DO是单片机发送给接收器的信号。 DI是接收器发送给单片机的信号。

在这里插入图片描述在这里插入图片描述

第一点:CS在数据输出或者输入的时候,都是低电平的,那么我们在数据传输的时候先把CS拉高再拉低,然后数据进行传输,传输完成之后再把CS拉高。 第二点:DI(Data Input)与DO(Data Output)是同时完成的,说明这是全双工通信。串口是全双工通信。IIC是半双工通信。 第三点:在时钟上降沿的时候,DI和DO的数据有交叉,也就是说数据进行交换(数据只有0和1),这个时候我们是不能够读和写数据的,因为数据还不稳定,我们读到的数据不准确。在时钟为下降沿的时候,数据已经稳定了,我们在这个时候开始读和写数据。 第四点:由于是从0到7,可以知道有8位数据,并且是从低位到高位进行读写。我们可以把数据放到数组中。一个时钟进行一个数据位(也可以叫做比特位0或1)传输。

在这里插入图片描述在这里插入图片描述

时钟频率250KHZ(4us),数据不稳定可适当增加频率。 当单片机发送0x01时,接收器会回复它的ID“0X41表示绿灯模式”、“0x73表示红灯模式”;在手柄发送ID的同时,单片机将发送0X42,手柄会发送0X5A,高速单片机数据来了。 上表中的idle表示数据线空闲,该数据线无数据传送。 所以Data[0]、Data[1]、Data[2]不能用来存放PS2摇杆的按键 Data[3]、Data[4]用来存放按键的值 Data[5]、Data[6]、Data[7]、Data[8]用来存放摇杆的模拟量

当有按键下,对应位为0,其他位为1 譬如,当SELECT按下,Data[3]=1111 1110B 当L3按下,Data[3]=1111 1101B 当R3按下,Data[3]=1111 1011B 当START按下,Data[3]=1111 0111B 当UP按下,Data[3]=1110 1111B 当RIGHT按下,Data[3]=1101 1111B 当DOWN按下,Data[3]=1011 1111B 当LEFT按下,Data[3]=0111 1111B

手柄有两个模式,红灯模式(手柄亮红灯+绿灯)和绿灯模式(手柄只亮绿灯),可以通过按下MODE按键进行切换。

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

红灯模式: 1.按键L3/R3按下有效 2.推动左右摇杆,根据行程不一样,可输出0x00-0xff的模拟量 绿灯模式: 1.按键L3/R3按下有效 2.左右摇杆不输出模拟量,推动到上下左右的极限值,左摇杆实现的效果和UP/DOWN/RIGHT/LEFT一样,右摇杆实现的效果和和△/X/□/○一样。

设置震动模式后: WW用来控制右侧的小电机,0x00表示关,其他值为开。 YY用来控制左侧的大电机,0x40-0xff表示电机开,值越大,震感越强烈;其他值表示电机关。

四、代码分析 1.配置IO口,将PB12设置为下拉输入;PB13/14/15设置为推挽输出

代码语言:javascript复制void PS2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //输入 DI->PB12 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能PORTB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置成上拉、下拉、浮空输入皆可 GPIO_Init(GPIOB, &GPIO_InitStructure); //输出 DO->PB13 CS->PB14 CLK->PB15 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); }

2.定义3个数组

代码语言:javascript复制u8 Comd[2]={ 0x01,0x42}; //开始命令。请求数据 u8 Data[9]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据存储数组 //每个按键对应一个数值 u16 MASK[]={ PSB_SELECT, PSB_L3, PSB_R3 , PSB_START, PSB_PAD_UP, PSB_PAD_RIGHT, PSB_PAD_DOWN, PSB_PAD_LEFT, PSB_L2, PSB_R2, PSB_L1, PSB_R1 , PSB_GREEN, PSB_RED, PSB_BLUE, PSB_PINK };

3.给PB12/PB13/PB14/PB15这4个IO的状态均进行宏定义

代码语言:javascript复制#define DI PBin(12) //PB12 输入 #define DO_H PBout(13)=1 //命令位高 #define DO_L PBout(13)=0 //命令位低 #define CS_H PBout(14)=1 //CS拉高 #define CS_L PBout(14)=0 //CS拉低 #define CLK_H PBout(15)=1 //时钟拉高 #define CLK_L PBout(15)=0 //时钟拉低

4.单片机向手柄发送命令

代码语言:javascript复制//向手柄发送命令 void PS2_Cmd(u8 CMD) { volatile u16 ref=0x01; Data[1] = 0; for(ref=0x01;ref


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭