OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2868|回复: 10

三线SPI接收数据的疑问

[复制链接]

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
发表于 2018-9-1 11:46:50 | 显示全部楼层 |阅读模式
5金钱
                                                                                                                   三线SPI 的一些疑问点
1、我现在用了一款传感器,它是用I2C进行控制以及发送命令的,SPI进行数据的传输。


2、SPI:我看了芯片手册显示的是用三线 SPI 的方式, CS SCK  MISO
      The MOSI (Master Out/Slave In) signal is not currently employed and should be grounded,
      The protocol is packet-based with no embedded timing signals and no requirement for flow control.
     就是说CPU作为主机的时候,只是进行数据的接收,发送的那一根线接地了。数据是以包的形式发送的。   




  疑惑点:
   这跟数据线只是作为接收,我从数据寄存器取出来接收回来的值,还是说他是同时作为收发的一条线。因为SPI 的接收和发送是同时发生的,所以我是不是在接收的时候需要发一个0x00过去,因为现在传感器没有买回来,所以没法验证,提前请教一下这个问题,三线SPI的协议需要注意些什么事项。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-9-1 12:55:06 | 显示全部楼层
SPI是三线双工的,有主从控制的,一般由主提供时钟,从机以时钟的节拍进行数据收发。
收发各用一根线,不是收发复用的。如果只须单工,就可以减少一根线。
你这种情况应该是只用MISO和时钟,MISO从名称上看很清楚,就是主收从发,你的这个传感器只能通过SPI单身传输数据给CPU,无法通过SPI接收任何命令和控制的。
如果需要从CPU接收命令和控制,很可能是通过你说的I2C进行。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-1 13:01:48 | 显示全部楼层
SPI通讯你可以使用STM32自带的外设,只要设置模式正确就没多大问题,如果是自己模拟spi要注意时序,时序非常重要。
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-1 13:09:44 | 显示全部楼层
传感器的输出接单片机输入就行,你是由IIC发送给传感器命令,这个方式我也没用过,但是如果只是读传感器寄存器值的话应该是可以的,因为发送线主要是发送命令或地址
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-1 22:12:01 | 显示全部楼层
三跟四线都没啥区别,接收时都要发送数据来产生时钟信号,SPI是全双工的,没什么好担心的。
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-9-3 08:40:53 | 显示全部楼层
ufbycd 发表于 2018-9-1 22:12
三跟四线都没啥区别,接收时都要发送数据来产生时钟信号,SPI是全双工的,没什么好担心的。

我都没有发送的那根线了,我怎么发送数据,我只有MISO那根线用于接收,
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-9-3 08:43:24 | 显示全部楼层
warship 发表于 2018-9-1 12:55
SPI是三线双工的,有主从控制的,一般由主提供时钟,从机以时钟的节拍进行数据收发。
收发各用一根线,不 ...

只有一根MISO线,是意味着收发都用这根线,还是说这根线只用来主接收从发送,主机就不能发送
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-9-3 10:19:50 | 显示全部楼层
warship 发表于 2018-9-1 12:55
SPI是三线双工的,有主从控制的,一般由主提供时钟,从机以时钟的节拍进行数据收发。
收发各用一根线,不 ...

我传感器的数据是按包发送的,每包164字节,我SPI参数定义的时候是按照16位传输,
我要一次性接收一个包,
void SPI_ReceivePack(uint8_t *pData, uint16_t Size)
{
        while(Size)   //size=82|164???
        {
                if(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE))
                {
                        *((uint16_t*)pData) = SPI_I2S_ReceiveData(SPI1);
                        pData += sizeof(uint16_t);
      Size--;
                }
        }
}
我这个size大小应该是82还是164呢,我觉得应该是82,但是又不太确定
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2018-9-3 17:14:06 | 显示全部楼层
I2C发,SPI收吧,所以SPI不需要MOSI这条线了
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-9-3 18:04:38 | 显示全部楼层
本帖最后由 warship 于 2018-9-3 22:02 编辑
关山难越 发表于 2018-9-3 08:43
只有一根MISO线,是意味着收发都用这根线,还是说这根线只用来主接收从发送,主机就不能发送

我说的已经够清楚的了,
只用一根,无法双工。
你的这个传感器只能通过SPI单向传输数据给CPU,无法通过SPI接收任何命令和控制的。这句话不可理解吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-3 21:35:36 | 显示全部楼层
本帖最后由 ufbycd 于 2018-9-3 21:37 编辑
关山难越 发表于 2018-9-3 08:40
我都没有发送的那根线了,我怎么发送数据,我只有MISO那根线用于接收,

醉翁之意不在酒!发送数据不是真的为了发,而是为了产生时钟信号。当然,这样做的前提是用硬件SPI;如果是用IO模拟时序,直接用IO发出时钟信号即可!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 03:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表