搜索
bottom↓
回复: 16

在spi下的子模式发送数据的时机(想做成双工传输)?

[复制链接]

出0入0汤圆

发表于 2008-4-16 08:58:41 | 显示全部楼层 |阅读模式
因为AVR的SPI本质上是环形移位寄存器,在主机写的时候,同时可以得到一个从机回来的数据。
我的问题是
  1 如果MCU状态为从机模式,那么SPI中断发生在/SS为低时还是在主机已经发完1个字节数据以后呢?本人认为应该为后者,但是如果为后者就来了下面一个问题。
  2 如果子机这块MCU想给主机双工通讯那么从机MCU的SPI发送数据的时机是在什么时候?

出0入0汤圆

发表于 2008-4-16 21:38:20 | 显示全部楼层
需要预先准备在BUFF中,在中断中赋给SPI的数据寄存器中.

主机需要控制发送字节之间的间隔,也就是发送一个字节后,应该等待一段时间(如5ms)再发送下一个,保证从机中断有处理时间.

可靠的情况下,最好要定义成数据包,通信过程中增加数据包检验,错误重发,超时处理等.可参考我书中RS232的数据通信上层协议的制定部分.

出0入0汤圆

 楼主| 发表于 2008-4-17 07:59:15 | 显示全部楼层
马老师问题:  

1 如果MCU状态为从机模式,那么SPI中断发生在/SS为低时还是在主机已经发完1个字节数据以后呢?
2 如果MCU状态为从机模式,从机在/SS为高时先写了SPDR,如果当/ss被主机拉低,随着主机SCLK,从机的SPDR数据会到达主机吗(环形)?

出0入0汤圆

发表于 2008-4-17 09:16:44 | 显示全部楼层
1.如果MUC的SPI口肯定工作在丛机方式下的话,就不要/SS信号了,只要使MSTR=0就可以了.这样中断就仅在数据传送结束后发生了.如果SPI是多主系统,就必须靠/SS进行总线仲裁,当SPI为主机方式时那么当/SS被拉低,以及数据传送完成都产生中断.至于中断如何处理,则由程序员设计了.

2.按照手册的说明,当SPI设置成丛机方式了,那么/SS被外部拉低不会产生中断,但随着主机SCLK,从机的SPDR数据会到达主机.

3.如同USART相同,SPI口的硬件只是提供和完成了最低层的一个字节的传送过程.实际使用还是应该定义上层的协议.建议你参考一些SPI接口器件的SPI命令,制定自己的上层通信规程.

出0入0汤圆

 楼主| 发表于 2008-4-17 11:47:57 | 显示全部楼层
非常感谢马老师

出0入0汤圆

 楼主| 发表于 2008-4-17 13:05:24 | 显示全部楼层
如果MUC的SPI口肯定工作在丛机方式下的话,就不要/SS信号了,只要使MSTR=0就可以了?
我认位:如果从机没有/ss信号,哪么从机的MISO呈高阻状态呀,无法完成向主机传送字节呀。

出0入0汤圆

发表于 2008-4-17 13:21:54 | 显示全部楼层
查看书中P430的表15-2,从机方式时,MISO由用户定义.如果从机需要向主机发送数据,在初始化时应该设置成输出方式,电平根据你定义的4种模式中的一种确定.

出0入0汤圆

 楼主| 发表于 2008-4-17 13:49:32 | 显示全部楼层
我认位从机即使设定为MISO输出,但是如果没有/SS为低电平,依然保持为高阻,只有/SS为低电平才为输出状态。

============================
你试过吗?

出0入0汤圆

发表于 2008-4-17 14:27:51 | 显示全部楼层
没ss如何同步?

出0入0汤圆

 楼主| 发表于 2008-4-17 14:49:07 | 显示全部楼层
你有个电路就是这样的,多从机通过/SS来选择,MOSI和MISO全部相应并联连到SPI主机。所以我说:我认位从机即使设定为MISO输出,但是如果没有/SS为低电平,依然保持为高阻,只有/SS为低电平才为输出状态。同时从机靠/SS同步移位输出寄存器。

出0入0汤圆

发表于 2008-4-18 02:12:21 | 显示全部楼层
关于SPI从机的讨论非常好。在我的书中,由于篇幅的限制,无法对SPI的更深入的东西,包括从机方式做仔细的介绍。

在3楼,我只是简单提提,原不想做更多的说明,主要针对从机中断的问题解答一下。既然楼上的有许多的认为(或许经过实践的),那就讨论一下吧。

先贴上几段原文手册中的相关说明,不晓得楼上是否全面的看过,我在这个基础上再做些解释.

When configured as a Slave, the SPI interface will remain sleeping with MISO tri-stated as long as the SS pin is driven high. In this state, software may update the contents of the SPI Data Register, SPDR, but the data will not be shifted out by incoming clock pulses on the SCK pin until the SS pin is driven low. As one byte has been completely shifted, the end of transmission flag, SPIF is set. If the SPI interrupt enable bit, SPIE, in the SPCR Register is set, an interrupt is requested. The Slave may continue to place new data to be sent into SPDR before reading the incoming data. The last incoming byte will be kept in the buffer register for later use.

