打印

STM32和一个器件进行SPI通讯时,最后一位出错。

[复制链接]
3019|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any012|  楼主 | 2016-3-19 09:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
主设备是STM32F103,从设备是AD7193模数转换芯片,读取时不对,以下为读的波形的最后几位时对应的SCLK和MOSI波形。
按说芯片应该是SCLK下降沿时MISO改变数据,SCLK上升沿时MISO采样。前边的波形都是这样的,就最后一位,SCLK上升沿时,MISO来了个正跳变。

怀疑是CS片选最后被拉高时,MISO也被拉高了,于是修改了下SPI读写函数,CS被拉低后,延时一段时间,再惊醒SPI读写,SPI读写结束后,延时一段时间CS再拉高。
结果,波形依旧。



相关帖子

沙发
19840312| | 2016-3-20 14:09 | 只看该作者
SCLK下降沿时MISO改变数据,SCLK上升沿时MISO采样。
说明:SCLK下降沿后读数据,上升沿后数据就不对了。因此最后一个clk的上升沿应该就是MISO拉高!

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
any012 + 3
板凳
NE5532| | 2016-3-21 10:39 | 只看该作者
你用的硬件SPI口,还是软件模拟的?

使用特权

评论回复
地板
any012|  楼主 | 2016-3-21 10:59 | 只看该作者
NE5532 发表于 2016-3-21 10:39
你用的硬件SPI口,还是软件模拟的?

用的软件SPI。

使用特权

评论回复
5
any012|  楼主 | 2016-3-21 11:03 | 只看该作者
19840312 发表于 2016-3-20 14:09
SCLK下降沿时MISO改变数据,SCLK上升沿时MISO采样。
说明:SCLK下降沿后读数据,上升沿后数据就不对了。因 ...

我的理解是:
主设备控制SCLK电平高低,当SCLK下降沿时,从设备响应,改变MISO引脚电平,直到下个SCLK下降沿时再次改变MISO引脚电平。
在两次下降沿之间,MISO电平应当是稳定的,而主设备在两个下降沿的中间采样,比较稳定,也就是在上升沿时采样。

使用特权

评论回复
6
NE5532| | 2016-3-21 11:19 | 只看该作者
软件SPI你就只有找自己的问题了呗,你这个时序明显是“上升沿采样”,时钟的最后终止应该是“下降沿”,人家还没采样完成,你就把数据给人家断了,咋可能正确呢?

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
any012 + 3
7
any012|  楼主 | 2016-3-21 16:59 | 只看该作者
本帖最后由 any012 于 2016-3-21 17:00 编辑
NE5532 发表于 2016-3-21 11:19
软件SPI你就只有找自己的问题了呗,你这个时序明显是“上升沿采样”,时钟的最后终止应该是“下降沿”,人 ...

为何说是我给人家断了?
我看了下CS波形,是要延后一段时间的,不是在MISO的最后一个正跳变。

MOSI波形:


MISO波形:


CS波形:

使用特权

评论回复
8
NE5532| | 2016-3-22 11:19 | 只看该作者
你自己软件写的SPI,又是MOSI上的数据,你说不是你自己写错了还能是啥原因??而且你的问题不是CS,是MOSI的最后一位。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
any012 + 3
9
any012|  楼主 | 2016-3-22 13:56 | 只看该作者
NE5532 发表于 2016-3-22 11:19
你自己软件写的SPI,又是MOSI上的数据,你说不是你自己写错了还能是啥原因??而且你的问题不是CS,是MOSI ...

我这里是读啊,是MISO,从设备控制MISO引脚电平的。

使用特权

评论回复
10
NE5532| | 2016-3-22 17:02 | 只看该作者
你最后再多发一个时钟,看是啥效果?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
any012 + 1
11
any012|  楼主 | 2016-3-23 10:19 | 只看该作者
NE5532 发表于 2016-3-22 17:02
你最后再多发一个时钟,看是啥效果?

试了,最后又加了个SCLK时钟,但没有读取。
看到的效果是倒数第二个SCK上升沿,MISO仍然做了负跳变。
可以对比下两图,上是多加了个SCK时钟,下是原来的。




使用特权

评论回复
12
NE5532| | 2016-3-23 14:08 | 只看该作者
这个就确实比较奇怪了,因为你多发一个时钟以后并没有其他的数据送出来,请仔细参考你的从器件的数据手册,看是否有对这个现象的描述,另外需要咨询你从机的厂家技术支持了,主机这边你只有检查自己是否有低级错误,如果没有,也无计可施。

使用特权

评论回复
13
any012|  楼主 | 2016-3-23 14:43 | 只看该作者
NE5532 发表于 2016-3-23 14:08
这个就确实比较奇怪了,因为你多发一个时钟以后并没有其他的数据送出来,请仔细参考你的从器件的数据手册, ...

谢谢了。
感觉也是从设备的事,估计是有地方设置的不对。

使用特权

评论回复
14
any012|  楼主 | 2016-3-23 17:16 | 只看该作者
NE5532 发表于 2016-3-23 14:08
这个就确实比较奇怪了,因为你多发一个时钟以后并没有其他的数据送出来,请仔细参考你的从器件的数据手册, ...

这个可能是这个芯片的特性,最后一个上升沿时,MISO会被立时拉高。
所以,软件SPI对这个芯片读取时,应在SCK拉高前读取MISO。
我之前是在SCLK拉高后读取MISO,所以是大部分时间读取的不对,偶尔正确一两次。
通过这次真是吸取教训了,卡了很多天啊。

使用特权

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

本版积分规则

35

主题

232

帖子

6

粉丝