问题描述
在刚使用PS2手柄进行SPI通讯时,我看了一下官方给的例程,已经网上的教程,基本超过90%是使用软件SPI进行通讯的,我当时就想为什么不试试硬件SPI,说做就做,通过CubeMX配置好引脚和时钟和速率
可以看到,我这里把通讯速率调到了45MBIts/s,然后将代码烧录,通过示波器测试引脚,发现MOSI引脚波形正确,对应的CLK也是45MBIts/s这个速率,用PS2手柄能正确进行联机,此时绿灯常亮,也说明联机命令0x01,0x42能正确发送,但是按下手柄按键同时测量MISO引脚波形,发现一直处于高电平(因为初始进行了上拉)说明SPI通讯没法接收到数据
解决思路1:查看硬件接线问题
我打开PS2的手册看引脚是否接错,MOSI接CMD引脚 MISO接DAT引脚 并且用万用表检测会不会接线不牢固,最终排除了上述两种问题。
解决思路2:对比测试源码
为此我打开官方的测试源码(前面说过了官方是使用软件SPI)通过对比,官方使用delay()函数进行延时模拟SPI时序,并且延时时间为5-10us,通过计算速率差不多在100KBits/s左右,但是我的通讯速率却高达45MBIts/s,所以有可能是因为通信速率过高导致接受出问题,因此我把通讯速率也设置到100KBits/s左右进行测试,但是发现还是未能解决。
解决思路3:查看PS2的SPI通信协议
通过查看通信协议才发现,原来默认状态CLK是处于高电平,并且DI、DO是在时钟下降延读取数据,所以需要修改SPI的时钟极性和相位极性
此时使用示波器查看CLK波形,符合默认状态CLK是处于高电平
示波器查看MOSI波形,能正确发送MOSI命令
最后按下手柄按键,看到有MISO数据波形产生,说明SPI已经能正常通讯了!问题解决!
此时通过编写代码就可以读取对应按键信息
最终控制效果:
总结
遇到相类似这种通讯问题,首先应该排查硬件问题,比如是否接线或者焊接问题,再查看通讯速率是否匹配,如果是串口通讯,则需要保证相同波特率,如果是SPI IIC则需要考虑是否过高或者过低,最后还要根据不同的通讯设备查看其通信协议,这是重中之重!!!