那是星期六 发表于 2015-4-22 22:10:50

基于DSP2812的端口模拟SPI调试Xl24l01模块

NRF24l01的调试过程与方法小结
心得体会:最近老板给了几块nrf24l01模块我,初次上手难免走了许多的弯路,经过近一周的时间的不断调试,模块之间终于可以相互收发数据了。这样下来终于松了一口气。其间的各种辛苦与艰辛难于言表。上网大致看了一下,网上基于51的调试比较多,但是我们实验室用的是DSP2812,由于nrf24l01是SPI接口,2812上刚好有SPI的接口,这样貌似给使用带来了方便,但是51之类的芯片虽然没有SPI口,但是例程也最多,关于他的讨论比较多。最开始我的想法也比较混乱,想直接用SPI来调试,把底层函数稍微修改了一下,发现并没有结果,这个东西就像一个黑匣子一样,即看不见也摸不着,后来我慢慢改变了思路。既然网上基于IO口模拟的SPI的例程最多,我决定另外走一条路,先用2812的IO口模拟SPI再用自带的SPI口去调试。这样一来我就有了两条可以走的路。
第一条:底层SPI时序用IO口模拟去写。
第二条:底层直接用2812的SPI去操作。
虽然这样一来,路好走了一点,有各类的程序可以参考,但是这样带来最大的一个问题,这也是后来我才发现的,nrf24l01的最大读写速率是有限制的,2812在150M运行时很显然是太大了一点,由于nrf24l01对时序的要求很高,端口的读写速率和时序都有严格的要求,所以我们才看到,在网上一般是15M左右的单片机来模拟IO口,没有谁用150M的DSP来模拟IO口的,当然既然确定了这样的方法后来也发现了问题,我还是继续走下去了。很重要的一点是系统的时钟频率。当然时序的要求也很高,这也就是为什么,网上说这个模块不好调试的原因,既然是调试,当然我们既然是调试,肯定有一个思路和方法。那么方法是什么呢?
开始的时候我是一股脑将发送和接收的程序都写进去,然后啥现象也没有,然后就傻眼了。在网上看了看,于是有了一点思路。
方法是将发送和接收的调试分开来调试,以读取nrf24l01内部的寄存器为手段,先调试发送方,发送方调试没有问题以后,让发送方不断的发送数据,然后再来调试接收方,直到接收方也没有问题,再接着望下面去做。
秉着这样的一个想法,我开始了调试。
发送和接收的源代码如附件,以及一些相关的文件。

陶新成 发表于 2015-6-24 11:19:39

楼主有TMS320F2812的学习资料吗,方便的话传给我一份,刚开始学习

那是星期六 发表于 2015-6-29 22:07:13

我也接触没多久,但是有一本书值得推荐,作为上手还是很有用的,但是书里面还是有些代码错误,要详细学习的话最好看原版的TI的手册。书好像太大传不上来,名字叫手把手教你学DSP,北京航天大学出版社。顾卫钢

steaven2000 发表于 2015-6-30 09:17:28

说了一堆废话。按照nRF24L01的datasheet,SPI通讯时钟最高8MHz。
150MHz的F2812,什么延时都不用也就基本做到8MHz的SPI时钟(难道你的那些if else,set H,setl L的指令能用20个时钟周期处理完?)
再说了,硬件SPI只需要配置一下寄存器就能启动收发,比你模拟SPI来得更简单快捷。

那是星期六 发表于 2015-6-30 09:24:24

steaven2000 发表于 2015-6-30 09:17
说了一堆废话。按照nRF24L01的datasheet,SPI通讯时钟最高8MHz。
150MHz的F2812,什么延时都不用也就基本做 ...

SPI已经调通,要是有时间你可以试试2812的SPI去读写NRF24l01.时序超出你的想象。

steaven2000 发表于 2015-6-30 10:35:56

本帖最后由 steaven2000 于 2015-6-30 11:42 编辑

别瞎扯了,说得好像这玩意比打个飞机还难似的。
nRF24L01 主从组网,1对n通讯,错误检测与重传,故障恢复。。。。需要源码不?

steaven2000 发表于 2015-6-30 10:36:59

那是星期六 发表于 2015-6-30 09:24
SPI已经调通,要是有时间你可以试试2812的SPI去读写NRF24l01.时序超出你的想象。 ...

别瞎扯了,说得好像这玩意比打个飞机还难似的。

