OpenEdv-开源电子网

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

SPI通信求助,谢谢。

[复制链接]

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
发表于 2016-6-2 15:56:28 | 显示全部楼层 |阅读模式
10金钱
我现在SPI通信不正常,不能够发一个数,我就能再收到我发的这个数,
我测试了下引脚的波形,这个是MISO引脚的波形
出现这样的波形,一般是什么原因引起的呢?
另外,求教,SPI通信设置,应该注意的地方,谢谢。 QQ截图20160602154624.png

最佳答案

查看完整内容[请看2#楼]

一般情况下,SPI由片选CS、时钟SCK、MOSI、MISO组成。建议1、先看CS和SCK是否对应上了,看你从机的时序图,这里需要注意的是从机SPI模式的选择,模式如果不明白你就百度吧; 建议2、片选CS、SCK、MOSI同时看,比对一下SCK与MOSI的写时序是否对应上了,再看一下SCK与MISO的时序是否对应上了; 建议3、从硬件角度而言,SPI外围电路很简单,片选CS、时钟SCK最好上拉电阻拉一下,MOSI和MISO看情况吧,可拉可不拉,我调试过程中一般不 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2016-6-2 15:56:29 | 显示全部楼层
本帖最后由 zhang164534 于 2016-6-5 15:01 编辑

一般情况下,SPI由片选CS、时钟SCK、MOSI、MISO组成。建议1、先看CS和SCK是否对应上了,看你从机的时序图,这里需要注意的是从机SPI模式的选择,模式如果不明白你就百度吧;
建议2、片选CS、SCK、MOSI同时看,比对一下SCK与MOSI的写时序是否对应上了,再看一下SCK与MISO的时序是否对应上了;
建议3、从硬件角度而言,SPI外围电路很简单,片选CS、时钟SCK最好上拉电阻拉一下,MOSI和MISO看情况吧,可拉可不拉,我调试过程中一般不拉也不要紧;
建议4、主机与从机的接口电平需要对得上,比如说同为3.3V 或同为5.5V;
建议5、以上都确认了之后,一般建议将写和读两个功能分开调试,可以先试着读芯片ID,如果可以读到,恭喜你,你成功了!!!

按照以上5步完全可以调试通SPI接口了,百试不爽。

回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11545
金钱
11545
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-6-2 16:10:52 | 显示全部楼层

查mosi、miso,要和sck配合来看。

这情况像是硬件问题。


回复

使用道具 举报

29

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2012-6-15
在线时间
161 小时
发表于 2016-6-2 16:30:28 | 显示全部楼层
试一下更改引脚配置
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-2 16:53:19 | 显示全部楼层
要一步步来,先把简单的主从收发一次数据调通么,时钟正常吗?
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-6-2 17:07:26 | 显示全部楼层
是主机不好使还是从机不好使?
不能发任意的数,但是可以把收到的数发走,从这个描述来看你调试的是从机吧?
那你的从机是MCU还是数字IC?是用自带的接口还是自己设计的SPI时序?
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
 楼主| 发表于 2016-6-3 09:17:44 | 显示全部楼层
本帖最后由 滴丶滴 于 2016-6-3 09:19 编辑
xianshasaman 发表于 2016-6-2 17:07
是主机不好使还是从机不好使?
不能发任意的数,但是可以把收到的数发走,从这个描述来看你调试的是从机吧 ...

我是想用STM32驱动外接的ADC  AD7708
我按照7708的手册编写程序之后,发现不能接收数据。
我就想看看,我的SPI通讯是不是对的,有没有我发一个数据给7708  他就真的收到我发的这个数据。
所以我就 按照如下思路:
1我想AD7708的communication寄存器写入一个十六进制数  表明下次操作,我是要向某个寄存器写数据。  
2 我向某个寄存器写入了数据
3 我向communication寄存器写入16进制数  下次我是读取刚才写入数据的寄存器的值
4我调用  SPI_I2S_ReceiveDta
发现我读取的值是FF之类的  并不是我第二步写入的值
我就想看下波形,得到是RT的波形。
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
 楼主| 发表于 2016-6-3 11:31:08 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-6-2 16:53
要一步步来,先把简单的主从收发一次数据调通么,时钟正常吗?

我是想用STM32驱动外接的ADC  AD7708
我按照7708的手册编写程序之后,发现不能接收数据。
我就想看看,我的SPI通讯是不是对的,有没有我发一个数据给7708  他就真的收到我发的这个数据。
所以我就 按照如下思路:
1我想AD7708的communication寄存器写入一个十六进制数  表明下次操作,我是要向某个寄存器写数据。  
2 我向某个寄存器写入了数据
3 我向communication寄存器写入16进制数  下次我是读取刚才写入数据的寄存器的值
4我调用  SPI_I2S_ReceiveDta
发现我读取的值是FF之类的  并不是我第二步写入的值
我就想看下波形,得到是RT的波形。
有什么解决问题的好办法吗?
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-3 12:41:55 | 显示全部楼层
滴丶滴 发表于 2016-6-3 11:31
我是想用STM32驱动外接的ADC  AD7708
我按照7708的手册编写程序之后,发现不能接收数据。
我就想看看, ...

几个问题你先看一下
1、发送的数据有用示波器验证过吗?
2、读取的时候直接调用的 SPI_I2S_ReceiveDta ?
3、示波器挂一下有没有时钟
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
 楼主| 发表于 2016-6-3 16:18:26 | 显示全部楼层
本帖最后由 滴丶滴 于 2016-6-3 16:21 编辑
不吃鱼的老鼠 发表于 2016-6-3 12:41
几个问题你先看一下
1、发送的数据有用示波器验证过吗?
2、读取的时候直接调用的 SPI_I2S_ReceiveDta  ...

您好,谢谢您的指导。
我用示波器看了下单片机输出波形及SCLK  我核实了下 输出显示是正确的
我又测了下 单片机接收数据及SCLK  就是开始贴的图那样
因为有一个很长的坡度 横跨了好几个时钟周期 所以接收的数据就是不正确的
您对此 有什么建议吗?是硬件吗?
硬件就是一个AD7708 我接了晶振32.768M  7708供电 参考电压:4.096 AINCOM接地 仅此  复位 RDY我都没接。另外我接收数据的函数 是直接用的  SPI_I2S_ReceiveData(SPI1);
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
 楼主| 发表于 2016-6-3 16:28:20 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-6-3 12:41
几个问题你先看一下
1、发送的数据有用示波器验证过吗?
2、读取的时候直接调用的 SPI_I2S_ReceiveDta  ...

我使用的 发送接收程序
SPI_I2S_SendData(SPI1, 0x01);
        delay_us(50);
                                 SPI_I2S_SendData(SPI1, 0x42);
                delay_us(50);
                                 SPI_I2S_SendData(SPI1, 0x41);
        delay_us(4);
                 a1=SPI_I2S_ReceiveData(SPI1);
就是SPI接收之前的这个延时函数 delay_us(4);
我取消延时 或者 延时小于4us  MISO端波形 一直是0
我到了4us或者更高,就出现了 如图的 大的坡度!!!
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-3 16:32:36 | 显示全部楼层
滴丶滴 发表于 2016-6-3 16:18
您好,谢谢您的指导。
我用示波器看了下单片机输出波形及SCLK  我核实了下 输出显示是正确的
我又测了 ...

我的意思是SPI是收发同步的,想要读取数据要发送一个哑字节
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
 楼主| 发表于 2016-6-3 16:54:32 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-6-3 16:32
我的意思是SPI是收发同步的,想要读取数据要发送一个哑字节

AD7708   必须先向通讯寄存器写入数据 制定下一步的操作
那我现在想读 比如 01寄存器的值
那我是不是 先发送  SPI SENDxxxx 指定  下一条程序是读01寄存器的值
然后我就写读的程序       我再发送?SPI Send 随便一条  后边接一条 SPI _ReceiveData?
这样理解对吗?
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-3 17:20:30 | 显示全部楼层
滴丶滴 发表于 2016-6-3 16:54
AD7708   必须先向通讯寄存器写入数据 制定下一步的操作
那我现在想读 比如 01寄存器的值
那我是不是  ...

对的,我没有用过AD7708,但是根据你描述的,我是这样理解的:
1、向AD7708发送控制指令,表示我要读你的某个寄存器的值
2、AD7708接收到后将此寄存器的值写入发送缓存或者将发送地址指向此寄存器
3、主机通过SPI发送哑字节读取这个值
不对之处,请指正,共同学习!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-6-4
在线时间
1 小时
发表于 2016-6-4 09:21:35 | 显示全部楼层
滴丶滴 发表于 2016-6-3 16:28
我使用的 发送接收程序
SPI_I2S_SendData(SPI1, 0x01);
        delay_us(50);

1、你的MCU是哪个型号?
2、函数 SPI_I2S_SendData(SPI1, 0x01) 是怎么写的?在把数据写进  SPIx->DR 之前有没有检查BUSY的状态位?如果不检查,在连续发送数据且缓冲区已满的时候,会导致数据冲突。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 09:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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