[技术问答]

关N76e003 SPI的速度问题

[复制链接]
2909|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 编辑

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

#define SPI_CLOCK       1

//-----------------------------------------------------------------------------------------------------------
void SPI_Initial(void)
{
    #if   SPI_CLOCK == 0
            clr_SPR1;
            clr_SPR0;
    #elif SPI_CLOCK == 1
            clr_SPR1;
            set_SPR0;
    #elif SPI_CLOCK == 2
            set_SPR1;  
            clr_SPR0;
    #elif SPI_CLOCK == 3
            set_SPR1;
            set_SPR0;
    #endif

    /* /SS General purpose I/O ( No Mode Fault ) */
    set_DISMODF;
    clr_SSOE;
    /* SPI in Master mode */
    set_MSTR;
    /* MSB first */
    clr_LSBFE;
    clr_CPOL;
    clr_CPHA;
    /* Enable SPI function */
    set_SPIEN;
}

//-----------------------------------------------------------------------------------------------------------
void SPI_W_D(char DATA)
{
    SPDR = DATA;
    while((SPSR&0x80)==0x00);
    clr_SPIF;
}

//-----------------------------------------------------------------------------------------------------------
void main(void)
{      

    /* Note
       MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
    */
   
    Set_All_GPIO_Quasi_Mode;
    SPI_Initial();
    while(1){ SPI_W_D(0x55);}
}
//-----------------------------------------------------------------------------------------------------------


时钟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

粉丝