nRF24L01 主从组网,1对n通讯,错误检测与重传,故障恢复。。。。需要源码不?

那是星期六 发表于 2015-6-30 11:11:14

steaven2000 发表于 2015-6-30 10:36
别瞎扯了,说得好像这玩意比打个飞机还难似的。

nRF24L01 主从组网,1对n通讯,错误检测与重传,故障恢 ...

我怎么用2812的SPI口时序一直不对,用示波器观察发现读写的时候高电平的数据会保持在下一个上升沿的时候,会影响数值。
但是用430的SPI一点问题都没有,其他的芯片的SPI也没有发现问题。你用的是DSP2812的?关于SPI的部分能否发我看看。谢谢~

那是星期六 发表于 2015-6-30 11:15:23

steaven2000 发表于 2015-6-30 10:35
别瞎扯了,说得好像这玩意比打个飞机还难似的。

nRF24L01 主从组网,1对n通讯,错误检测与重传,故障恢 ...

看你的代码列表,好像是SCI口?你用2812的SPI试试看看,看出不出问题。

steaven2000 发表于 2015-6-30 11:34:38

那是星期六 发表于 2015-6-30 11:11
我怎么用2812的SPI口时序一直不对,用示波器观察发现读写的时候高电平的数据会保持在下一个上升沿的时候 ...

那是因为你的SPI寄存器配置有问题。
PS:SCI口怎么跟nRF24L01通讯?

那是星期六 发表于 2015-6-30 12:17:51

steaven2000 发表于 2015-6-30 11:34
那是因为你的SPI寄存器配置有问题。
PS:SCI口怎么跟nRF24L01通讯?

那就是IO口模拟了,2812的spi调试确实是有问题,不过已经解决了,我将其中的一个口从功能引脚变为普通的IO口
然后强制在想要的时间拉高和拉低就行了:
代码如下:

void InitGpio(void)
{
EALLOW;
   
///设置SPI口外设功能
GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0=0;//选择SPISIMO引脚为功能引脚
GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1=1;//选择SPISOMI引脚为功能引脚
GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2 =1;//选择SPICLK引脚为功能引脚
GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3=0; //选择SPISTE引脚为通用I/O
GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=0;   //F14口接芯片模式控制端CE
GpioMuxRegs.GPEMUX.bit.XINT1_XBIO_GPIOE0=0;//E0口接模块的IRQ脚
GpioMuxRegs.GPFMUX.bit.MCLKXA_GPIOF8=0;//LED2的输出端口为通用的IO
GpioMuxRegs.GPFMUX.bit.MCLKRA_GPIOF9=0;//LED4的输出脚为通用的IO

GpioMuxRegs.GPFDIR.bit.GPIOF3=1; //SCN方向为输出,低电平时选中
GpioMuxRegs.GPFDIR.bit.GPIOF14=1;//CE方向为输出
GpioMuxRegs.GPEDIR.bit.GPIOE0=1;//IRQ的方向为输出
GpioMuxRegs.GPFDIR.bit.GPIOF8=1;//LED2的输出
GpioMuxRegs.GPFDIR.bit.GPIOF9=1;//LED4的输出
GpioMuxRegs.GPFDIR.bit.GPIOF0=1;//将spi的主输出作为普通io口输出
          
EDIS;
}       
/*****************SPI时序函数******************************************/
unchar NRFSPI(unchar data)
{
        unchar i;
        for(i=0;i<8;i++)
        {
                if(data&0x80)
                {
               SpiaRegs.SPITXBUF=0x8000;
               GpioDataRegs.GPFDAT.bit.GPIOF0=1;
               }
                else
                {         
               SpiaRegs.SPITXBUF=0x0000;
         GpioDataRegs.GPFDAT.bit.GPIOF0=0;
                }
                data<<=1;
                while((SpiaRegs.SPISTS.all&0x0040) != 0x0040);
      GpioDataRegs.GPFDAT.bit.GPIOF0=0;
                if(SpiaRegs.SPIRXBUF&0x0001) data|=0x0001;
                //这个函数的高两位的写入是有问题的,在这里用不到所以不深究
        }
    return(data&0x00ff);//返回读出的一个字节
}
希望对于使用2812来调试nrf24l01的有帮助
页: [1]
查看完整版本: 基于DSP2812的端口模拟SPI调试Xl24l01模块