|
在網(wǎng)上買的snoyps2無線手柄,打算破解它,控制機(jī)器人,snoy沒有提供資料,所有的資料都是前人破解成功傳到網(wǎng)上的,花了很久才找到,我用stm32芯片來接收無線接收器的數(shù)據(jù),我們不用管無線是怎么工作的,我們只需要讀取數(shù)據(jù)就可以了。
請參考以下博客,他們寫的比較好,我就不在重復(fù)了,最后把我的程序貼上來。
http://blog.163.com/zgbn2002@126 ... 001102010495044500/
http://blog.163.com/zgbn2002@126 ... 110201041105119576/
這是我的stm32程序,數(shù)據(jù)讀取均正常,每秒能讀取130多次。
#ifndef __PS2_JOYPAD_H
#define __PS2_JOYPAD_H
#include "sys.h"
#include "delay.h"
#include "usart.h"
#define PS2_JOYPAD_DATA PCin(0)
#define PS2_JOYPAD_CMND PCout(1)
#define PS2_JOYPAD_ATT PCout(2)
#define PS2_JOYPAD_CLOCK PCout(3)
#define PS2_JOYPAD_ACK PCin(4)
#define PS2_JOYPAD_CMND_START 0X01 //起始命令
#define PS2_JOYPAD_CMND_DEMAND 0X42 //數(shù)據(jù)請求
#define PS2_JOYPAD_CMND_NOP 0X00 //idle
void PS2_Wireless_JOYPAD_Init(void);
u16 PS2_Wireless_JOYPAD_DATA(void);
#endif
#include "ps2_joypad.h"
//PS2無線手柄的初始化
//初始化成功返回0,失敗返回1
void PS2_Wireless_JOYPAD_Init(void)
{
RCC->APB2ENR|=1<<4; //先使能外設(shè)PORTC時鐘
GPIOC->CRL&=0XFFF00000;
GPIOC->CRL|=0X00083338;
GPIOC->ODR|=1<<4;
GPIOC->ODR|=1<<3;
GPIOC->ODR|=1<<2;
GPIOC->ODR|=1<<1;
GPIOC->ODR|=1<<0;
PS2_JOYPAD_CLOCK=1;
PS2_JOYPAD_CMND=1;
PS2_JOYPAD_ATT=1;
delay_ms(10);
}
u8 PS2_Wireless_JOYPAD_WriteRead(u8 cmd)
{
u8 i=0;
u8 value=0;
u8 CMD=cmd;
for(i=0;i<8;i++)
{
PS2_JOYPAD_CLOCK=1;
if(CMD&0x01)PS2_JOYPAD_CMND=1;
else PS2_JOYPAD_CMND=0;
CMD>>=1;
delay_us(10);
PS2_JOYPAD_CLOCK=0;
delay_us(15);
value>>=1;
if(PS2_JOYPAD_DATA)value|=0x80; //0000 0000
}
PS2_JOYPAD_CLOCK=1;
return value;
}
//檢測應(yīng)答函數(shù)
//有應(yīng)答信號返回0,無應(yīng)答信號返回1
u8 PS2_Wireless_JOYPAD_ACK(void)
{
u8 i=0;
PS2_JOYPAD_CLOCK=1;
delay_us(5);
PS2_JOYPAD_CLOCK=0;
while(i<100)
{
if(0==PS2_JOYPAD_ACK)break;
i++;
}
PS2_JOYPAD_CLOCK=1;
return i<100?0:1;
}
//讀取數(shù)據(jù)函數(shù)
//成功返回0,失敗返回1
u16 PS2_Wireless_JOYPAD_DATA(void)
{
u8 PS2_JOYPAD_ID=0;
u8 table[3]={0};
//LEFT DOWN RGHT UP STRT X X SLCT 正方形 叉 圓形三角形 R1 L1 R2 L2
u16 PS2_VALUE=0XFFFF;
PS2_JOYPAD_ATT=0;//片選使能
delay_us(10);
PS2_Wireless_JOYPAD_WriteRead(PS2_JOYPAD_CMND_START);
if(1==PS2_Wireless_JOYPAD_ACK())return 1;
//手柄ID號,我的是數(shù)字手柄返回0X41
PS2_JOYPAD_ID=PS2_Wireless_JOYPAD_WriteRead(PS2_JOYPAD_CMND_DEMAND);
if(1==PS2_Wireless_JOYPAD_ACK())return 1;
table[0]=PS2_Wireless_JOYPAD_WriteRead(PS2_JOYPAD_CMND_NOP);//0x5a
if(1==PS2_Wireless_JOYPAD_ACK())return 1;
table[1]=PS2_Wireless_JOYPAD_WriteRead(PS2_JOYPAD_CMND_NOP);//data1
if(1==PS2_Wireless_JOYPAD_ACK())return 1;
table[2]=PS2_Wireless_JOYPAD_WriteRead(PS2_JOYPAD_CMND_NOP);//data2
PS2_VALUE=(table[1]<<8)|table[2];
delay_us(10);
PS2_JOYPAD_ATT=1;
return PS2_VALUE;
}
|
|