I2C_outScl:发送时钟;I2C_inScl:检测时钟
I2C_outSda:发送数据;I2C_inSda:检测数据
desAddr:目的地址;msgData:发送数据
RAM_Addr:RAM的地址信号。
③I2C接收模块[7]的FPGA实现
接收模块接收到总线监视模块发送来的起始位信号后,准备接收总线上的数据,接收到的地址后,判断接收到的地址和电路板地址是否一致;当两者一致时,向总线置应答信号ACK,继续接收下面的数据,收到的数据置于接收FIFO中;如果地址不一致,则放弃总线。使用Modelsim对I2C接收模块进行仿真如图4。
I2CbusIsBusy:总线状态;I2C_start:起始信号
myAddr:电路板的地址; rxBuf:接收寄存器
rxFIFO_wr:接收FIFO的写信号
3、通讯协议
上位机和桥接板之间采用RS232总线进行数据传输,桥接卡和控制卡以及各个控制卡之间采用I2C总线进行数据的传输,通讯采用主叫和应答方式,数据传输中使用单片机进行解码[8]。
主叫方发出指令后,等待对方响应,如果主叫方写指令到被叫方,则被叫方收到指令执行操作后返回确认信号;如果从主叫方读指令,则被叫方在下一时刻占用总线后发送数据到主叫方,主叫方在0.5s内没有收到响应包,表明传输失败。若连续3次没有响应,则与对方通信连接失败。
为了实现数据的一致性,RS-232和I2C总线采用相同的通信协议。
数据传输时以“包”进行封装,中间加入长度位和奇偶校验位。封装格式:起始字符+长度字符 +序列号+源地址+目的地址包类型+传输数据+包校验+结束字符;数据传输均采用ASCII码。
包的定义:起始位定义为‘#’,占用一个字节,接收方接收到‘#’时,表明数据开始传输;长度字符定义为除起始字符、结束字符和校验字符的所有原始字符的长度,占用一个字节;源地址:发送方地址,占用一个字节;目的地址:接收方地址,占用一个字节,当为‘00’时,定义为广播地址;包类型:占用一个字节,表明数据的类型,接收方根据包类型执行对应操作;传输数据:控制量的大小;包校验:定义为长度字符,源地址,目的地址,包类型和数据之和,占用两个字节;结束位:定义为‘~’,当接收方接收到结束字符时,表明本包传输结束,对数据包进行处理,长度位和校验位正确时执行指令,否则,放弃改数据包。
4、实验结果
使用该通讯系统实现和四控制卡之间的通讯控制,使用串口助手进行数据收发,在发送数据间隔为5us的情况下对该通讯系统进行测试,在进行8小时的测试中,系统没有出现数据丢失、错误、死机现象;使用广播地址进行数据发送,返回信号正确,没出现死机现象。
使用该通讯系统对四个电机进行控制,电机实际输出情况如表1:
本实验数据证明了该通讯系统的可用性及数据传输的准确性。
使用该系统采用广播地址实现四个电机同步联动,各个轴的运动情况如表2:
本实验数据证明了各个电机实现了指定的转动角度;各个轴运动期间,电机的状态经过I2C总线[9]及RS-232总线通讯系统成功的发送到了上位机,通讯系统没有出现死机和数据丢失,经过该实验,证明了数据传输的正确性。
4、结论
本系统采用FPGA进行通讯系统的设计,提高了数据的传输率和准确性,实现了对控制机构及时、快速的控制,有效防止突发事件的处理,经实验证明,本系统快速、准确的实现了数据的传输,可以有效快速的实现对电机的速度、位置控制、准确的读取电机的编码器信号。