打印

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

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

回56楼xhtxzxw

您还不服气,您可以将您的思想改个完整代码试试,您就会发现错误的,好多东西光凭想象是不可靠的。
Hotpower的观点是完美主义,Winds代表实用主义,俺的观点是逐步追求完美。
先实现功能,再做优化。

使用特权

评论回复
62
winloop| | 2008-3-7 12:39 | 只看该作者

软件再优化,能有硬件速度快么

再精简代码,也只是局限于用软件一位一位的模拟发送和接收,思想已经局限于这个框架了。我现在操作SPI接口器件是用CPLD来实现的,单片机用并口向CPLD写一个字节数据后,CPLD依靠晶振给提供的脉冲极快的就把数据发送给接口器件,单片机只需要等待2个NOP就可以写下一个字节数据了,比单片机提供的真正的SPI接口还要快,完全是两种档次的思想,这个问题没什么讨论的价值。

使用特权

评论回复
63
winloop| | 2008-3-7 12:45 | 只看该作者

请问18楼

串口的UART0方式有我做的方式快么

使用特权

评论回复
64
古道热肠|  楼主 | 2008-3-7 17:28 | 只看该作者

哈哈,刚才将P89LV51RD2超频成功

PDF介绍,该芯片在6时钟模式下,最大外频为16M,俺整了个18.432M的晶体,小超一把,嘿嘿,用得蛮好的。俺相信再用上它的硬件SPI,估计能将256KbpS的Mp3播放出来。

使用特权

评论回复
65
xwj| | 2008-3-7 19:23 | 只看该作者

晕,你还非跟51铆上了啊?

使用特权

评论回复
66
xwj| | 2008-3-7 19:31 | 只看该作者

而且,51也有大量比你那个更快跟便宜的啊...

使用特权

评论回复
67
winds| | 2008-3-7 20:48 | 只看该作者

STC的12C5310号称1个时钟周期的

如果不是程序容量不是很大,可以试试看,成本也不高,听说才6块多

使用特权

评论回复
68
skyfighter| | 2008-3-7 22:15 | 只看该作者

很有意义的讨论!

其实,在做技术的过程中,总是有很多的这样的小问题,总是在困扰着我们!
看了一下这个题目,我自己没有想到更好的办法出来!
从对于这些问题的理解,就可以看到人的水平是不同的!

使用特权

评论回复
69
xhtxzxw| | 2008-3-8 00:42 | 只看该作者

嘿嘿

我没有不服气,是你不服气吧?  (因为你的NO.1???)
我当然做了测试,还是不相信的话,你可以要求我发编译过程中形成的反汇编码子。

使用特权

评论回复
70
rasoar| | 2008-3-8 09:26 | 只看该作者

可以选含SPI的片子啊

使用特权

评论回复
71
古道热肠|  楼主 | 2008-3-8 09:47 | 只看该作者

回xhtxzxw,现在的擂主是XWJ,他是No1,请贴汇编代码

最好附上您修改好的uV2工程,让大家给您分析分析。我已上传采用XWJ代码建立的uV2工程,修改和测试很方便,见前述发贴。

使用特权

评论回复
72
l0p0c| | 2008-3-8 10:52 | 只看该作者

简直太厉害了!

我也在做SD卡,但不是MP3,现在也差不多了。我的设计对速度要求不是很高,所以可以读写就行了!
今天在这里向各位学习了!

使用特权

评论回复
73
xhtxzxw| | 2008-3-8 12:10 | 只看该作者

嘿嘿

回71楼,我只看你的代码啊!
我就那点能耐,就省了一个机器周期,呵呵
我的UV工程和你的UV工程就差那一句,以及P1.5,P1.7定义对调。

使用特权

评论回复
74
xhtxzxw| | 2008-3-8 12:38 | 只看该作者

嘿嘿

XWJ读函数好!
不过同理,可以节约一个机器周期。XWJ已经在代码里给出注释了。

使用特权

评论回复
75
americ| | 2008-3-8 20:50 | 只看该作者

位寻址,展开8bit循环!

直接操作一个完整字节,才是软件模拟最快的方法=======单刀直入。




使用特权

评论回复
76
wjc3k| | 2008-3-9 00:07 | 只看该作者

凑个热闹,贴下我的代码,很久前的了。读写合一。IAR 8051

uchar MMC_SPI(data uchar cmd)
{
  data uchar i,j=0;
  //ACC=0;
  for (i = 8; i > 0; i --)
  {
     j<<=1;
     MMC_SCK=0;
     j |= MMC_DO;
     MMC_DI = (cmd & 0x80)==0x80;
     //MMC_DI = cmd >> 7;
     MMC_SCK=1;
     cmd<<=1;
  }
  //MMC_SCK=1;
  return(j);
}

    uchar MMC_SPI(data uchar cmd)
; 15.    {
MMC_SPI:
; 16.      data uchar i,j=0;
; 17.      //ACC=0;
; 18.      for (i = 8; i > 0; i --)
    MOV    $LOCBD MMC_SPI+1,#0
    MOV    $LOCBD MMC_SPI,#8
    MOV    $LOCBD MMC_SPI+2,R4
?0001:
    MOV    A,$LOCBD MMC_SPI
    JZ    ?0000
?0002:
; 19.      {
; 20.         j<<=1;
    MOV    A,$LOCBD MMC_SPI+1
    ADD    A,ACC
    MOV    $LOCBD MMC_SPI+1,A
; 21.         MMC_SCK=0;
    CLR    232.1
; 22.         j |= MMC_DO;
    CLR    A
    MOV    C,232.0
    MOV    ACC.0,C
    ORL    $LOCBD MMC_SPI+1,A
; 23.         MMC_DI = (cmd & 0x80)==0x80;
    MOV    A,$LOCBD MMC_SPI+2
    ANL    A,#128
    XRL    A,#128
    JZ    ?0031
    MOV    A,#255
?0031:
    INC    A
    MOV    C,ACC.0
    MOV    232.2,C
; 24.         //MMC_DI = cmd >> 7;
; 25.         MMC_SCK=1;
    SETB    232.1
; 26.         cmd<<=1;
    MOV    A,$LOCBD MMC_SPI+2
    ADD    A,ACC
    MOV    $LOCBD MMC_SPI+2,A
    DEC    $LOCBD MMC_SPI
    SJMP    ?0001
?0000:
; 27.      }
; 28.      //MMC_SCK=1;
; 29.      return(j);
    MOV    R4,$LOCBD MMC_SPI+1
; 30.    }

使用特权

评论回复
77
古道热肠|  楼主 | 2008-3-9 10:50 | 只看该作者

哈哈,楼上的这C代码也很经典呀

最接近硬件SPI的特性,只是俺的应用是分开的,读数据时,不管写入什么东西,写数据时,不管返回的数据。

使用特权

评论回复
78
hotpower| | 2008-3-10 23:22 | 只看该作者

76楼j=0;是废话...还有为什么没生成djnz ...

使用特权

评论回复
79
古道热肠|  楼主 | 2008-3-11 10:20 | 只看该作者

哈哈,俺非常认同Hotpower的循环写法

因为其生成的DJNZ汇编指令循环模式是很不错的。

使用特权

评论回复
80
wjc3k| | 2008-3-11 10:54 | 只看该作者

j=0是费话哈。

IAR的编译器喜欢预分配一个堆,局部变量一般都在堆里分配,较少用到寄存器。不过IAR文件越大优化效果越明显,而且不出错,KEIL C51在编译超过20多K后8~9级优化便容易出一些问题。表现形式是液晶上显示的字符乱码(同样的代码低优化级别正常)

使用特权

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

本版积分规则