打印

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

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

写函数由于MOV bit,C需要2周期,没法继续减少

51端口和字节之间要传递位的话必须通过C中转,没法再少了

加上参数传递、call/ret,还是的需要46个机器周期,所长的要传递参数也需要这么多的(46个)

使用特权

评论回复
22
xwj| | 2008-3-3 12:37 | 只看该作者

Re7楼: ucReadData |= 0x01;和ucReadData ++;不知哪个快~~~

当然是ucReadData ++; 更快,单周期即可完成

而ucReadData |= 0x01;最快的实现方式是:
ORL     direct, #data
这是个2周期指令

使用特权

评论回复
23
xwj| | 2008-3-3 12:48 | 只看该作者

Re 古道热肠 15楼贴:根本没必要“用三态门来进行通道切换

你想切换什么呢???


 古道热肠 发表于 2008-3-3 10:05 侃单片机 ←返回版面    

15楼: 回诸位 

回XWJ,提到的单片机用串口工作在移位寄存器的方式模拟SPI发码,如果是单发设备是可以的,比如常见的HC595,就可以通过串口高速移出,但是呢,必须看到SPI是有数据输出,还有数据输入,所以如果要用51单片机串口直接接口SPI器件是需要用三态门来进行发送与接收数据的通道切换的,详见电力出版社的《PC机并行端口编程大全》,内有相关实例图纸。 
 

使用特权

评论回复
24
sz_kd| | 2008-3-3 12:53 | 只看该作者

路过留名

使用特权

评论回复
25
古道热肠|  楼主 | 2008-3-3 13:38 | 只看该作者

XWJ优化的读函数优势明显,SPI读函数擂主XWJ

回XWJ,用串口,移位到SPI设备的输出的和从SPI设备移进的输入都是从P3.0(RXD)引脚进出,而SPI芯片的SI和SO引脚一般是不能直接连接在一起的。(有个别芯片可以连接)
我所说的通道切换是P3.0引脚当作输出引脚时与SPI芯片的SI引脚相连,当作为输入时引脚与SPI芯片的SO引脚连通。
如果串口工作的方式0时有3个引脚关联,则能真正在当SPI总线用了。

使用特权

评论回复
26
古道热肠|  楼主 | 2008-3-3 13:41 | 只看该作者

谁能超过XWJ,请上台出招,最后的擂主有奖

奉上驱动与测试的UV2工程,便于大家自行测试。
相关链接:https://bbs.21ic.com/upfiles/img/20083/200833134035403.rar

使用特权

评论回复
27
甄蔡组合| | 2008-3-3 14:11 | 只看该作者

高人真的很多。学习中

使用特权

评论回复
28
gyt| | 2008-3-3 14:18 | 只看该作者

偷师啦~~~~~~~~~~~~

使用特权

评论回复
29
ayb_ice| | 2008-3-3 14:31 | 只看该作者

SPI一般有速度限制

太快了还要加NOP指令

使用特权

评论回复
30
一朝成名| | 2008-3-3 15:32 | 只看该作者

占个位置,好帖

使用特权

评论回复
31
hotpower| | 2008-3-3 19:39 | 只看该作者

倒塌了~~~倒叙是DNJZ R7,$,正续慢~~~

使用特权

评论回复
32
平常人| | 2008-3-3 22:17 | 只看该作者

提请各位注意一个重要的事实,结果有可能大不一样

首先声明俺对51不熟,所以不敢说下面的办法是否有效,但想给各位提个醒,也许还有很大优化空间。

不知各位注意到了吗?在SD的标准文档中有这样一段话:Both host command and card response are clocked out with the rising edge of the host clock;这就是说数据线(SPI_SI或SPI_SO)的变化可以与时钟线的上升同时进行。

利用这一点,可以在输出数据位时同时拉高时钟线(SPI_CLK),把这两个操作用一条指令完成;也许按照这个思路做,可以省掉一条操作指令,我曾在其它单片机上这样做过,但不知道在51上是否也有效。

使用特权

评论回复
33
NE5532| | 2008-3-3 22:23 | 只看该作者

踢馆来了

把核心函数用汇编写,还有什么问题不?

使用特权

评论回复
34
hotpower| | 2008-3-4 00:06 | 只看该作者

