搜索
bottom↓
回复: 12

请教马老师一个SPI问题:从机模式下MISO什么情况下才可以有输出?

[复制链接]

出0入0汤圆

发表于 2010-10-28 22:58:17 | 显示全部楼层 |阅读模式
最近做一个产品,试验阶段用的Mega32,调试OK了,没什么问题,然后量产准备移植到STC单片机上,用的是STC12L5616AD,自带SPI总线。

但是发现程序无论如何都调试不好,用示波器观察后最终发现了问题出在MISO上。

在AVR上,MCU做SPI从机,将数据放入SPDR后,如果和主机没有连接的话,MISO不会有数据输出,也就是说下面的代码段不会在MISO引脚输出方波:

initSPItoSlave();
while(1)
{
    SPDR = 0;
    delay1ms();
    SPDR = 0xFF;
    delay1ms();
}

但是在STC上,执行同样的代码,会在MISO引脚输出方波,经过和STC的姚工确认,并且查看了STC网站上的Demo程序,里面清楚地写着这样一句话:

“MISO 电平随着 SPDAT 改变”

参考网址 http://www.stcmcu.com/datasheet/stc/STC-NEW-SOURCE-CODE/one_master_one_slave_FOR_5A60AD.C 在倒数第三行。

我想请问马老师:

STC单片机SPI总线的这一行为,是否违背了SPI总线的协议呢?

这个问题困扰了我好多天了,因为我的产品中MISO不仅用作SPI的从机输出,还用作主机和从机的握手信号,接受完一个字节后,从机拉高MISO,从而进入忙状态,然后持续一段时间后拉低,退出忙状态,然后主机才能继续发送数据。但由于这个问题,我很难控制MISO的状态。

如果确实是STC单片机的缺陷的话,那只有换其它的牌子了。

十万火急,请马老师不吝赐教,谢谢!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-10-29 00:22:44 | 显示全部楼层
letyoufly

我查了一下SPI协议,STC的处理是对的

   主器件的输出口(MOSI)输出的数据bit0,在时钟的前沿被从器件采样,主器件输出时刻实际上在SCK信号有效以前,比SCK的上升沿还要早半个时钟周期。bit0的输出时刻与SSEL信号没有关系。
  从器件,主器件的输入口MISO同样是在时钟的前沿采样从器件输出的bit0的,从器件是在SSEL信号有效后,立即输出bit0,尽管此时SCK信号还没有起效。这样,数据就可以在SCK到来之前稳定下来.


(原文件名:1111247817.jpg)

另外,SPI 接口是一种事实标准,并没有标准协议,大部分厂家都是参照 Motorola 的 SPI 接口定义来设计的。但正因为没有确切的版本协议,不同家产品的 SPI 接口在技术上存在一定的差别

出0入0汤圆

发表于 2010-10-29 00:51:34 | 显示全部楼层
这个是ISD4004的明确答复,不行你自己模拟一个SPI总线吧.


(原文件名:ISD4004.jpg)

出0入0汤圆

 楼主| 发表于 2010-10-29 09:08:37 | 显示全部楼层
回复【2楼】zhxzhx 一丁
-----------------------------------------------------------------------

谢谢您!

不管在哪里发帖求解,都能看到您热心的身影。

我想应该您说的那样,因厂家而异。

昨晚上我用Mega32和STC12C5616又做了次试验,发现:Mega32工作在SPI从机模式下,如果连上双龙USB ISP的话,MISO也会随着SPDR变化而变化,但如果SPI总线什么都不接的话就不会变化。而STC12C5616无论SPI连不连主机,MISO都会随着SPDAT(STC的SPI数据寄存器)变化而变化。

我这次的用法应该是比较特殊的,相当于在SPI协议上增加了一个“握手”信号,所以在有的型号上可以实现,有的型号上实现不了。

谢谢您的解答!

出0入0汤圆

发表于 2010-10-29 10:20:34 | 显示全部楼层
AVR 的MISO是不是高阻状态,你加个上拉电阻看是不是也有变化,你再试一试吧

出0入0汤圆

发表于 2010-10-29 12:03:38 | 显示全部楼层
回复【楼主位】letyoufly
最近做一个产品,试验阶段用的mega32,调试ok了,没什么问题,然后量产准备移植到stc单片机上,用的是stc12l5616ad,自带spi总线。
但是发现程序无论如何都调试不好,用示波器观察后最终发现了问题出在miso上。
在avr上,mcu做spi从机,将数据放入spdr后,如果和主机没有连接的话,miso不会有数据输出,也就是说下面的代码段不会在miso引脚输出方波:
initspitoslave();
......
-----------------------------------------------------------------------
非常好的讨论,我对各种MCU工作在SPI的从机方式没有仔细研究过,只能按常规做分析。

