有关64570的介绍网上很多,可以自行google,下面是我用64570实现的SDLC协议程序一些总结.
所使用到的主要寄存器
MD0:发送协议,CRC校验
MD1:HDLC协议中地址配置
MD2:全双工,数据编码
RXS:接收时钟
TXS
TMC:和TXS中的BR一起配置波特率的值
SA0:
SA1:地址设定,这个主要是在接收数据的时候,如果地址不相同,那么芯片会将这一帧的数据丢弃。在发送数据的时候,芯片不会自动的将SA0 SA1发送出去,需要将SA0和SA1当做普通数据一样发送出去
TRC0:当FIFO中的数据字节数小于等于TRC0,那么ST0中的TXRDY会自动变成1。
TRC1:当FIFO中的数据字节数大于TRC1+1,那么ST0中的TXRDY会自动变成0。
RRC:当FIFO中的数据大于RRC时,ST0中的RXRDY会变成1。
CMD:命令配置,包括寄存器复位,允许发送,接收。等
发送流程:发送数据时,首先CMD写21,复位寄存器,然后配置上面提到的寄存器,然后CMD写02,此时便可以进行发送。首先读取ST0中TXRDY,当其为1时,可以发送数据(往TRBL写数据),当发送数据总的字节数等于规定的字节数时,需要判断ST3中的第0位,表示当前发送缓冲器中的数据是否已经全部发送出去,如果已经全部发送出去,便可进行下一次发送,注意,64570如果要再次发送数据,必须需要重新配置(可能应该是CMD写02即可,但是在我的程序里,重新配置比较容易)。
接收流程:接收数据时,首先CMD写21,复位寄存器,然后配置上面提到的寄存器,然后CMD写12,便可进行数据接收。首先读取ST0中的RXRDY,当其为1时,表示可以接收数据,每接收一字节数据后,最好先读CST0,看当前数据是否接收完毕,如果没有再去查询ST0,重复,直到CST0表示数据接收完毕,这样做的好处是可以接收任意长度的数据,而不用事先定义接收字长。
还可能用到的寄存器:ST2或FST,里面有一位是CRC校验位,表明当前接收的数据CRC校验是否出错。
附录是我编写的程序实现的功能:使用Altera Cyclone EP1C6Q240,Quartus8.0,Verilog
1 发送格式是SDLC协议,带地址和CRC校验 即
7E SA0 SA1 DATA CRC 7E
2 控制命令字用来控制接收或发送切换,包括:①只接受②只发送③先接受再发送④先发送再接收
3 超时判断,当数据发送出去后,如果对方在规定时间内没有返回数据或CRC校验错误,重发一次,如果三次都没有成功,则提示超时或者是CRC错误。
4 由于64570有两个通道,本程序使用通道0作发送,通道1作接收,如果在板子上将通道0的TXD和通道1的RXD,TXC和RXC连在一起,那么发送出去的数据直接可以在通道1接收到。
5 配置参数以mif文件的形式初始化在ROM中,更改时直接修改mif文件即可。
6 发送数据可以通过in-system memory直接编辑,接收到的数据也可以通过in-system memory查看,控制命令字,启动发送,发送数据长度都可直接在in-system memory中修改。
工程打包 自行将zip格式改成rar格式