打印
[ZLG-ARM]

如何用spi接收16位数据?

[复制链接]
4281|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zgq0901|  楼主 | 2007-5-18 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zlgARM| | 2007-5-18 20:11 | 只看该作者

zgq0901

您好!
先回答,可以。借鉴IO模拟SPI的思路即可。

先说声抱歉。

能不能麻烦您移步看一下这个链接?并且在本版面搜索一下SPI,不多的,只有几页,但其中有太多的宝贵经验。

谢谢您!


使用特权

评论回复
板凳
zgq0901|  楼主 | 2007-5-21 09:19 | 只看该作者

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

使用特权

评论回复
地板
TRUE_ARM| | 2007-5-21 20:26 | 只看该作者

LPCXX 本身就支持16位传输

认真看一下DATASHEET

使用特权

评论回复
5
zgq0901|  楼主 | 2007-5-22 09:12 | 只看该作者

唉,小弟愚钝还是不懂啊

4楼的兄弟写的也是8位的数据传输吧,我想连续读取16位,到底该怎么办呢?
有知道的人帮忙把程序写一下吧,多谢了,我实在是不会啊

使用特权

评论回复
6
lightrainy| | 2007-5-22 11:19 | 只看该作者

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

使用特权

评论回复
7
caj73| | 2007-5-22 14:17 | 只看该作者

晕倒


1.你管它多少位,反正每次8位读出来再处理就可以了
2.我上面贴的是说明你读的操作就不正确

使用特权

评论回复
8
zgq0901|  楼主 | 2007-5-22 16:39 | 只看该作者

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

抱歉,我的完整的程序是:
S0SPDR=DATA;
while ( !(S0SPSR & SPIF) ){}
*p=S0SPDR;
*(++p)=S0SPDR;
因为返回的数据是16位,所以我用了两次读数据的语句,问题就是两次读的是一样的数据,不知怎样才能得到完整的数据

使用特权

评论回复
9
TRUE_ARM| | 2007-5-22 19:19 | 只看该作者

请看:

初始化:
SPCR  =  (1 << 2) |         // BitEnable
     (0 << 3) |    // CPHA = 0, 数据在SCK 的第一个时钟沿采样
     (0 << 4) |        // CPOL = 0, SCK 为高有效
     (1 << 5) |    // MSTR = 1, SPI 处于主模式
     (0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
     (1 << 7) |// SPIE = 0, SPI 中断被允许
         (0x00<<8);        //11:8 BITS
                                    //0000      16 bits per transfer

中断读取:
WORD Data;
     Data = SPDR;
即是16位的数据。
如果采用8位传输
则分两次:

S0SPDR=DATA;
while ( !(S0SPSR & SPIF) ){}
*p=S0SPDR;

S0SPDR=DATA;
while ( !(S0SPSR & SPIF) ){}
*(++p)=S0SPDR;

使用特权

评论回复
10
foyyof| | 2007-5-22 20:18 | 只看该作者

楼上才是正解:

不要管是读少位,只要时序配置合适(保证多次SPI操作完成外部一个SPI时序!注意分析波形哦),多读几次就多了。

使用特权

评论回复
11
scxdh| | 2013-9-3 22:42 | 只看该作者
8位SPI发二次组成16位时SCK时序接头有延时,因为8位发送必须完成中断标志值1时才能发送第二个字节否则写冲突。发送完成标志出来会延时半个周期。

使用特权

评论回复
12
zhonghw| | 2014-9-25 10:07 | 只看该作者
本帖最后由 zhonghw 于 2014-9-25 10:08 编辑

高8位低8位分开发,你就收了

使用特权

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

本版积分规则

28

主题

52

帖子

0

粉丝