ESP8266与PS2通信
Talk is cheap,show you code!
/**
* 功能:PS2遥控,串口打印按键信息
* 平台:ESP8266
* 接线:
* ESP8266: PS2:
* GPIO12 -> DAT
* GPIO13 -> CMD
* GPIO14 -> CS
* GPIO15 -> CLK
* 作者:锋 2022-1-22-00:18
*/
#define DI_pin 12//D6 DAT
#define DO_pin 13//D7 CMD
#define CS_pin 14//D5
#define CLK_pin 15//D8
#define DO_H digitalWrite(DO_pin,HIGH)
#define DO_L digitalWrite(DO_pin,LOW)
#define CLK_H digitalWrite(CLK_pin,HIGH)
#define CLK_L digitalWrite(CLK_pin,LOW)
#define CS_H digitalWrite(CS_pin,HIGH)
#define CS_L digitalWrite(CS_pin,LOW)
typedef unsigned short u16;
typedef unsigned char u8;
u8 Data[9];
u8 SELECT,L3,R3,START,UP,RIGHT,DOWN,LEFT,L2,R2,L1,R1,TRIANGLE,CIRCLE,FORK,SQUARE;
u8 PS2_LX,PS2_LY,PS2_RX,PS2_RY;
void PS2_Cmd(u8 CMD)
{
volatile u16 ref=0x01;
Data[1]=0;
for(ref=0x01;ref<0x0100;ref<<=1)
{
if(ref&CMD)
{
DO_H;
}
else
DO_L;
CLK_H;
delayMicroseconds(10);
CLK_L;
delayMicroseconds(10);
CLK_H;
if(digitalRead(DI_pin))
{
Data[1]=ref|Data[1];
}
}
delayMicroseconds(16);
}
void PS2_ReadData(void)
{
volatile u8 byt=0;
volatile u16 ref=0x01;
CS_L;
PS2_Cmd(0x01);
PS2_Cmd(0x42);
for(byt=2;byt<9;byt++)
{
for(ref=0x01;ref<0x100;ref<<=1)
{
CLK_H;
delayMicroseconds(10);
CLK_L;
delayMicroseconds(10);
CLK_H;
if(digitalRead(DI_pin))
{
Data[byt] = ref|Data[byt];
}
}
delayMicroseconds(16);
}
CS_H;
}
void PS2_ClearData()
{
u8 a;
for(a=0;a<9;a++)
{
Data[a]=0x00;
}
}
void PS2_ShortPoll(void)
{
CS_L;
delayMicroseconds(16);
PS2_Cmd(0x01);
PS2_Cmd(0x42);
PS2_Cmd(0X00);
PS2_Cmd(0x00);
PS2_Cmd(0x00);
CS_H;
delayMicroseconds(16);
}
void PS2_EnterConfing(void)
{
CS_L;
delayMicroseconds(16);
PS2_Cmd(0x01);
PS2_Cmd(0x43);
PS2_Cmd(0X00);
PS2_Cmd(0x01);
PS2_Cmd(0x00);
PS2_Cmd(0X00);
PS2_Cmd(0X00);
PS2_Cmd(0X00);
PS2_Cmd(0X00);
CS_H;
delayMicroseconds(16);
}
void PS2_TurnOnAnalogMode(void)
{
CS_L;
PS2_Cmd(0x01);
PS2_Cmd(0x44);
PS2_Cmd(0X00);
PS2_Cmd(0x01);
PS2_Cmd(0xEE);
PS2_Cmd(0X00);
PS2_Cmd(0X00);
PS2_Cmd(0X00);
PS2_Cmd(0X00);
CS_H;
delayMicroseconds(16);
}
void PS2_VibrationMode(void)
{
CS_L;
delayMicroseconds(16);
PS2_Cmd(0x01);
PS2_Cmd(0x4D);
PS2_Cmd(0X00);
PS2_Cmd(0x00);
PS2_Cmd(0X01);
CS_H;
delayMicroseconds(16);
}
void PS2_ExitConfing(void)
{
CS_L;
delayMicroseconds(16);
PS2_Cmd(0x01);
PS2_Cmd(0x43);
PS2_Cmd(0X00);
PS2_Cmd(0x00);
PS2_Cmd(0x5A);
PS2_Cmd(0x5A);
PS2_Cmd(0x5A);
PS2_Cmd(0x5A);
PS2_Cmd(0x5A);
CS_H;
delayMicroseconds(16);
}
void PS2_SetInit(void)
{
PS2_ShortPoll();
PS2_ShortPoll();
PS2_ShortPoll();
PS2_EnterConfing();
PS2_TurnOnAnalogMode();
PS2_VibrationMode();
PS2_ExitConfing();
}
void PS2(void)
{
PS2_ClearData();
PS2_ReadData();
SELECT=!(0x80&Data[3]);
L3=!(0x40&Data[3]);
R3=!(0x20&Data[3]);
START=!(0x10&Data[3]);
UP=!(0x08&Data[3]);
RIGHT=!(0x04&Data[3]);
DOWN=!(0x02&Data[3]);
LEFT=!(0x01&Data[3]);
L2=!(0x80&Data[4]);
R2=!(0x40&Data[4]);
L1=!(0x20&Data[4]);
R1=!(0x10&Data[4]);
TRIANGLE=!(0x08&Data[4]);
CIRCLE=!(0x04&Data[4]);
FORK=!(0x02&Data[4]);
SQUARE=!(0x01&Data[4]);
PS2_RX=Data[5];
PS2_RY=Data[6];
PS2_LX=Data[7];
PS2_LY=Data[8];
delay(100);
}
void SerialPrintKey(void)
{
Serial.printf("PS2_LX=%d,PS2_LY=%d,PS2_RX=%d,PS2_RY=%d\n",PS2_LX,PS2_LY,PS2_RX,PS2_RY);
Serial.printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",SELECT,L3,R3,START,UP,RIGHT,DOWN,LEFT,L2,R2,L1,R1,TRIANGLE,CIRCLE,FORK,SQUARE);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(DI_pin,INPUT);
pinMode(DO_pin,OUTPUT);
pinMode(CS_pin,OUTPUT);
pinMode(CLK_pin,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
PS2();
SerialPrintKey();
}