哈哈~~~俺用C也能写出汇编的水平

hotpower 发表于 2005-6-18 0:21:43 侃单片机 ←返回版面    

  2049: unsigned char I2CReadWrite(unsigned char val) 
  2050: { 
  2051: unsigned char i; 
  2052:   ACC = val;//取写入数据 
C:0x18D3    EF       MOV      A,R7
  2053:   for (i = 8; i > 0; i --) {//收发8位数据 
C:0x18D4    7F08     MOV      R7,#0x08
  2054:         SCL = 0;//拉低I2C时钟 
C:0x18D6    C286     CLR      SCL(0x80.6)
  2055:     _rlca_();//左移1位数据(取出1位写入数据) 
C:0x18D8    33       RLC      A
  2056:         SDA = CY;//写入1位I2C数据 
C:0x18D9    9287     MOV      SDA(0x80.7),C
  2057:         _rrca_();//右移1位还原数据 
  2058: //    _nop_();_nop_();_nop_();_nop_();_nop_();//延时4.7uS 
  2059: //如果不追求高速,可在此加入一些总线冲突裁决程序 
  2060: //即SDA=1时,读回若为0则为总线冲突 
C:0x18DB    13       RRC      A
  2061:     SCL = 1;//拉高I2C时钟 
C:0x18DC    D286     SETB     SCL(0x80.6)
  2062:         CY = SDA;//读回1位I2C数据 
C:0x18DE    A287     MOV      C,SDA(0x80.7)
  2063:     _rlca_();//左移最后1位数据 
C:0x18E0    33       RLC      A
  2064:   } 
C:0x18E1    DFF3     DJNZ     R7,C:18D6
  2065:   SCL = 0;//拉低I2C时钟 
C:0x18E3    C286     CLR      SCL(0x80.6)
  2066:   return ACC;//返回读回数据 
C:0x18E5    FF       MOV      R7,A
  2067: } 
C:0x18E6    22       RET      
 
 

相关链接:https://bbs.21ic.com/club/bbs/showEssence.asp?id=6493&page=1

使用特权

评论回复
35
xhtxzxw| | 2008-3-4 01:18 | 只看该作者

嘿嘿

我的代码确实节约了一个机器周期啊!
我最高位是直接读P1读进来的(只要俩周期,你原来的代码要仨周期),虽然其他位B6~B0也一起从P1口上读了(当然是没有意义的),但后面一位一位地换成SPI的数据了。
我换三根线的定义,是为了让变量的最高位与P1口的定义的SI一致。

你原始代码的做法是:B7~B0都用相同的方式输入,各需要6个机器周期

我的办法是:        B7节约了一个机器周期,其他位不变。

好比百米比赛,按照你划定的“跑道”,我确实节约了一个周期,怎么就不算了呢???

至于其他的办法,与你的办法差异太大了,不是一个“跑道”,不评价。

当然了,我的代码仅仅在读入时节约了一个周期。

使用特权

评论回复
36
xwj| | 2008-3-4 02:12 | 只看该作者

C本来就能写出汇编的水平,象我17楼的程序就是个示例

你用汇编也不能再节约一个周期了

使用特权

评论回复
37
古道热肠|  楼主 | 2008-3-4 11:33 | 只看该作者

回35楼xhtxzxw

您提到的读P1节省周期,无法理解,因为原创作品,读取SPI芯片的数据输出,只用了一个周期,是将位数据移入位变量时花费了2个机器周期,最后生成CLK占用2个周期,不服还可举证。XWJ改写的SPI读函数代码是通过缩减串转并的周期,故而速度领先。

使用特权

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

回诸位

回NE5532,你要是能用汇编写出更快的功能函数,I服了You
回“平常人”,您的思路很不错,将两步合作一步走,是个好主意,能否贴出参考代码,便于大家依葫芦画瓢,如果P1口全部用作输出,您的办法也许真能每位节省1机器周期。

使用特权

评论回复
39
xwj| | 2008-3-4 12:36 | 只看该作者

节省不了的,想不出合适的串并转换方法...

使用特权

评论回复
40
hotpower| | 2008-3-4 14:50 | 只看该作者

哈哈~~~选择51本来就是错~~~

使用特权

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

本版积分规则