machao 发表于 2005-3-28 23:07:30

AVR-USART的多机通信模式使用参考

2.12.8多机通信模式

   

    设置UCSRA寄存器中的标志位MPCM,可以使能USART接收器对接收的数据帧进行过滤的功能。如果使能了过滤功能,接收器对接收到的那些不是地址信息帧的数据帧将进行过滤,不将其放入接收缓冲器中,这在多机通信中有效地减少了MCU处理数据帧的数目。发送器不受MPCM位设置的影响,但如果工作在多机通信方式下时,其工作处理方式应与一般的异步通信方式有所不同。

   

    在多机通信中,如果接收器被设置为接收5~8个数据位的数据帧,第一个停止位则表征该帧包含的是数据信息还是地址信息。如果接收器被设置为接收9个数据位的帧结构,则第9位(RXB8)被用作表征该帧是地址帧还是数据帧。当帧类型表征位为“1”时,表示该帧数据为一个地址帧;当帧类型表征位为“0”时,表示这个帧为一个数据帧。

   

    多机通信模式允许多个从机并在通信线路上接收一个主机发出的数据。通过对接收到的地址帧中的地址进行解码,确定哪个从机被主机寻址。如果某个从机被主机寻址,它将接收接下来主机发出的数据帧,而其他的从机将忽略数据帧,直到再次接收到一个地址帧。

   

    对于在多机通信系统中的主机MCU,可以设置使用9位数据帧结构(UCSZ=7)。当发送地址帧时,置第9位为“1”;发送数据帧时,置第9位为“0”。在这种情况下,从机也必须设置成接收9位数据帧结构。



多机通信方式的数据交换过程如下:



1.设置所有从机工作在多机通信模式(MPCM=1)。



2.主机发送一个地址帧,所有从机接收和读取该地址帧。所有从机的MCU中,RXC标志位被置位,表示接收到地址帧。



3.每一个从机MCU读取UDR寄存器,并判断自己是否被主机寻址。如果被寻址,清UCSAR寄存器中的MPCM位,等待接收数据;否则保持MPCM为“1”,等待下一个地址帧的接收(该步应由用户软件处理实现)。



4.被寻址的从机MCU将接收之后所有主机下发的数据帧,直到下一个地址帧为止。其他从机MCU忽略这些数据帧。



5.当被寻址的从机MCU接收完最后一个数据帧后将MPCM位置位,等待下一个地址帧的出现。然后从步骤2开始重复。



    虽然在多机通信中可以使用5到8位数据位的帧结构,但由于接收方必须在N和N+1的帧结构之间来回切换,所以不实用,同时也使得实现双工通信的操作变得更加复杂化。如必须使用5~8位的数据帧结构,则必须采用两个停止位,因为第一个停止位被用于判别帧的类型。

aystdy 发表于 2005-8-22 14:28:38

马老师:

我有这么一个问题:

5.当被寻址的从机MCU接收完最后一个数据帧后将MPCM位置位,等待下一个地址帧的出现。然后从步骤2开始重复。

现在的问题是:从机怎么知道主机发的是不是最后一个数据帧?

是不是,在主机发地址后接着发一个数(代表数据的个数)或者被选中的从机每次接数据都判断主机发的是地址还是数据?

或者还有更好的办法?请马老师不另赐教。

neutronlmk 发表于 2005-8-22 21:49:52

1,可预先约定数据桢为固定长度。

2,可以在数据之前定义一字节为数据帧长度,从机接收以此长度接收余下数据。

aystdy 发表于 2005-8-23 02:14:33

楼上的是否可以加我qq:25012951

neutronlmk 发表于 2005-8-23 21:43:50

我很少上Q嘞,有问题还是这里问吧,我早上中午晚上非上班时间都会来逛一逛的。

Ensonlin 发表于 2005-8-25 13:12:38

关注中,现在也在用avr m16 的通讯

希望老师和大家能提点一下小弟

./emotion/em003.gif

aystdy 发表于 2005-8-25 20:50:00

哪个通信的我现在没什么问题

只是有时候可以个人讨论一下

