本帖最后由 anvy178 于 2015-4-3 11:33 编辑
@Leeone 内置空闲线和地址位通信协议 说白了 其实就是单片机的串口通信的sm2位的功能,大家应该知道单片机sm2位 用来 干啥的吧?
在多机通信中 是用来 区分地址和数据的。
好,下面再回来说明MSP430这个系列的增强型串口的 空闲线 跟 地址位。其实是用两种不同的办法实现同一个功能。你选择用 空闲线的办法可以,地址位的也可以。空闲线 大家可能觉得抽象 ,我就大概说:总线要空闲 莫非 就是拉高 ,因为多个设备串在一起 的时候 ,起决定性的是低电平。不发数据的机,你必须保持高电平,因为都在一条线上,是线与的 关系,你一直低的话,就会堵死。 大家都动不了,所以交通就会繁忙,闲不了。所以要空闲就要保持高电平。所以说 ,内置空闲线就是不用你处理这个空闲的功能(也 就是手动置高电平,跑过软件模拟单总线的同学应该明白,比如说I2c)。
再说回来,430的内置空闲线,当你选择这个模式的时候(通过寄存器配置),它的接收跟发送线,在发完数据之后 就
会自动将总线拉高置为空闲。拉多长时间这个不用你里,你只要在相应的寄存器里设置好标志就行了。
下面具体对空闲模式举个例子来说明吧 ,这样好明白些。
正常来说,我们大家用单片机的串口来说 , 一有数据来 就进入串口中断,然后就处理数据。如果是N多个机器在一条总线上工作,一个机器发送数据,所以的机器都会中断,这样子 会导致每个机器都会很忙。 但是 在空闲模式下,就不会出现这种情况。下面说下思路,大家跟着思路应该就明白,不明白再问吧。
思路:假如N多台在一条总线上的机器。
第一步: 地址发送
发送方: 机器A要发数据给另外一台机器B通信。那么机器A首先要发送的就是 机器B的地址,在发送地址之前,把UCTXADDR置为1,表示传送地址。这样的话,机器A把数据发出以后,就会自动将总线拉高 一段时间 就是手册里说的 不少于10个BITs的总线拉高时间。
接收方: 机器B,判断到这个是自己的地址之后(当然其它机器也会在这个时候会中断一次,因为一开始大家肯定都是处于接收地址的状态),就会改变自己判断总线空闲时间长度,(其实就是转为准备接收数据的状态)。
第二步:数据发送
发送方: 机器A,在发完地址之后,就会发数据,但是在这个过程中,间隔拉高总线电平的时间 不能够超过10个bitS (当然啦 ,这个不用你干,你就设置好相对应的标志位就好了),这样子的话,接收方才能区分出来,什么是数据,什么是地址。在发送数据的过程中,因为,总线的空闲时间少于10bitS 。其它的没有接收到自己地址的,还处于接收地址的状态,所以他们不会进入中断。这样就避免了总线上有数据的时候,CPu 频繁的中断。
接收方:机器B,就会开始接收数据,直接到总线再次进入接收地址的状态。
所以 ,总的来说 ,这里的内置空闲总线,不是说啥都不干,(串口的时钟会一直对总线采样的)。只是用来区分发送的是地址,还是数据的一种手段而已。所以就不会有@Leeone串口接受空闲中断 的这种说法。 串口 要中断 ,就只有接收到数据的时候,(或者更加严格的说 ,是接收到属于自己的东西时候才会中断)。
对于另外一个 地址位通信 就更加好理解了, 就是通过在发送的数据中 多加一个位 来表示传送的是数据 还是地址,这个跟单片机中的SM2 位 基本一样了。接收,发送过程跟上面一样 只是大家设置的标志位不一样而已 。 |