参考
基本硬件准备
两块独立的ch552g的板子,开始连接时数据传输出现数据错误,本来猜想是通信线连接问题,后来用了较短的连接线依然没有改善。
SPI通信的认知
SPI一般都是全双工实时通信,所以在发送数据时一般有短暂的停留使得数据稳定读取
前期出现问题
1,一直触发中断
在打印结果中发现,多次触发中断,得出的结论;在中断中添加对中断标志位置位后解决问题
2,为了使得现象明显,通过LED显;但亮度不稳定
猜测:由于使用串口助手检测输出结果,LED引脚和和UART通信的引脚公用了。但是UART发送信号的电压变化相当于一个不规则的PWM导致亮度时刻变化
3,数据出现乱码情况,且每次同样的运行出的输出结果不同
这是主要困扰的问题,发现每次的数据居然不是预期的,而且同样的程序,再次运行时发现结果居然不同。最终意外想起,在SPI引脚和触摸检测的引脚在一个引脚,硬件设计时,多加了电容,在实际使用时忘记拆掉。后来拆掉发现数据输出稳定。
4,接收数据和发送数据不一致
主要控制的配置,下面的不同情况配置就是通过改变下面的几个控制参数
主机发送数据时无延时
for(COUNT=0;COUNT<10;COUNT++){master_cs = 0 ; //低电平片选有效REM_FIR = 48+COUNT;mDelaymS(1000); SPI_WriteByte(REM_FIR); //ASCII码的0字符对应的就是48mDelaymS(5); //这个不能省,否则接收会一直读取数据//master_cs = 1 ; //取消片选//mDelayuS(1); //这个不能省,否则接收会一直读取数据LED = 1; //主机显示LED1 = !LED1;master_cs = 1 ; //取消片选REM_FIR=1;}
主机发送有延迟
都能完成正确发送和接收,下面对应的条件和前面(除了主机发送延时)其他都一样,数据传送没问题
分析上面出现的问题
虽然SPI是实时通信,但从数据写入寄存器然后发送到从机的寄存器,再从从机寄存器读取出来。主机发送到寄存器一个字节最好不要紧接着发送下一个字节,因为上个字节如果没读取走,那么发送的数据可能被覆盖。