MISO – Port B, Bit 6
MISO: Master Data input, Slave Data output pin for SPI channel. When the SPI is enabled as a Master, this pin is configured as an input regardless of the setting of DDB6. When the SPI is enabled as a Slave, the data direction of this pin is controlled by DDB6. When the pin is forced by the SPI to be an input, the pull-up can still be controlled
by the PORTB6 bit.

Table 65. SPI Pin Overrides(1)
Pin         Direction, Master SPI                Direction, Slave SPI
MOSI          User Defined                            Input
MISO          Input                                   User Defined
SCK           User Defined                            Input
SS            User Defined                            Input

C Code Example(1)
void SPI_SlaveInit(void)
{
    /* Set MISO output, all others input */
    DDR_SPI = (1<<DD_MISO);
    /* Enable SPI */
    SPCR = (1<<SPE);
}

char SPI_SlaveReceive(void)
{
    /* Wait for reception complete */
    while(!(SPSR & (1<<SPIF)))
    ;
    /* Return data register */
    return SPDR;
}

===========================================================================
因此,首先肯定,当设置SPI为从机时,MOSI,SS,SCK 为输入,而MISO由用户配置。

因此如果从机SPI要输出数据的话,当然应该将MISO配置成输出方式了。注意的是,如果SS为高的话,SPI将强制将MISO设置成输入高阻(用户配置不起作用),但当SS为低时,MISO的特性为用户的配置。

如果能明白上面的过程的话,我们才能灵活的使用SPI的从机功能。

如果AVR的SPI设置为从机,且SPI总线上挂有多个从机时,那么SS就必须要使用了。当SS为高时,说明本SPI没有被选中,此时MISO被强制为输入高阻(此时用户设置实际无效),不会影响SPI总线上其它器件的工作。当SS拉低(不会产生中断的),MISO恢复用户设置的输出方式,在SCK的作用下将数据寄存器中数据串出。

如果AVR的SPI设置为从机,且SPI总线上只有这一个从机时,而这个从机是用户自己定义的话。那么只要选择模式1、3,SS就可以不考虑了。此处的“不考虑或不要”是指将SS永久接地(在上面没讲清楚),那么SPI永远准备工作,MISO就是用户的配置,只要有SCK输入,就将数据串出,串出8位后产生中断(仅限模式1、3)。这样主机的SS可以作为它用,节省资源。

AVR中很多的东西非常灵活,因此可以在多种情况下使用(如实现SPI多主总线系统等)。但也正式由于太灵活了,当你对协议没有真正彻底的理解透时,反而不会使用了,也用不好,当然也不会理解AVR为何这样设计。

出0入0汤圆

 楼主| 发表于 2008-4-18 09:42:36 | 显示全部楼层
感谢马老师讲解!
  如果AVR的SPI设置为从机,且SPI总线上只有这一个从机时,而这个从机是用户自己定义的话。那么只要选择模式1、3,SS就可以不考虑了。此处的“不考虑或不要”是指将SS永久接地(在上面没讲清楚),那么SPI永远准备工作,MISO就是用户的配置,只要有SCK输入,就将数据串出,串出8位后产生中断(仅限模式1、3)。这样主机的SS可以作为它用,节省资源。
  新的问题:为什么只能是1,3模式了?
  是不是因为没有/SS同步,这时从机的MISO发出起始数据位则只能靠SCLK的边沿同步?

出0入0汤圆

发表于 2008-4-18 10:16:39 | 显示全部楼层
真的非常谢谢马老师的讲解。

出0入0汤圆

 楼主| 发表于 2008-4-18 12:57:36 | 显示全部楼层
感谢马老师讲解!
  如果AVR的SPI设置为从机,且SPI总线上只有这一个从机时,而这个从机是用户自己定义的话。那么只要选择模式1、3,SS就可以不考虑了。此处的“不考虑或不要”是指将SS永久接地(在上面没讲清楚),那么SPI永远准备工作,MISO就是用户的配置,只要有SCK输入,就将数据串出,串出8位后产生中断(仅限模式1、3)。这样主机的SS可以作为它用,节省资源。  
  新的问题:为什么只能是1,3模式了?
  是不是因为没有/SS同步,这时从机的MISO发出起始数据位则只能靠SCLK的边沿同步?

出0入0汤圆

发表于 2008-4-18 16:11:41 | 显示全部楼层
具体请看我的书中对4种模式的波形分析.

模式0,2 当SS拉低,第一位数据就输出,在SCK的前沿打入,后沿输出...
而模式1,3 是SCK的前沿输出,SCK的后沿打入.....

在模式0,2中,SS好象是"同步",但真正的同步还是是SCK.将AVR设计成SPI从机,你必须从4种模式中选择一种,那么那种方便呢?

出0入0汤圆

 楼主| 发表于 2008-4-18 18:03:04 | 显示全部楼层
谢谢!已经讲的很清楚了!非常感谢!

出0入0汤圆

发表于 2010-11-11 21:11:49 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 13:22

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

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