aystdy 发表于 2005-8-26 22:02:57

不知撒哈拉企鹅老兄玩过twi没?

aystdy 发表于 2005-8-26 22:05:49

撒哈拉企鹅

你还是加我qq把

neutronlmk 发表于 2005-8-27 08:20:47

加了!

TWI还没玩过,没钱了~待下月头做块板回来,avr的功能我都会试一试。

chuxue 发表于 2005-8-27 22:10:34

建议马老师传一个实例上来与大家看看,C的也好汇编的也好,这样学生们就可以少走很多弯路了。多谢马老师!

chuxue 发表于 2005-8-27 22:42:40

"设置UCSRA寄存器中的标志位MPCM,可以使能USART接收器对接收的数据帧进行过滤的功能。"

其意思是不是在从机是如果置位了MPCM位(MPCM=1),主机传输出来的数据的第9位(TXB8)为0的话就从机就能不响应其中断??

aystdy 发表于 2005-8-27 23:10:02

是的

chuxue 发表于 2005-8-28 10:28:14

“3.每一个从机MCU读取UDR寄存器,并判断自己是否被主机寻址。如果被寻址,清UCSAR寄存器中的MPCM位,等待接收数据;否则保持MPCM为“1”,等待下一个地址帧的接收(该步应由用户软件处理实现)。 ”

其中的“等待接收数据”要不要从中断中跳出来等待,还是在原地用轮讯的方法等待?



还有就是从这5点来看,主机都无从得知哪一个从机收到自己的从机号,(也就是说从机没有反回自己的机号,主机如果是与不同分机传输不同数据时应该...不明白。)学生想知道从机应该的什么地方反回自己的从机号。



希望马老师和各位大哥大姐能提点一下学生!

free_ygd 发表于 2005-8-28 14:39:19

TWI我试过,不过是MEGE128上试的,看的是马老师的那本书,不过程序是自己写的.

free_ygd 发表于 2005-8-30 08:32:04

机器上没有QQ 给EMAIL吧:free_ygd@eyou.com

wanghu1232001 发表于 2008-4-1 18:16:19

按照我的理解不知道对不对,请各位大哥大姐看下。
1.我觉得datasheet上说的多机通信的5步只是AVR推荐的编程思路,是需要软件实现的,通过控制MPCM来让MCU继续接收数据相应接收中断,或者拒绝接收数据。而事实上,可以不用MPCM,不用第九位,只要之前约定好地址帧,数据帧以后,这时候总线上的MCU都响应中断并接收到地址和数据,再通过软件确定自己是否被寻址,再做出回应。
2.MCU读取UDR寄存器,并判断自己是否被主机寻址。这是要通过编程实现的,因为没有地址寄存器,MCU不能自己比对地址是否被寻,哪个单片机想要继续得到数据的,就乖乖的在程序里把MPCM清零。
3.MPCM只不过是能否响应接收中断的一个控制字:
MPCM=1,则仅响应第9位为1的接收中断
MPCM=0,则响应所有的接收中断
这是我的理解,不知道对不对,还请马老师和各位大侠指正!!

machao 发表于 2008-4-4 13:35:56

本贴是关于使用USART构成多机通信模式的简短介绍.具体的应用事例在我的书中有,不过不采用lz位的9位方式.

至于I2C是另外一回事,不要混淆.

yinhe 发表于 2010-3-4 21:36:35

ji

jialiang 发表于 2010-9-15 13:20:58

老师,
    你好!
    关于多机通信功能,从站使用MPCM=1地址筛选功能,请问,主站需要设置吗?

   谢谢!

machao 发表于 2010-9-22 15:26:32

关于USART(UART)的多机通信,在我编写的教程中有非常详细的介绍和实例。

还是劝各位从基础的概念开始,扎实的学习。

xuyongze 发表于 2011-2-22 12:58:51

求实例。。。

machao 发表于 2011-2-23 21:36:47

楼上的,买一本偶写的书参考。

什么叫求实例。。。?!
页: [1]
查看完整版本: AVR-USART的多机通信模式使用参考