1。作为从机的SPI,将数据写入SPI的数据寄存器后,在MISO上不应该有数据输出,因为此时CLK是没有的(从机的CLK应该是输入方式)
2。如果从机的CLK脚上有输入的CLK信号,此时应该将数据寄存器中数据输出,MISO上才有信号变化。

3。有些SPI(从)器件,处理方式可能有些不同,当数据进入SPI的数据寄存器后,它不管SPI接口的CLK上是否有输入,其MOSI的电平已经是准备串出数据的第1位了。以后如果没有CLK,就保持MOSI不变,有CLK才把后序的7位串出。换句话讲,这个SPI从机就只能2种或1种传输模式了,此时需要主机选择合适的模式配合。

至于STC的从机SPI如何工作我不清楚,你应该将测试代码做点变化,比如:

while(1)
{
    SPDR = 0x55;    //或0xAA
    delay1s();      //1秒比较好,这样容易分析MOSI的电平变化是谁引起的。
}

如果MOSI一直保持高或低,说明数据没有输出,如果MOSI只是在开始有一次变化,后面不变,说明MOSI只是将第1位预置了。

出0入0汤圆

发表于 2010-10-29 12:31:17 | 显示全部楼层
machao

作为从机的SPI,将数据写入SPI的数据寄存器后,在MISO上不应该有数据输出,因为此时CLK是没有的(从机的CLK应该是输入方式)

  SPI有不同的版本,好象SPI4.2就不要求CLK到来之前MISO上的数据准备(我记得有一个触摸屏的芯片是这个版本的SPI,接起来特别麻烦,要做什么CLK时钟学习训练,我始终没有能可靠地接收数据),其他版本要求CLK到来之前准备好数据,至少提前1/2个CLK周期.

SPI的一个比喻:
  你左手里拿着包.Zi.,我左手里拿着馒头,CLK上升我递给你馒头,下降你递给我包.Zi.,馒头包.Zi.还是要先准备好的,实质上SPI就是在一个脉冲里交换了一下数据.

出0入0汤圆

发表于 2010-10-29 23:36:34 | 显示全部楼层
在我的教程的P427,第1段有解释的。

SPI有4种工作模式,对于模式0和2讲,SS拉低就是第一个数据位移出的信号,因为接下来SCK的上/下沿就是锁存数据了。具体图在P426

出0入0汤圆

 楼主| 发表于 2010-10-30 23:05:57 | 显示全部楼层
回复【6楼】zhxzhx 一丁
-----------------------------------------------------------------------

“你左手里拿着包.Zi.,我左手里拿着馒头,CLK上升我递给你馒头,下降你递给我包.Zi.,馒头包.Zi.还是要先准备好的,实质上SPI就是在一个脉冲里交换了一下数据.”

我理解的SPI总线不是这样的,主机和从机要么都在上升沿采样,要么都在下降沿采样,而不是一个在上升沿,一个在下降沿。
另外,数据虽然事先准备好,但并不一定要送到总线上,完全可以先放到数据寄存器中。因为SPI的SCK信号的上升沿和下降沿是有各自的功能的,在我应用的模式下,是下降沿将数据bit送出,上升沿接收方进行采样。所以,对于从机来说,在收到主机的SCK信号下降沿之前,是不应该送出数据的。

我查阅了几个厂家的MCU相关资料,发现果然是参差不齐,其中我认为Holtek的讲的还是非常明确的,其它的都不太明确这一点。

Holtek:

(原文件名:holtek.JPG)

NXP:

(原文件名:nxp.JPG)

STC:

(原文件名:stc_spi.JPG)

Winbond:

(原文件名:winbond.jpg)

出0入0汤圆

发表于 2010-11-1 00:18:20 | 显示全部楼层
不要迷信这些图,因为它们很多对位画的都不准确的。

SPI有4种传输模式,请仔细看我编写的书中解释。主机和从机需要使用同一种模式通信。

有许多SPI接口的从机器件只支持其中的一种。而MCU所支持的一般都是4种,主要是为了适合与不同的从机通信的。

4种模式都是在一个脉冲的前/后各有一个动作:一个如果是打入(锁存),另一个就是串出。

出0入0汤圆

发表于 2010-11-1 21:36:29 | 显示全部楼层
【8楼】 letyoufly
你理解的不对,
SPI 都是在一个周期内有数据交换的,而且数据在数据在锁存器内也是不行的,因为物理器件的信号也有一个稳定的过程,SCK只是使从设备吧数据锁存不再随MISO的变化而变化而已,并不是说主设备这个时候才出信号,信号必须要在锁存之前稳定,高电平或低电平双方准备数据,上升或下降双方互相锁存数据(看D触发器)

出0入0汤圆

发表于 2011-9-23 18:12:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-17 14:13:58 | 显示全部楼层
回复【5楼】machao  
-----------------------------------------------------------------------

我觉得应该是在上升沿 两个人同时把手中的东西递过去,在下降沿,又同时用右手接到了对方的东西。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 00:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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