作者:Steve Leibson, 赛灵思战略营销与业务规划总监
亚当泰勒
我前面几篇博文中的案例,需要通过RS-232(事实上是一个USB转串口的设备)来控制Adafruit NeoPixel阵列中的每一个RGB LED像素的设置。因此我需要在PC(DTE)和MicroZed(DCE)之间实现一个基本的通信协议。
我将要使用Zynq PS中的UART来发送和接收数据,在BSP中,它被声明为STDIO,如下所示:
这个声明允许我使用getchar()函数来实现NeoPixel通信协议。
这是因为我不想重新去创造一个新的协议—为什么每个工程师都要这样做呢?—这个简单的协议使用8位ASCII字符交换数据。(这是一个ASCII码表)使用这个协议,通过发送下面这样的数据格式,就能对每一个像素进行设置。
使用这个协议来更新若干个像素,每一个像素都需要通过上面的那个包格式进行更新,这些包是按顺序发送的,速率是115200bps,不带奇偶校验。
使用这个协议,可以根据FPGA中用于存储像素值的内部存储器的大小来决定NeoPixel条的长度,因为FPGA存储器可以存储4096个像素,所以LED条可以非常长,对于喜欢冒险的设计人员来说,可以很容易地在几分钟内就能增加它的长度。
在软件上,我要做的事情是实现一个简单的状态机,在各个状态中循环,接收像素值,然后把接收到的数据存储到Block RAM正确的位置上。
当通过串口连接接收到所有的数据后,接收到的红、绿和蓝的字节被组合成一个24位字的格式,然后写到FPGA Block RAM的正确的地址上,这样,如果像素被使能,Zynq SoC PL可以给它们设置相应的颜色。
总之,这是一个非常简单的通信协议。但是,在发送数据的时候,有时候会出现一些通信通道的问题(比如噪声或者毛刺),这可能会对性能产生不良影响,这也就是为什么这个协议必须要能够处理错误的原因。
实现这个协议的状态机仅仅需要用到7个状态,在下面的附件中可以看到这些状态。这个代码还不是最终版本,因为还需要编写代码,通过串行连接对接收到的数据进行响应,这样就能使用一个简单的终端程序对串行接口进行校验。这是我的验证策略的一部分,在我发表的上一篇博文中已经讨论过了(“亚当泰勒玩转MicroZed连载35:用MicroZed驱动Adafruit RGB NeoPixel LED阵列(第6节)”)
我使用的RS-232终端程序叫做termite,它有一个hex-view插件,这样我就能直接发送16进制码。这个方法使得我能非常容易在笔记本电脑上发送16进制码,来测试协议是否能像预期的那样工作,同时,可以通过破坏数据来检查错误处理能力以及协议的可恢复性。这是一张termite终端应用的截图:
上一篇博文中讲了验证的内容,这篇博文中讲了串行接口。在我的下一篇博文中,我将要描述GUI的开发和最终系统的测试。然后,我将要开始介绍学习使用Zynq的更多令人兴奋的方面。
这个例子对你有用吗?
原文链接:
http://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chro...
© Copyright 2014 Xilinx Inc
如需转载,请注明出处
附件 | 大小 |
---|---|
Adam Taylor Part 36 som_7_code.pdf | 31.97 KB |