[技术问答] 关N76e003 SPI的速度问题

[复制链接]
3565|17
 楼主| wzt19910506 发表于 2018-6-21 17:56 | 显示全部楼层 |阅读模式
要操作nrf24l01 ,就用了n76e003的内部spi。程序调试完了,发现24l01发送一包数据太慢了,最后深入进去看才发现是spi的问题

单片机spi配置成速度为4m,这个没问题,我用逻辑分析仪观察了spi的clock确实有4m,如下图所示
710085b2b74d8bee7b.png

那么问题出在哪呢,出在发送两个byte之间的时间间隔:
249105b2b75203ab44.png

竟然需要300多个us。
我测试的程序就很简单:在while里面通过spi不停的发送一个byte,发送函数也是用的官方例子的。
288725b2b755eb074e.png

10635b2b7584075a7.png


这么测试看来,我只能怀疑这个是硬伤了,这个spi发送两个byte时间间隔太久了,导致nrf24l01操作也慢的很,发送一包数据要10ms。如果其他人发现是我代码问题欢迎提出来我去改进测试。要么我只能认为这芯片的spi不行了

565315b2b758621766.png
huangcunxiake 发表于 2018-6-21 19:23 | 显示全部楼层
把子函数里的延时去掉试试
yiyigirl2014 发表于 2018-6-21 20:17 | 显示全部楼层
是因为用了这么多调用导致的,你要重新写个函数。
yiyigirl2014 发表于 2018-6-21 20:17 | 显示全部楼层
比如你去掉那个延时,可以提高几十us
yiyigirl2014 发表于 2018-6-21 20:18 | 显示全部楼层
你这个发送完后还要返回,如果想快这些都可以去掉。
 楼主| wzt19910506 发表于 2018-6-21 21:01 | 显示全部楼层
huangcunxiake 发表于 2018-6-21 19:23
把子函数里的延时去掉试试

10us延时我去掉试过,去掉之后还是会在300us以上
 楼主| wzt19910506 发表于 2018-6-21 21:02 | 显示全部楼层
yiyigirl2014 发表于 2018-6-21 20:17
比如你去掉那个延时,可以提高几十us

延时的我去掉过,但是标志位判断的就不能去了,去了就没办法保证传输的可靠性
yiyigirl2014 发表于 2018-6-21 21:27 | 显示全部楼层
后面那个if和return也去掉
 楼主| wzt19910506 发表于 2018-6-22 09:16 | 显示全部楼层
yiyigirl2014 发表于 2018-6-21 21:27
后面那个if和return也去掉

if 和return 都是按顺序执行下来不会耗时的,能耗时的肯定是while等待标志位那个地方,但是这个又不能去掉
tianxj01 发表于 2018-6-22 16:03 | 显示全部楼层
本帖最后由 tianxj01 于 2018-6-22 16:10 编辑

没问题啊。看下面程序
  1. #include "N76E003.h"
  2. #include "SFR_Macro.h"
  3. #include "Function_define.h"
  4. #include "Common.h"
  5. #include "Delay.h"

  6. #define SPI_CLOCK       1

  7. //-----------------------------------------------------------------------------------------------------------
  8. void SPI_Initial(void)
  9. {
  10.     #if   SPI_CLOCK == 0
  11.             clr_SPR1;
  12.             clr_SPR0;
  13.     #elif SPI_CLOCK == 1
  14.             clr_SPR1;
  15.             set_SPR0;
  16.     #elif SPI_CLOCK == 2
  17.             set_SPR1;  
  18.             clr_SPR0;
  19.     #elif SPI_CLOCK == 3
  20.             set_SPR1;
  21.             set_SPR0;
  22.     #endif

  23.     /* /SS General purpose I/O ( No Mode Fault ) */
  24.     set_DISMODF;
  25.     clr_SSOE;
  26.     /* SPI in Master mode */
  27.     set_MSTR;
  28.     /* MSB first */
  29.     clr_LSBFE;
  30.     clr_CPOL;
  31.     clr_CPHA;
  32.     /* Enable SPI function */
  33.     set_SPIEN;
  34. }

  35. //-----------------------------------------------------------------------------------------------------------
  36. void SPI_W_D(char DATA)
  37. {
  38.     SPDR = DATA;
  39.     while((SPSR&0x80)==0x00);
  40.     clr_SPIF;
  41. }

  42. //-----------------------------------------------------------------------------------------------------------
  43. void main(void)
  44. {      

  45.     /* Note
  46.        MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
  47.     */
  48.    
  49.     Set_All_GPIO_Quasi_Mode;
  50.     SPI_Initial();
  51.     while(1){ SPI_W_D(0x55);}
  52. }
  53. //-----------------------------------------------------------------------------------------------------------


时钟4MHz,重复间隔大概2us多点。 123321.jpg
jekey 发表于 2018-6-22 20:45 | 显示全部楼层

在16MHz,操作spi,字符间隔2us左右。
遇到过标定频率到16.6MHz后,SPI无法操作的问题,有人帮助验证下这个问题吗?


void MODIFY_HIRC_16600(void)
{
        unsigned char hircmap0,hircmap1;
        unsigned int        trimvalue16bit;

        set_IAPEN;
        IAPAL = 0x30;
        IAPAH = 0x00;
        IAPCN = READ_UID;
        set_IAPGO;
        hircmap0 = IAPFD;
        IAPAL = 0x31;
        IAPAH = 0x00;
        set_IAPGO;
        hircmap1 = IAPFD;
        clr_IAPEN;
        hircmap1 = hircmap1 & 0x01;
        trimvalue16bit = ((hircmap0 << 1) + (hircmap1 & 0x01));
        trimvalue16bit = trimvalue16bit - 15;
        //trimvalue16bit = trimvalue16bit - 13;
        hircmap1 = trimvalue16bit & 0x01;
        hircmap0 = trimvalue16bit >> 1;
        set_SFRPAGE;
        TA = 0XAA;
        TA = 0X55;
        RCTRIM0 = hircmap0;
        TA = 0XAA;
        TA = 0X55;
        RCTRIM1 = hircmap1;
}
beyond696 发表于 2018-6-23 17:27 | 显示全部楼层
没有DMA就是不爽,有DMA可以做到字节间完全没延时....
dongliushui 发表于 2018-6-23 23:36 来自手机 | 显示全部楼层
一个51单片机,你要求也太高了。你看看其他51有这配置没,已经可以了
 楼主| wzt19910506 发表于 2018-6-25 21:26 | 显示全部楼层
tianxj01 发表于 2018-6-22 16:03
没问题啊。看下面程序

多谢多谢,到时候我再对照下看看我的代码是不是哪里还有问题
wangshujun 发表于 2018-7-13 19:05 | 显示全部楼层
首先去掉延时,然后更改成发送前判断是否发送完,上一个数字发送完,启动当前发送
开机先发一个不影响外设的数据,确保发送完置位
即使这样也要几个时钟周期的间隔的,但是应该在1us之内了
598330983 发表于 2018-7-15 16:37 | 显示全部楼层
呵呵,速度在那摆着。
dongnanxibei 发表于 2018-7-15 19:54 | 显示全部楼层
截图是什么软件搞的
wangshujun 发表于 2018-7-16 13:32 | 显示全部楼层
不要小瞧1t51的处理速度的,这种处理速度算是很快了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

134

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部