|
我用的是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[j]=result2;
j++;
}
else if(j >=TX_PLOAD_WIDTH )
{
j=0;
nRF24L01_Write_Buf(WR_TX_PLOAD, txTemp, TX_PLOAD_WIDTH);
}
}
其中TX_PLOAD_WIDTH =31 |
|