From e949580221f91607a9827fdc36b4726178547680 Mon Sep 17 00:00:00 2001 From: chenfu <2412777093@qq.com> Date: Mon, 27 Mar 2023 22:05:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=BE=E5=AE=B6=E9=94=AE=E9=BC=A0=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/ps_handle/ps_handle.c | 115 ++++++++++++++++++++++++++++++++++ modules/ps_handle/ps_handle.h | 38 +++++++++++ 2 files changed, 153 insertions(+) create mode 100644 modules/ps_handle/ps_handle.c create mode 100644 modules/ps_handle/ps_handle.h diff --git a/modules/ps_handle/ps_handle.c b/modules/ps_handle/ps_handle.c new file mode 100644 index 0000000..8928512 --- /dev/null +++ b/modules/ps_handle/ps_handle.c @@ -0,0 +1,115 @@ +#include "ps_handle.h" +uint8_t PS2_RawData[9] = {0}; +PS2_Instance PS2_Data = {0}; +void PS2_CS(uint8_t Val) +{ + if (Val) + HAL_GPIO_WritePin(PS2_CS_GPIOx, PS2_CS_Pin, GPIO_PIN_SET); + else + HAL_GPIO_WritePin(PS2_CS_GPIOx, PS2_CS_Pin, GPIO_PIN_RESET); +} +void PS2_CLK(uint8_t Val) +{ + if (Val) + HAL_GPIO_WritePin(PS2_CLK_GPIOx, PS2_CLK_Pin, GPIO_PIN_SET); + else + HAL_GPIO_WritePin(PS2_CLK_GPIOx, PS2_CLK_Pin, GPIO_PIN_RESET); +} +void PS2_DO(uint8_t Val) +{ + if (Val) + HAL_GPIO_WritePin(PS2_DO_GPIOx, PS2_DO_Pin, GPIO_PIN_SET); + else + HAL_GPIO_WritePin(PS2_DO_GPIOx, PS2_DO_Pin, GPIO_PIN_RESET); +} +uint8_t PS2_Read_DI() +{ + return HAL_GPIO_ReadPin(PS2_DI_GPIOx, PS2_DI_Pin); +} +void PS2_Delay() +{ + for (int i = 0; i < 0xBf; i++) + __NOP(); +} +uint8_t PS2_ReadWrite_Byte(uint8_t TxData) +{ + uint8_t TX = TxData; + uint8_t RX = 0; + for (int i = 0; i < 8; i++) + { + if (TX & 0x01) + PS2_DO(1); + else + PS2_DO(0); + TX >>= 1; + PS2_CLK(1); + PS2_Delay(); + PS2_CLK(0); + RX >>= 1; + RX |= (PS2_Read_DI() << 7); + PS2_Delay(); + PS2_CLK(1); + PS2_Delay(); + } + return RX; +} + +static void PS2_Decode() +{ + if (PS2_RawData[2] == 0x5A) + { + PS2_Data.Key_Select = (~PS2_RawData[3] >> 0) & 0x01; //选择键 + PS2_Data.Key_Start = (~PS2_RawData[3] >> 3) & 0x01; //开始键 + + //左侧按键 + PS2_Data.Key_L_Up = (~PS2_RawData[3] >> 4) & 0x01; + PS2_Data.Key_L_Right = (~PS2_RawData[3] >> 5) & 0x01; + PS2_Data.Key_L_Down = (~PS2_RawData[3] >> 6) & 0x01; + PS2_Data.Key_L_Left = (~PS2_RawData[3] >> 7) & 0x01; + + //后侧按键 + PS2_Data.Key_L2 = (~PS2_RawData[4] >> 0) & 0x01; + PS2_Data.Key_R2 = (~PS2_RawData[4] >> 1) & 0x01; + PS2_Data.Key_L1 = (~PS2_RawData[4] >> 2) & 0x01; + PS2_Data.Key_R1 = (~PS2_RawData[4] >> 3) & 0x01; + + //右侧按键 + PS2_Data.Key_R_Up = (~PS2_RawData[4] >> 4) & 0x01; + PS2_Data.Key_R_Right = (~PS2_RawData[4] >> 5) & 0x01; + PS2_Data.Key_R_Down = (~PS2_RawData[4] >> 6) & 0x01; + PS2_Data.Key_R_Left = (~PS2_RawData[4] >> 7) & 0x01; + + if (PS2_RawData[1] == 0x41) + { //无灯模式(摇杆值八向) + PS2_Data.Rocker_LX = 127 * (PS2_Data.Key_L_Right - PS2_Data.Key_L_Left); + PS2_Data.Rocker_LY = 127 * (PS2_Data.Key_L_Up - PS2_Data.Key_L_Down); + + PS2_Data.Rocker_RX = 127 * (PS2_Data.Key_R_Right - PS2_Data.Key_R_Left); + PS2_Data.Rocker_RY = 127 * (PS2_Data.Key_R_Up - PS2_Data.Key_R_Down); + } + else if (PS2_RawData[1] == 0x73) + { //红灯模式(摇杆值模拟) + + //摇杆按键 + PS2_Data.Key_Rocker_Left = (~PS2_RawData[3] >> 1) & 0x01; + PS2_Data.Key_Rocker_Right = (~PS2_RawData[3] >> 2) & 0x01; + + //摇杆值 + PS2_Data.Rocker_LX = PS2_RawData[7] - 0x80; + PS2_Data.Rocker_LY = -1 - (PS2_RawData[8] - 0x80); + PS2_Data.Rocker_RX = PS2_RawData[5] - 0x80; + PS2_Data.Rocker_RY = -1 - (PS2_RawData[6] - 0x80); + } + } +} +void PS2_Read_Data(void) +{ + PS2_CS(0); + PS2_RawData[0] = PS2_ReadWrite_Byte(0x01); // 0 + PS2_RawData[1] = PS2_ReadWrite_Byte(0x42); // 1 + for (int i = 2; i < 9; i++) + PS2_RawData[i] = PS2_ReadWrite_Byte(0xff); + PS2_CS(1); + PS2_Decode(); +} + diff --git a/modules/ps_handle/ps_handle.h b/modules/ps_handle/ps_handle.h new file mode 100644 index 0000000..bd35311 --- /dev/null +++ b/modules/ps_handle/ps_handle.h @@ -0,0 +1,38 @@ +#ifndef PS_HANDLE_H +#define PS_HANDLE_H + +#include "bsp_spi.h" +#include "bsp_gpio.h" +#include "bsp_dwt.h" + +#define PS2_CS_GPIOx GPIOB +#define PS2_CS_Pin GPIO_PIN_12 + +#define PS2_CLK_GPIOx GPIOB +#define PS2_CLK_Pin GPIO_PIN_13 + +#define PS2_DO_GPIOx GPIOB +#define PS2_DO_Pin GPIO_PIN_15 + +#define PS2_DI_GPIOx GPIOB +#define PS2_DI_Pin GPIO_PIN_14 + +typedef struct +{ + uint8_t A_D; //模拟(红灯)为1 数字(无灯)为0 + int8_t Rocker_RX, Rocker_RY, Rocker_LX, Rocker_LY; //摇杆值(模拟状态为实际值0-0xFF)(数字态为等效的值0,0x80,0xFF) + //按键值0为未触发,1为触发态 + uint8_t Key_L1, Key_L2, Key_R1, Key_R2; //后侧大按键 + uint8_t Key_L_Right, Key_L_Left, Key_L_Up, Key_L_Down; //左侧按键 + uint8_t Key_R_Right, Key_R_Left, Key_R_Up, Key_R_Down; //右侧按键 + uint8_t Key_Select; //选择键 + uint8_t Key_Start; //开始键 + uint8_t Key_Rocker_Left, Key_Rocker_Right; //摇杆按键 + +} PS2_Instance; + + + + + +#endif // !PS_HANDLE_H#define PS_HANDLE_H