8位单片机的多主机通讯方案
时间:04-03
来源:互联网
点击:
多主机通讯方案使用了瑞萨的8位单片机M37546,该单片机具有两个独立的串口,可以配置为同步或异步串口使用。使用了N沟道漏极开路总线结构与UART通讯协议,在同一根电缆上完成数据的发送和接收;同时加入了冲突检测功能,可以保证在不丢失信息的情况下,完成仲裁,实现多主机通讯。
在这个系统中的所有M37546的TxD1与RxD1都接到同一根总线上。所有数据都是在这一根线上传递的,一个主机发送的数据除了会被其他主机收到外,也会被自己的RxD1收到,这也是使用总线冲突检测功能仲裁的必要条件之一。除此以外还需要将P11/TxD1管脚设置为N沟道开路输出方式,构成N沟开漏总线结构。电路见图1。
本方案使用了CAP0外部中断对总线进行监控,以避免多个设备同时发送的问题。M37546的P10/RxD/CAP0管脚既是串口1的输入RxD1,同时还是输入捕捉功能的输入CAP0。因为UART帧的起始位一定是低电平,所以发送开始时会触发CAP0中断。在中断处理程序中检查串口1发送结束标志位,如果发送结束标志位是“1”,说明本机的发送过程并没有启动,必然是其它主机启动的发送,应该立刻进入接收状态,直到对方发送结束;如果发送结束标志是“0”,说明本机启动了发送,可以结束对总线状态的监控(禁止CAP0中断)转而继续后面的发送过程。这个监控过程也是对多个发送信号进行同步筛选的过程,因为只有多个主机同时或在很短时间间隔(小于CAP0中断响应时间)内发送起始位时,才能成功启动发送过程。只有保证了发送过程的同步,才能应用后面的位仲裁方式。
位仲裁是依靠M37546的总线冲突检测功能完成的,其工作方式为:当串口开始接收后,在对每一位接收采样的同时,比较TxD发送的与RxD收到的数据,如果两者不同就会产生UART1总线冲突检测(U1BC)中断。
仲裁过程利用了带上拉的N沟开漏总线的特点——“线与”。当某一个主机发送“1”的时候,如果其它主机正在发送“0”,“1”就不会出现在总线上。而发送“1”的主机从总线上收到的是“0”,这会触发U1BC中断。收到中断后,这个主机应该立刻停止发送,转为接收状态,以保证其它主机发送的数据不被破坏。
本方案除了物理层的内容外,还在UART协议的基础上加入了数据帧的概念。总线上的所有设备都会收到整个数据帧。如果发现自己的ID与目的ID相同,那么对后面的数据进行接收并校验,并发出应答。其它设备收到数据帧后只提取帧的长度信息,丢弃后面的数据、校验和应答段。当后续字节达到数据长度+2后,认为此帧正常结束,总线回到空闲状态,可以启动发送。数据帧的格式见图2。
另外,协议还规定了总线等待时间。如果在一个数据帧的过程中数据中断时间超过等待时间,可以认为此次发送为非正常结束。总线回到空闲状态。
发送方如果收到不正常应答(校验出错)或者未收到应答,可以选择重新发送,但是重发的帧有可能会与其它主机发送的数据帧竞争。
保留全零ID为广播地址,以广播地址为目的ID的帧会被所有主机接收。并且不需要应答。
以上格式都是针对一般的系统而设计的,用户可以根据自己的需要来调整。比如,对于重要的数据可以用CRC校验方式代替校验和;设备较多时可以增加ID段长度等。
在这个系统中的所有M37546的TxD1与RxD1都接到同一根总线上。所有数据都是在这一根线上传递的,一个主机发送的数据除了会被其他主机收到外,也会被自己的RxD1收到,这也是使用总线冲突检测功能仲裁的必要条件之一。除此以外还需要将P11/TxD1管脚设置为N沟道开路输出方式,构成N沟开漏总线结构。电路见图1。
本方案使用了CAP0外部中断对总线进行监控,以避免多个设备同时发送的问题。M37546的P10/RxD/CAP0管脚既是串口1的输入RxD1,同时还是输入捕捉功能的输入CAP0。因为UART帧的起始位一定是低电平,所以发送开始时会触发CAP0中断。在中断处理程序中检查串口1发送结束标志位,如果发送结束标志位是“1”,说明本机的发送过程并没有启动,必然是其它主机启动的发送,应该立刻进入接收状态,直到对方发送结束;如果发送结束标志是“0”,说明本机启动了发送,可以结束对总线状态的监控(禁止CAP0中断)转而继续后面的发送过程。这个监控过程也是对多个发送信号进行同步筛选的过程,因为只有多个主机同时或在很短时间间隔(小于CAP0中断响应时间)内发送起始位时,才能成功启动发送过程。只有保证了发送过程的同步,才能应用后面的位仲裁方式。
位仲裁是依靠M37546的总线冲突检测功能完成的,其工作方式为:当串口开始接收后,在对每一位接收采样的同时,比较TxD发送的与RxD收到的数据,如果两者不同就会产生UART1总线冲突检测(U1BC)中断。
仲裁过程利用了带上拉的N沟开漏总线的特点——“线与”。当某一个主机发送“1”的时候,如果其它主机正在发送“0”,“1”就不会出现在总线上。而发送“1”的主机从总线上收到的是“0”,这会触发U1BC中断。收到中断后,这个主机应该立刻停止发送,转为接收状态,以保证其它主机发送的数据不被破坏。
本方案除了物理层的内容外,还在UART协议的基础上加入了数据帧的概念。总线上的所有设备都会收到整个数据帧。如果发现自己的ID与目的ID相同,那么对后面的数据进行接收并校验,并发出应答。其它设备收到数据帧后只提取帧的长度信息,丢弃后面的数据、校验和应答段。当后续字节达到数据长度+2后,认为此帧正常结束,总线回到空闲状态,可以启动发送。数据帧的格式见图2。
另外,协议还规定了总线等待时间。如果在一个数据帧的过程中数据中断时间超过等待时间,可以认为此次发送为非正常结束。总线回到空闲状态。
发送方如果收到不正常应答(校验出错)或者未收到应答,可以选择重新发送,但是重发的帧有可能会与其它主机发送的数据帧竞争。
保留全零ID为广播地址,以广播地址为目的ID的帧会被所有主机接收。并且不需要应答。
以上格式都是针对一般的系统而设计的,用户可以根据自己的需要来调整。比如,对于重要的数据可以用CRC校验方式代替校验和;设备较多时可以增加ID段长度等。
- 瑞萨电子32位MCU在伺服电机中的应用(10-22)
- USB3.0 主机控制器uPD720200在嵌入式媒体网关上的应用(02-24)
- 瑞萨推出基于RX的瑞萨先进电机控制算法(06-24)
- 用了这么多年的MCU,你知道哪些MCU原厂最牛?(03-14)
- 经验之谈:如何学好单片机(12-29)
- 如何学好单片机是我们一起交流的话题分享给大家!(04-14)