spi信号能写,但就是不知道数据怎么处理,以及怎么调试手柄按键值
#include <stc12c5a60s2.h>
#include <ps2.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit CMD=P1^5;
sbit DAT=P1^6;
sbit CLK=P1^7;
sbit CS=P1^4;
sbit led=P1^0;
uchar date,back,temp,b1,b2,b3,b4,b5;
uchar command[9]={0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar read[9];
delay5us() //@11.0592MHz
{
unsigned char data i;
_nop_();
_nop_();
_nop_();
i = 10;
while (--i);
}
UARTInit()
{
EA=1;
ES=1;
SM0=0;
SM1=1;
REN=1;
TR1=1;
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
}
UART()interrupt 4
{
if(RI)
{
back=SBUF;
RI=0;
temp=back;
SBUF=temp;
}
// if(TI)
// TI=0;
}
delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
PS2_cmd(uchar cmd)
{
uchar i,j=1,readdat;
for(i=0;i<8;i++)
{
CLK=1;
if(cmd&0x80)
{
CMD=1;
}
else
{
CMD=0;
}
cmd<<=1;
CLK=0;
if(DAT)
readdat+=j;
j<<=1;
_nop_();
}
CMD=1;
return readdat;
}
PS2_read()
{
uchar i;
CS=0;
_nop_();
for(i=0;i<9;i++)
read[i]=PS2_cmd(command[i]);
_nop_();
CS=1;
}
distinguish_mode()
{
CS=0;
_nop_();
PS2_cmd(command[0]);
PS2_cmd(command[1]);
_nop_();
CS=1;
if(read[1]==0x73)
return 0;
else
return 1;
}
PS2_Init()
{
CS=0;
delay5us();
PS2_cmd(0x01);
PS2_cmd(0x42);
PS2_cmd(0x00);
PS2_cmd(0x00);
PS2_cmd(0x00);
delay5us();
CS=1;
}
start_config()
{
CS=0;
PS2_cmd(0x01);
PS2_cmd(0x43);
PS2_cmd(0x00);
PS2_cmd(0x01);
PS2_cmd(0x00);
CS=1;
}
TurnonAnalogMode()
{
CS=0;
PS2_cmd(0x01);
PS2_cmd(0x44);
PS2_cmd(0x00);
PS2_cmd(0x01);
PS2_cmd(0x03);
PS2_cmd(0x00);
PS2_cmd(0x00);
PS2_cmd(0x00);
PS2_cmd(0x00);
CS=1;
}
SetupMotorCommandMapping()
{
CS=0;
PS2_cmd(0x01);
PS2_cmd(0x4d);
PS2_cmd(0x00);
PS2_cmd(0xff);
PS2_cmd(0xff);
PS2_cmd(0xff);
PS2_cmd(0xff);
PS2_cmd(0xff);
PS2_cmd(0xff);
CS=1;
}
ExitConfigMode()
{
CS=0;
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=1;
}
main()
{
PS2_Init();
start_config();
TurnonAnalogMode();
SetupMotorCommandMapping();
ExitConfigMode();
UARTInit();
led=distinguish_mode();
while(1)
{
TI=1;
printf("%x ",b2);
while(!TI)
TI=0;
delay(1000);
}
}
ps2.h那个头文件我没用
【以下回答由 GPT 生成】
这段代码是针对在STM32上连接PS2手柄的一个例子。下面是对代码中的每个功能函数的解释,并提出一些建议来优化代码。
该函数用于产生一个约为5微秒的延迟。这个延迟函数可能用于同步时钟。
该函数初始化STM32的UART通信,包括设置通信模式、使能UART中断等。
该函数处理UART接收中断,当收到数据时,将接收到的数据进行处理并回传。
该函数用于产生一个延迟,具体的延迟时间由输入的参数决定。
该函数用于向PS2手柄发送命令(cmd),并返回手柄响应的数据。通过CLK引脚控制时钟,通过CMD引脚控制数据线的电平,通过DAT引脚读取数据。
该函数用于从PS2手柄读取数据,发送一系列命令给手柄,根据每个命令的响应将返回的数据存储在read数组中。
该函数用于向手柄发送一系列命令,以确定手柄的模式。
为了优化代码,以下是一些建议:
根据实际使用的STM32型号,确认头文件是否正确引入。头文件应该指定正确的MCU型号,以确保正确的寄存器映射。
给代码添加必要的注释,解释每个函数的作用和输入/输出参数等。
检查代码中的命名规范,变量和函数应使用有意义的名字。
添加错误检查和处理代码,例如检查命令是否成功发送和手柄是否有响应。
在PS2_cmd()函数中,添加参数检查以确保输入命令的有效性。
在PS2_read()函数中,检查返回的数据是否正确,并在需要时进行错误处理。
对于UARTInit()函数和UART()中断函数,确保STM32的UART配置与实际需要相符。
这是对代码的初步检查和优化建议。但是由于我无法查看引用的头文件和一些函数使用的具体细节,所以无法做出更具体的建议。如果您有进一步的问题或需要更多的帮助,请提供更多的细节。