打印

软件模拟SPI总线读写,速度No.1,请高手打檑台

[复制链接]
楼主: 古道热肠
手机看帖
扫描二维码
随时随地手机跟帖
41
ayb_ice| | 2008-3-4 14:53 | 只看该作者 回帖奖励 |倒序浏览

我也来现丑了

/*
//----------------标准C语言版-----------------------------------------
//可移植性好,易读,易移植
uint8 SD_SPI_ReadByte(void)
{
    uchar ucReadData;
    uchar ucCount;

    ucReadData = 0;
    Macro_Set_SI_High();

    ucCount = 8;
    do{
        ucReadData <<= 1;
        Macro_Set_CLK_Low();

        Macro_Set_CLK_High();
    
        if(c_SPI_SO)
        {
            ucReadData++;
        }
    }while(--ucCount);

    return(ucReadData);
}

void SD_SPI_WriteByte(uint8 ucSendData)  
{   
    uchar ucCount;
    uchar ucMaskCode;

    ucCount = 8;
    do{
        Macro_Set_CLK_Low();

        Macro_Set_SI_Low();
        if(ucSendData & 0x01)
        {
            Macro_Set_SI_High();
        }
        Macro_Set_CLK_High();
        ucSendData >>= 1;
    }while(--ucCount);
}

使用特权

评论回复
42
xwj| | 2008-3-4 15:51 | 只看该作者

ayb_ice,怎么一个左移 一个右移啊???

抄也不是这样抄的吧???

使用特权

评论回复
43
ayb_ice| | 2008-3-4 17:07 | 只看该作者

回xwj

主要是基本方法,过程并不重要...
其实是这个上网电脑没有装UE32软件,用的写字板,修改不方便...

使用特权

评论回复
44
jjg| | 2008-3-5 22:09 | 只看该作者

将晶振速度加倍,就可以了。

使用特权

评论回复
45
xhtxzxw| | 2008-3-6 00:01 | 只看该作者

嘿嘿

回37楼
以下是你的原始代码:请看我加的注释
//Bit7 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    ReadData_Bit7 = c_SPI_SO;   //这个编译以后成了对应于 MOV C, c_SPI_SO以及MOV ReadData_Bit7, C两条汇编指令的机器码吧?需要1+2=3个周期

以下是改过的
//Bit7 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();//已经将P1^5和P1^7的定义对调,到此,最高位出现在P1^7上
    ucReadData = P1;     //这个编译以后成了对应于MOV ucReadData,P1一条汇编指令的机器码吧?只需要2个周期。注意:我把P1的整个一个byte读进来了,当然P1^7也读进来了,而且就读到了ucReadData的最高位上也就是读到了ReadData_Bit7里(读进来的其它位当然没有意义,后面还是要一位一位补上的)!
怎么没有道理呢?

使用特权

评论回复
46
hunter008| | 2008-3-6 08:54 | 只看该作者

使用特权

评论回复
47
she828| | 2008-3-6 09:13 | 只看该作者

大虾们给点建议

看了楼上这些大虾的一番番激论﹐心里真是贼佩服﹗﹗
同时心有感慨﹐什么时候自己才能够参与这样的话题。。。。N年以后﹗﹗
我刚开始学汇编﹐用的是义隆E8-ICE。。。想让大虾们给点建议…..
学义隆用没有发展﹖前景好吗﹖﹖

使用特权

评论回复
48
winloop| | 2008-3-6 10:28 | 只看该作者

软件模拟SPI这么古老的技术了还有什么讨论价值么

都是学生时代玩的东西

使用特权

评论回复
49
xwj| | 2008-3-6 10:36 | 只看该作者

winloop,这个贴真正讨论的是软件的极限优化,

看看你的所谓的“精华”贴,那才真正的是学生做的程序

如果你的产品只能做到这种水平的话,估计是没几个人敢买的...

相关链接:https://bbs.21ic.com/club/bbs/showEssence.asp?id=2636

使用特权

评论回复
50
古道热肠|  楼主 | 2008-3-6 12:11 | 只看该作者

回45楼xhtxzxw

 您将P1口的数据读到ucReadData,这是能节省一个周期,但ucReadData还不是最终的结果,即使将最高位移位到D6位,为下一次读做准备,况且下一次读又会改变ucReadData的内容,所以局部节省不代表整个函数节省。

使用特权

评论回复
51
sz_kd| | 2008-3-6 12:25 | 只看该作者

呵呵,个人意见,产品中的程序只要容错性好和功能正确就可以

貌似很多高手和考官爱那他的好算法来贬低人.

卖出去的产品人家不会看你怎么写的程序~~~~~~~~~~

使用特权

评论回复
52
古道热肠|  楼主 | 2008-3-6 12:27 | 只看该作者

回48楼WinLoop

说软件模拟SPI没有意义,此言差矣。SPI的扩展芯片极为常见,以其高速通讯和连线简化,大有取代传统并行总线接口器件之势。
很多单片机没有硬件SPI接口,软件摸拟提高速度是有好处的。比如传统字库用并行Flash29C020,改用AT45DB161后,读取字库不优化,效果很不理想。
又比如LCD屏幕,很多小屏采用了SPi接口,如果驱动函数不做优化,整屏更新数据会明显的停顿感,更不要说做绘图设计了。

使用特权

评论回复
53
winds| | 2008-3-6 15:11 | 只看该作者

xwj的方法是并转串的最快做法,虽然在其他平台上无法实现

但是这种方法在51上是最快的方法了,也是KeilC预留的一个经典方法,相关的头文件如下
#define _setc_()          CY   = 1
#define _clrc_()          CY   = 0
#define _setb_(RBIT)      RBIT = 1
#define _clrb_(RBIT)      RBIT = 0
#define _clra_()          ACC  = 0
#define _movcb_(RBIT)     CY   = RBIT
#define _movbc_(RBIT)     RBIT = CY
#define _movra_(RX)       RX   = ACC
#define _movar_(RX)       ACC  = RX
#define _movb0_(RBIT, RX) RBIT = RX & 0x01  //用于取RX的最低位
#define _movb7_(RBIT, RX) RBIT = RX & 0x80  //用于取RX的最高位
#define _rrca_()          CY   = ACC & 0x01 //产生RRC A指令
#define _rlca_()          CY   = ACC & 0x80 //产生RLC A指令
#define _rrcar_(RX)       CY   = RX  & 0x01
#define _rlcar_(RX)       CY   = RX  & 0x80
#define _xorr_(RX)        RX  ^= RX         //用于取奇偶位P,且RX=0
#define _andr_(RX)        RX  &= RX         //用于取奇偶位P,且RX=不变
#define _orr_(RX)         RX  |= RX         //用于取奇偶位P,且RX=不变
#define _notr_(RX)        RX   =~RX

使用特权

评论回复
54
hotpower| | 2008-3-6 15:24 | 只看该作者

现在有很多51带SPI了

使用特权

评论回复
55
NE5532| | 2008-3-6 20:52 | 只看该作者

51算写得快的了

因为位操作可以用MOVE指令,要是PIC可以把你急死。菜农的C语言精简到差不多了,要更快,何必用软口了呢?

使用特权

评论回复
56
xhtxzxw| | 2008-3-6 20:59 | 只看该作者

嘿嘿

回50楼
咋就局部节省不等于整体节省了呢?我改过以后,别的地方并没有动,也就没有在别的地方多用机器周期。我改过的函数你调用一次就是比原来的少用了一个机器周期的,难道不是吗?那你说说,改了以后,用多少个机器周期?
我的局部难道影响整体了吗?

我只是在取D7位的时候节省了一个周期,其它的位还是原始代码,原始代码效率确实是很高了,我没指望节省多的机器周期,一个,就一个,也是省了。

使用特权

评论回复
57
xhtxzxw| | 2008-3-6 21:17 | 只看该作者

嘿嘿

再更正一下50楼的说法
是最高位D7,不是D6,注意我把P1.5和P1.7的定义对调了,就是为了取D7的时候少用一个机器周期。 

使用特权

评论回复
58
hotpower| | 2008-3-6 21:37 | 只看该作者

实际上让俺设计就首选AVR/ARM/PIC/...但绝不会是51~~~

即使有SPI...因为它的地基不好~~~铺金也白搭~~~

使用特权

评论回复
59
winds| | 2008-3-6 22:30 | 只看该作者

回楼上,还是钱的问题和继承性的问题

现在8块以内的Arm有吗?象一些简单应用,还是用51比较好,简单易用,很多底层代码可以网络上下载。
另外,除非你是个刚开门的公司,否则如果原来的产品是51做的,那么你的产品必然有一定的继承性,或者叫兼容性,并不是说Arm好用,就可以把一个公司里面所有的东西重新开发一遍,你想,所有的硬件驱动代码要重新写工作量就很可怕,就算能够重新开发,售后服务怎么做。你的客户会怎么想,硬件只是一个平台,能表达你的设计思想,够用就可以了。难道你出门上班,有部夏利的士过来,你就是不坐,非帕萨特的士不可吗?
呵呵。。别介意。。不是对你的攻击,对你的观点的一种不同意的表达

使用特权

评论回复
60
yqblog| | 2008-3-7 09:15 | 只看该作者

记号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则