letyoufly 发表于 2010-10-28 22:58:17

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

最近做一个产品,试验阶段用的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单片机的缺陷的话,那只有换其它的牌子了。

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

zhxzhx 发表于 2010-10-29 00:22:44

letyoufly

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

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

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_593619UHFJRU.jpg
(原文件名:1111247817.jpg)

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

zhxzhx 发表于 2010-10-29 00:51:34

这个是ISD4004的明确答复,不行你自己模拟一个SPI总线吧.

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_593623NX9M3V.jpg
(原文件名:ISD4004.jpg)

letyoufly 发表于 2010-10-29 09:08:37

回复【2楼】zhxzhx 一丁
-----------------------------------------------------------------------

谢谢您!

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

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

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

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

谢谢您的解答!

zhxzhx 发表于 2010-10-29 10:20:34

AVR 的MISO是不是高阻状态,你加个上拉电阻看是不是也有变化,你再试一试吧

machao 发表于 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位预置了。

zhxzhx 发表于 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就是在一个脉冲里交换了一下数据.

machao 发表于 2010-10-29 23:36:34

在我的教程的P427,第1段有解释的。

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

letyoufly 发表于 2010-10-30 23:05:57

回复【6楼】zhxzhx 一丁
-----------------------------------------------------------------------

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

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

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

Holtek:
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_594108K5LHZC.JPG
(原文件名:holtek.JPG)

NXP:
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_594109VIAX3L.JPG
(原文件名:nxp.JPG)

STC:
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_594110FIZG4J.JPG
(原文件名:stc_spi.JPG)

Winbond:
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_594111J1PETW.jpg
(原文件名:winbond.jpg)

machao 发表于 2010-11-1 00:18:20

不要迷信这些图,因为它们很多对位画的都不准确的。

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

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

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

zhxzhx 发表于 2010-11-1 21:36:29

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

InfiLee 发表于 2011-9-23 18:12:45

mark

418478935 发表于 2011-11-17 14:13:58

回复【5楼】machao
-----------------------------------------------------------------------

我觉得应该是在上升沿 两个人同时把手中的东西递过去,在下降沿,又同时用右手接到了对方的东西。
页: [1]
查看完整版本: 请教马老师一个SPI问题:从机模式下MISO什么情况下才可以有输出?