请教马老师一个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单片机的缺陷的话,那只有换其它的牌子了。
十万火急,请马老师不吝赐教,谢谢!! 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 接口在技术上存在一定的差别 这个是ISD4004的明确答复,不行你自己模拟一个SPI总线吧.
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_593623NX9M3V.jpg
(原文件名:ISD4004.jpg) 回复【2楼】zhxzhx 一丁
-----------------------------------------------------------------------
谢谢您!
不管在哪里发帖求解,都能看到您热心的身影。
我想应该您说的那样,因厂家而异。
昨晚上我用Mega32和STC12C5616又做了次试验,发现:Mega32工作在SPI从机模式下,如果连上双龙USB ISP的话,MISO也会随着SPDR变化而变化,但如果SPI总线什么都不接的话就不会变化。而STC12C5616无论SPI连不连主机,MISO都会随着SPDAT(STC的SPI数据寄存器)变化而变化。
我这次的用法应该是比较特殊的,相当于在SPI协议上增加了一个“握手”信号,所以在有的型号上可以实现,有的型号上实现不了。
谢谢您的解答! AVR 的MISO是不是高阻状态,你加个上拉电阻看是不是也有变化,你再试一试吧 回复【楼主位】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位预置了。 machao
作为从机的SPI,将数据写入SPI的数据寄存器后,在MISO上不应该有数据输出,因为此时CLK是没有的(从机的CLK应该是输入方式)
SPI有不同的版本,好象SPI4.2就不要求CLK到来之前MISO上的数据准备(我记得有一个触摸屏的芯片是这个版本的SPI,接起来特别麻烦,要做什么CLK时钟学习训练,我始终没有能可靠地接收数据),其他版本要求CLK到来之前准备好数据,至少提前1/2个CLK周期.
SPI的一个比喻:
你左手里拿着包.Zi.,我左手里拿着馒头,CLK上升我递给你馒头,下降你递给我包.Zi.,馒头包.Zi.还是要先准备好的,实质上SPI就是在一个脉冲里交换了一下数据. 在我的教程的P427,第1段有解释的。
SPI有4种工作模式,对于模式0和2讲,SS拉低就是第一个数据位移出的信号,因为接下来SCK的上/下沿就是锁存数据了。具体图在P426 回复【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) 不要迷信这些图,因为它们很多对位画的都不准确的。
SPI有4种传输模式,请仔细看我编写的书中解释。主机和从机需要使用同一种模式通信。
有许多SPI接口的从机器件只支持其中的一种。而MCU所支持的一般都是4种,主要是为了适合与不同的从机通信的。
4种模式都是在一个脉冲的前/后各有一个动作:一个如果是打入(锁存),另一个就是串出。 【8楼】 letyoufly
你理解的不对,
SPI 都是在一个周期内有数据交换的,而且数据在数据在锁存器内也是不行的,因为物理器件的信号也有一个稳定的过程,SCK只是使从设备吧数据锁存不再随MISO的变化而变化而已,并不是说主设备这个时候才出信号,信号必须要在锁存之前稳定,高电平或低电平双方准备数据,上升或下降双方互相锁存数据(看D触发器) mark 回复【5楼】machao
-----------------------------------------------------------------------
我觉得应该是在上升沿 两个人同时把手中的东西递过去,在下降沿,又同时用右手接到了对方的东西。
页:
[1]