基本硬件准备
两块独立的ch552g的板子,开始连接时数据传输出现数据错误,本来猜想是通信线连接问题,后来用了较短的连接线依然没有改善,这个问题出现的主要原因还是同步通信的原因。
前期出现问题
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字符对应的就是48
mDelaymS(5); //这个不能省,否则接收会一直读取数据
//master_cs = 1 ; //取消片选
//mDelayuS(1); //这个不能省,否则接收会一直读取数据
LED = 1; //主机显示
LED1 = !LED1;
master_cs = 1 ; //取消片选
REM_FIR=1;
}
下面这些测试结果都是在主机只发送而从机只是接收的情况下测试的
主机发送有延迟
都能完成正确发送和接收,下面对应的条件和前面(除了主机发送延时)其他都一样,数据传送没问题
分析上面出现的问题
虽然SPI是实时通信,但从数据写入寄存器然后发送到从机的寄存器,再从从机寄存器读取出来。根据最开始说明的原因,在主机发送数据后,主机和从机都触发中断,但主机想要得到被从机处理过的数据,那么主机中断后需要等待一定时间,这段时间为了让从机处理好数据,然后读取的结果就会稳定了。
主从机相互通信出现问题
数据出现问题,一种是数据没处理完成或传递控制有问题,而下面的情况说明有部分正确数据,有些不正确。在数据读取过程中出现数据不稳定,说明读取和处理数据的时间可能有冲突(同时发生了)。所以,在从机处理数据时把,主机的中断暂停一会儿再读取数据。
CH552G的spi传输的几个要点
1,只有主机才能开启spi传输,触发中断的最初原因一定是主机
2,确定主机和从机
有些控制位只能在从机中使用
3,主机的读取和发送数据都会出现写寄存器的过程
从下面程序发现,都执行了对寄存器的写入。但需要注意的是,在主机的写入寄存器可能直接触发SPI中断
由于主机写入SPI0_DATA后会自动触发SPI传输,而一个字节传输完成后,就触发SPI中断了。所以在主机中断函数中,即使最开始对中断标志位清零,但若中断函数中间,主机有对从机的数据操作也可能会置位中断,所以最好在中断函数结尾清零标志位。
SPI通信的认知
SPI一般都是全双工实时通信,所以在发送数据时一般有短暂的停留使得数据稳定读取
整体程序数据运行过程和发送接收方式: