zuotianyou 发表于 2011-5-28 14:26:30

请教大侠们一个关于nrf24L01写buf的问题

我用的是silicon labs的C8051F920,但是最近遇到一个很头疼的问题:
用内部ADC采集8位数据,如果不往nrf24L01的write_buf里面写数据,ADC能工作到200kHz(在线调试数据无丢失)
但是一旦我想把数据通过24L01传输出来,ADC采样10kHz还正常,20k就开始不对,到了目标采样频率60k就已经完全不行了(从寄存器的值来看,ADC采样就不对了)...
为了确定ADC没有问题,我还测试了直接计数器写数据给nrf24L01的buf,每秒10kbyte能收到10kbyte,20kbyte能收到18k,30k能收到25k,60k能收到50k,80k甚至更高,永远停留在63.8kbyte/s,当然,60kbyte估计是无线传输的最高速度率。经过核对,我发现数据是连续的,而且没有延时。
我猜有两种可能:
1.timer速度下降了(其实这个不合理,timer是主动的,理论不被无线影响)
2.写buf的时间太长了,所以回到timer中断的时间被延后

但是我想了一下write_buf这个函数,是通过SPI往nrf24L01里面写数据,理论上不占用时间啊。。。

我的逻辑是这样的:
timer计数产生60kHz中断----每一次中断完成一次ADC---当产生32次ADC的时候,调用write_buf把寄存器的32byte数据写给nrf24L01---继续timer中断ADC

代码如下:
INTERRUPT (ADC_ISR, INTERRUPT_ADC0_EOC)
{

   unsigned int data result1=0;
   unsigned char data result2=0;


   //unsigned long mV;                         // measured voltage in mV
   //static unsigned char sample_count = 0;   

   AD0INT = 0;                               // clear ADC0 conv. complete flag
   
   result1= ADC0;                            // copy ADC0 into result
   result2=(result1>>4);

        if(j<TX_PLOAD_WIDTH)
        {
                txTemp=result2;
                j++;
                       
        }
        else if(j >=TX_PLOAD_WIDTH )
        {       
                j=0;
                nRF24L01_Write_Buf(WR_TX_PLOAD, txTemp, TX_PLOAD_WIDTH);
        }
}

其中TX_PLOAD_WIDTH =31

zuotianyou 发表于 2011-5-28 14:31:47

哦,忘了问大侠,还有什么可能会照成这种现象啊?
每次往nrf24L01的buf写32 byte的数据需要大概多长时间啊?

mybmyb 发表于 2011-5-30 12:12:55

1MS

gogocs 发表于 2011-5-31 08:41:38

回复【2楼】mybmyb
1ms

-----------------------------------------------------------------------

这个不能简单地说是 1ms 吧?

这个要看楼主的单位机与NRF24L01的接口是用的硬件SPI还是模拟SPI。模拟SPI的话,不用说,肯定慢,这时会不会有1ms就要看单片机主频、端口翻转速度、程序代码了;硬件SPI的话,就要看硬件SPI初始化时的速率是多大了。

据我测试,用20Mbps的SPI速率,都是可以通讯的,这时,向nrf24L01的buf写32 byte的数据需要的时间就是:32*8/(20*1000000)=12.8us

mybmyb 发表于 2011-5-31 09:50:37

不好意思,是我的错,不用20MBPS的SPI的速率,会出现问题的,因为NRF24L01最大的SPI速率不超过8M
页: [1]
查看完整版本: 请教大侠们一个关于nrf24L01写buf的问题