TI C6678 的DSP支持多种通信方式,通过以太网口实现TCP/UDP的通信就是方法之一。本文主要考虑如何实现DSP与PC间的网络通信和数据传输,因此内容较为简单,只是对TI已有的范例进行一些修改。关于使用C6678 DSP来实现网络应用并进行网络开发,那已经不是本文的讨论内容,更多内容可以参考TI NDK User Guide 和 TI NDK API Reference Guide 两本技术手册。
首先确保在CCS的目录下已经安装了合适版本的MCSDK和NDK。关于网络通信,TI在 TI NDK User Guide 的第二章Example Applications中介绍的两个例子都可以在MCSDK下找到,例如在我的电脑上就是C:\ti\mcsdk_2_01_02_05\examples\ndk。后面的内容都是在client工程的基础上作修改的,因此我们在这里导入在CCS中导入client工程。
导入之后尝试是否能够编译成功,如果编译报错,请根据相应的提示修改工程。(可能是include位置设置地不对等问题)。
编译成功之后连接DSP开发板尝试运行调试(Run – Debug),在调试过程中如果遇到报错请检查以下几项:(注意到此为止我们还没有修改工程的源代码)
- 是否在运行前对DSP开发板进行了Reset? (必须进行!)
- 工程是否运行在Core0?(不能运行在其他Core)
- DSP的Boot模式是否已切换到 I2C POST boot?(不能在 IBL NOR boot on image 0 (default)模式)
在初步的调试成功后还不能正确地执行工程应用,我们首先需要对代码做一些修改。
首先,将Line: 80附近的LocalIPAddr,LocalIPMask,GatewayIP,DNSServer 改成PC 所在网段的相应内容。因为我所在的实验室采用固定IP,因此直接给DSP赋予了一个固定的IP地址(这里以196.12.1.14为例)。如果所在网段采用动态IP,请参考DHCP设置的相关内容。
更改上面的内容,并重新编译运行后,在C:\ti\ndk_2_21_01_38\packages\ti\ndk\winapps可以找到相关的PC机上可以运行的客户端程序。在控制台运行
- send 196.12.1.14
- recv 196.12.1.14 100
- echoc 196.12.1.14 100
分别可以在PC的控制台和CCS的控制台看到相应的运行结果。
因为我自己要实现的是采用DSP作文控制器,对以太网传来的数据进行运算并将控制率传回,因此我考虑的是修改工程中与echo相关的代码,把自己用于控制率运算的函数插入进去。
首先我们看client.c文件,在DSP的初始化配置完成后,系统会调用NetworkOpen()函数,在该函数中,我们看到下面一条指令:
hEcho = DaemonNew( SOCK_STREAMNC, 0, 7, dtask_tcp_echo, OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
这条指令的作用是开启一个用于应答echo的进程,其中其他参数的作用暂时不管,我们主要关心 dtask_tcp_echo
这个参数。这是一个函数句柄,表示对于echo的应答由dtask_tcp_echo
这个函数完成。而这个函数的具体实现是在C:\ti\ndk_2_21_01_38\packages\ti\ndk\tools\servers下的newservers.c文件里。
我曾经尝试直接修改newservers.c中的dtask_tcp_echo
函数,但是编译运行后并没有得到期望的结果,具体原因我也不是很清楚。但是我的解决方法是将原先的
hEcho = DaemonNew( SOCK_STREAMNC, 0, 7, dtask_tcp_echo, OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
指令注释掉,并替换成自己定义的:
myhEcho = DaemonNew( SOCK_STREAMNC, 0, 7, my_dtask_tcp_echo, OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
然后自己仿照newservers.c中的dtask_tcp_echo
函数重新写一个自己的my_dtask_tcp_echo
函数。并把自己的计算操作插入到函数中的合适位置。同时要注意TCP的传输中是以byte为单位的,在数据传输前后要进行一定的数据封装和解封装操作。(相关内容可参考我的另一篇博客:TI C6678 DSP与PC Matlab 串口通信研究)。
为了进行测试,可以改写C:\ti\ndk_2_21_01_38\packages\ti\ndk\winapps下的echoc.c代码,加入自己用于测试的计算操作。同时注意注释掉echoc.c中对于接受的数据进行校验的操作,因为在原本的功能中,echoc.c如果发现收到的数据和发出的数据不一致,将会终止通信并返回错误信息。
Ref.
TI Network Developer Kit (NDK) v2.21 Users Guide
TI Network Developer Kit (NDK) v2.21 API Reference Guide
TI E2E Comunity