在STM32F103主板上运行正常的PS2手柄驱动协议,平移到STM32F405的板子上,遇到板子收不到手柄按键信号的情况。各种查找资料,各种测试之后,终于在这篇博文的启发下找到了问题。关于使用STM32F4驱动PS2报错这件事_煜个头头的博客-CSDN博客起因在做项目移植PS2代码的时候,本来以为简简单单的一件事,关了好几个小时的时间,读到的数据一直不正确(数据跳动不稳定),本来决定放弃,但还是决定将坑一踩到底!所以就有了这篇文章解决方向以之前排坑的经验,问题可能出在以下几个地方硬件问题IO口配置时钟树配置以及定时器配置底层驱动代码不适配(广泛流传的代码都是F103版本)问题探索硬件问题找了一块F103板子,正常驱动,排除了PS2损坏,线材断路问题。IO口配置按照官方例程配置的IO口,并测试了每个IO口输出正常,也试过修改IO口https://iam-tutu.blog.csdn.net/article/details/120644415
经过实测,在手柄读写命令中加入延时,完美解决问题。
//向手柄发送命令
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;
delay_us(15);//加入延时,缓解高时钟频率造成的读写错误
CLK_H; //时钟拉高
DELAY_TIME; //每发送一个指令 给CLK一个电平脉冲
CLK_L;
DELAY_TIME;
CLK_H;
delay_us(15); //加入延时,缓解高时钟频率造成的读写错误
if(DI)
Data[1] = ref|Data[1];
delay_us(15);//加入延时,缓解高时钟频率造成的读写错误
}
delay_us(15);
}
|