CP2102与C8051F040的USB-CAN转换器设计
3 USB与CAN之间协议转换的实现
设计在充分遵守USB和CAN协议的基础上,实现了USB数据与CAN数据之间的协议转换和转发。在设计过程中,USB的高速率和CAN的低速率,以及USB的大数据包和CAN的小数据包之间存在着矛盾,必须认真解决,否则可能造成数据丢失、协议转换不可靠、设备工作不稳定。本设计中USB和CAN都采用了接收中断方式,将USB和CAN的数据包先存储下来,作为缓冲进一步处理。在接收中断服务程序的数据时,只有将数据准确地收取下来,才将接收缓冲区释放,在此之前拒绝接收新的数据。在数据发送时,先确认发送缓冲区可用才写入数据。由于两端接口芯片都有内部的发送和接收缓冲区,主程序的主要任务就是完成数据的转发,以及提供通信同步的握手协议,防止数据丢失和顺序错误。
相对于CAN总线传输速率,USB总线速率要高得多,128字节的缓冲区也比CAN总线芯片8字节缓冲区大得多。因此,向CAN接口发送数据需要完成拆包和重新打包的任务,属较慢的操作,采用定时查询式发送。CAN接收任务时,每次盲接转发CAN接口收到的8字节数据到USB接口发送缓冲区,采用2个信号量(CAN―rcv,USB―wr)完成数据同步操作。数据转发工作共有以下4个任务协调配合完成。
(1)USB中断后续处理任务
CP2102接收到数据或发送完成,都会触发中断程序运行。中断处理程序只需要简单地通知此任务有中断发生,以尽量减少中断关闭的时间。因此,这个任务的优先级最高,并且一旦开始运行便不再等待其他事件,要尽快处理完成。此任务根据USB接口的不同中断原因,通知其他任务进行后续的数据处理或转发工作。
(2)控制端点信息处理任务
当USB接口接收到主机发来的USB协议信息时,此任务得到通知。根据主机的要求,该任务按照USB协议规范的数据格式对主机应答。它主要用于USB设备枚举阶段,与主机之间进行信息交换。其他时间,此任务不占用处理器时间。
(3)CAN总线发送任务
当USB接口有新的数据要转发到CAN总线时,USB中断后续处理任务通知此任务运行。读出USB芯片接收缓冲区中的数据到内存缓冲区,然后分解成小于或等于8字节的数据包,增加CAN总线协议数据包头,送入C805lF040的发送缓冲区。微处理器的主要处理时间就是USB数据包的分解和重新打包发送。
此任务占用处理器的时间最长。CAN发送任务每次等待USB接收中断触发USB_rd信号量后,开始读取CP2102接收缓冲区数据到内存数组Ep2out_Bur[128],然后采用查询式发送方式,将数据送到C8051F040的发送缓冲区,每次8字节。在查询过程中,如果C8051F040处于正在发送中,将任务休眠3个时钟嘀嗒(5 ms),然后再次查询,避免长时间占用处理器。
(4)CAN总线接收任务
当CAN总线接收到数据后,由于数据包最多只有8个字节,因此可以一次放入USB接口芯片发送缓冲区,由主机读取。此任务很少占用处理器时间。主要是为了协调CAN总线与USB总线之间数据转发的同步,使数据包可以按照原来的顺序接收到,并且不覆盖尚未发送的上一个数据包,避免数据丢失。CAN接收中断首先读C8051F040中断寄存器,清除中断标志。然后触发CAN―rcv信号量,使CAN接收任务得以运行。CAN接收任务然后等待USB发送完成中断触发USB―wr信号量,表示USB接口可以发送新的数据。由于USB接口缓冲区较大,并且发送速度快,CAN接收任务直接将CAN接收到的数据送入USB接口芯片CP2012的发送缓冲区。然后打开CAN接收中断。
结 语
在遵守USB和CAN协议的基础上,USB和CAN都采用了接收中断方式,通过通信同步的握手协议,实现了USB数据与CAN数据之间的协议转换和转发,很好地解决了USB的高速率和CAN的低速率,以及USB的大数据包与CAN的小数据包之间的矛盾,能够保证数据完整和协议的可靠转换。
评论