PS2手柄代码移植-合泰平台
1、PS2手柄端口及通讯协议
PS2手柄的通讯协议是SPI协议是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线(DI、DO、CS、CLK),PS2手柄的通讯协议破解后在C51、STM32、Arduino、FPGA等平台上均有应用,其端口、通讯协议及使用方法的介绍在网上一搜一大堆,大家自行下载即可。
博主本科期间由于项目需求,需要在合泰芯片上实现ps2手柄控制的代码。于是将ps2的代码从别的平台上移植到合泰芯片平台上,具体型号为合泰HT66F70A(好像是开发板型号,不一定是芯片型号),如今整理出来,希望能帮助到有需要的朋友。
2、移植代码:文件主要包括三份:ps2.c、ps2.h、main.c
#include "PS2.h"
#include "HT66F70A.h"
//全局变量区
unsigned short int Handkey;
unsigned char Comd[2] = {
0x01,0x42};//开始命令。请求数据
unsigned char Data[9] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据存储数组
unsigned short int 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
};//按键值与按键明
//手柄接口初始化 输入 DI->PB12
// 输出 DO->PB13 CS->PB14 CLK->PB15
void PS2_INIT(void)
{
//输入 DI->PB2
_pcc4 = 1;//PB12设置成输入 默认下拉
_pcpu4 = 0;
//DO->PB3 CS->PB4 CLK->PB5
_pcc5 = 0;//PB3、PB4、PB5 推挽输出
_pcc6 = 0;
_pcc7 = 0;
_pcpu5 = 0;
_pcpu6 = 0;
_pcpu7 = 0;
}
void PS2_Cmd(unsigned char CMD)
{
volatile unsigned short int ref = 0x01;
Data[1] = 0;
for(ref=0x01;ref<0x0100;ref<<=1)
{
if(ref&CMD)
{
DO_H; //输出以为控制位
}
else DO_L;
CLK_H; //时钟拉高
GCC_DELAY(5);//delay_us(50);
CLK_L;
GCC_DELAY(5);//delay_us(50);
CLK_H;
if(DI)
Data[1] = ref|Data[1];
}
GCC_DELAY(16);
}
//判断是否为红灯模式
//返回值;0,红灯模式
// 其他,其他模式
unsigned char PS2_RedLight(void)
{
CS_L;
PS2_Cmd(Comd[0]); //开始命令
PS2_Cmd(Comd[1]); //请求数据
CS_H;
if( Data[1] == 0X73) return 0 ;
else return 1;
}
//读取手柄数据
void PS2_ReadData(void)
{
volatile unsigned char byte=0;
volatile unsigned short int ref=0x01;
CS_L;
PS2_Cmd(Comd[0]); //开始命令
PS2_Cmd(Comd[1]); //请求数据
for(byte=2;byte<9;byte++) //开始接受数据
{
for(ref=0x01;ref<0x100;ref<<=1)
{
CLK_H;
GCC_DELAY(5);
CLK_L;
GCC_DELAY(5);//delay_us(50);
CLK_H;
if(DI)
Data[byte