[ZLG-ARM] 如何用spi接收16位数据?

[复制链接]
 楼主| zgq0901 发表于 2007-5-18 17:38 | 显示全部楼层 |阅读模式
我用的是lpc2106,其中的S0SPDR是8位的,可我要接收的数据是16位的,我用了两句读S0SPDR的语句,*P=S0SPDR;  *(++P)=S0SPDR;  P是指向数组的指针,可两句得到的值是一样的,请问要怎样才能得到完整的16位数据呢?高手解救啊!
zlgARM 发表于 2007-5-18 20:11 | 显示全部楼层

zgq0901

您好!<br />先回答,可以。借鉴IO模拟SPI的思路即可。<br /><br />先说声抱歉。<br /><br />能不能麻烦您移步看一下这个链接?并且在本版面搜索一下SPI,不多的,只有几页,但其中有太多的宝贵经验。<br /><br />谢谢您!<br /><br /><br />
 楼主| zgq0901 发表于 2007-5-21 09:19 | 显示全部楼层

抱歉,我没有找到相关的例子,可否给个例子呢,谢谢

  
TRUE_ARM 发表于 2007-5-21 20:26 | 显示全部楼层

LPCXX 本身就支持16位传输

认真看一下DATASHEET
 楼主| zgq0901 发表于 2007-5-22 09:12 | 显示全部楼层

唉,小弟愚钝还是不懂啊

4楼的兄弟写的也是8位的数据传输吧,我想连续读取16位,到底该怎么办呢?<br />有知道的人帮忙把程序写一下吧,多谢了,我实在是不会啊
lightrainy 发表于 2007-5-22 11:19 | 显示全部楼层

SPI是8位串行总线,那儿来的16位数据????

  
caj73 发表于 2007-5-22 14:17 | 显示全部楼层

晕倒

<br />1.你管它多少位,反正每次8位读出来再处理就可以了<br />2.我上面贴的是说明你读的操作就不正确
 楼主| zgq0901 发表于 2007-5-22 16:39 | 显示全部楼层

抱歉,我的完整的程序如下

抱歉,我的完整的程序是:<br />S0SPDR=DATA;<br />while&nbsp;(&nbsp;!(S0SPSR&nbsp;&&nbsp;SPIF)&nbsp;){}<br />*p=S0SPDR;<br />*(++p)=S0SPDR;<br />因为返回的数据是16位,所以我用了两次读数据的语句,问题就是两次读的是一样的数据,不知怎样才能得到完整的数据
TRUE_ARM 发表于 2007-5-22 19:19 | 显示全部楼层

请看:

初始化:<br />SPCR&nbsp;&nbsp;=&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;2)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;BitEnable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;3)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPHA&nbsp;=&nbsp;0,&nbsp;数据在SCK&nbsp;的第一个时钟沿采样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;4)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPOL&nbsp;=&nbsp;0,&nbsp;SCK&nbsp;为高有效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;MSTR&nbsp;=&nbsp;1,&nbsp;SPI&nbsp;处于主模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;6)&nbsp;|&nbsp;//&nbsp;LSBF&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;数据传输MSB&nbsp;(位7)在先<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;7)&nbsp;|//&nbsp;SPIE&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;中断被允许<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x00&lt&lt8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//11:8&nbsp;BITS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;bits&nbsp;per&nbsp;transfer<br /><br />中断读取:<br />WORD&nbsp;Data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data&nbsp;=&nbsp;SPDR;<br />即是16位的数据。<br />如果采用8位传输<br />则分两次:<br /><br />S0SPDR=DATA;<br />while&nbsp;(&nbsp;!(S0SPSR&nbsp;&&nbsp;SPIF)&nbsp;){}<br />*p=S0SPDR;<br /><br />S0SPDR=DATA;<br />while&nbsp;(&nbsp;!(S0SPSR&nbsp;&&nbsp;SPIF)&nbsp;){}<br />*(++p)=S0SPDR;<br />
foyyof 发表于 2007-5-22 20:18 | 显示全部楼层

楼上才是正解:

不要管是读少位,只要时序配置合适(保证多次SPI操作完成外部一个SPI时序!注意分析波形哦),多读几次就多了。
scxdh 发表于 2013-9-3 22:42 | 显示全部楼层
8位SPI发二次组成16位时SCK时序接头有延时,因为8位发送必须完成中断标志值1时才能发送第二个字节否则写冲突。发送完成标志出来会延时半个周期。
zhonghw 发表于 2014-9-25 10:07 | 显示全部楼层
本帖最后由 zhonghw 于 2014-9-25 10:08 编辑

高8位低8位分开发,你就收了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

52

帖子

0

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