nrf240调试经验

PS:本文仅仅适合毫无基础的同学,可以比较快的理解2401的工作原理,完全是本人个人理解,不敢保证完全正确,欢迎大佬能够指点一下我。另外,本文所贴程序针对stc8。
写2401 就要先懂spi总线,那么什么是spi呢
就好像串口除去电源和地,还有rx和tx用于交换数据,spi有四根线,MOSI,MISO,SCLK,SS。
MOSI(master out slaver in):主机输出,从机输入
MISO(master in slaver out):主机输入,从机输出
SCLK:时钟信号
SS:片选
对于STC8芯片来说,spi主要有三个寄存器需要了解清楚——SPSTAT,SPCTL,SPDAT
在这里插入图片描述
当使用2401时,两块单片机都属于主机(傻傻的我第一次就以为一块单片机是主机,一块是从机),主从是相对于直接和单片机通信的器件来说的。
Spi初始化:
在这里插入图片描述
P_sw1是针对stc8的管脚配置
每个芯片应该都有,之前写stc15的时候是AUXR2寄存器
如果这个没有设置好,很有可能时钟线就不能自动产生时钟信号了。
在用spi的时候,其实不建议用中断,因为他的速度太快了,我就遇到过spi中断影响了我的主程序里的while ,根本没法执行while

初始完成之后,spi模块就能完成数据的传送问题了。
在这里插入图片描述
在网上看到的很多例程都是用模拟io口做的,但是这里我直接用的spi的数据寄存器
当SPDAT数据寄存器收到数据,会在半个到一个时钟周期的时间后,自动产生时钟信号。
有用示波器看波形的同学在看波形的时候千万别点错管脚咯,毕竟MISO和MOSI有点像,我之前看波形的时候就犯过这个错误,怎么改,感觉数据都不对,其实是我管脚点错了,丢死人了,害羞。
不过当单独用这个子函数看spi有没有正确产生时钟发送数据的时候,一定要在开头加上SS管脚的控制,发数据之前先拉低,最后再拉高。这是数据手册里的时序图决定的。
在这里插入图片描述
为什么这里不直接把ss控制直接加进去呢,其实是,这部分子函数知识最最底层的一部分,之后会调用跟这个函数来写配置2401寄存器的函数,此时,需要先写一个地址,在写要赋的值,这个时候要两次调用这个函数,但是,ss控制线只需要拉高一次。
我在调试的时候因为两个指令中间又操作了一次ss线,一直没成功,调试了很久,突然意识到自己的这个错误。

主机配置完之后 就要转战2401的数据手册了。
2401其实呢也是一块芯片,但是我们没有办法直接对他进行读写,因此才需要通过spi对2401的寄存器进行配置。
在这里插入图片描述
这张表其实就是一些地址,通过总线发送地址,再发送数据,就可以对2401寄存器进行配置,其中AAAAA是更加具体的地址,如下表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我拉的比较小,大家可以自行去数据手册里看看每个寄存器具体是做什么的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这部分子函数都是建立在最开始那个spi传输数据的子函数的,也比较容易理解,基本都是先写地址,后写数据的步骤。如果是要读寄存器地址的话,需要先写地址,后写0x00,作为一个滚筒式的寄存器——SPDAT其实在发送一位的时候,MISO就会接收一位,一般情况下这个接收回来的数据是没有用的,等到写0的时候,在传回来的值才是想要的正确数据。
在打完这些基础后,就可以开始大展身手了。
大致要配置收发的地址,当然在这里,收发地址是一致的,至于具体这个地址是怎么定的,我还不是很清楚,我是看了一个例程里的地址直接用的,大家可以试试自己随便定的地址能不能正常使用个。还要设置一些比如是否自动应答呀,频率呀,通道啊……这些其实如果不确定具体要配置哪些,把上面发的表格里的寄存器都配置一遍就行了。

具体调试步骤

1、 我是先看spi有没有配置好,能否自动产生时钟信号,数据发送的是否正确 2、 如果第一步正确了,那么配置寄存器就不会有太大问题了 3、 然后是看2401能否发送数据成功,因为这时候你也不能保证接收部分的程序一定正确,所以要配置成不会自动应答,这样初始化完成后,可以通过在液晶屏上显示发送成功标志位,来确定能否正常发送。(发送成功和接收成功都会有相应的位自动置高,通过&将那一位取出做判断,记得及时写1清0) 4、 如果可以正常发送,再将其改为自动应答模式, 5、 这时候如果没有其他错误,从机应该是能够接受东西了 6、 如果还是不成功,可以看一下地址是否一致。