打印

CCS+C6678LE开发记录06:以太网接口测试

[复制链接]
868|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FCCdsp|  楼主 | 2017-9-27 12:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CCS+C6678LE开发记录06:以太网接口测试


引言:为什么想要测试以太网接口?

-----------------------------------------------------------------------------------------------------------

这期间一直在摸索着如何通过C6678的以太网接口传输数据,但一直不知道如何下手。

我想测试C6678的以太网接口(以下简称ETH),一方面是因为ETH从没测试过,另一方面是因为USB太慢了。

用数据来说话吧,我写了一个简单的测试程序,通过USB连接PC在CCS中调试(单核运行),读取一张BMP图片

然后做简单处理。

对于一张400*300像素大小的图片,读取用时半分钟以上,如果是大尺寸图片,例如1024*768可能需要几分钟。

实在是太慢了,主要是慢在USB传输过程,因为数据传输完成后进行的处理速度很快。

这也加速了我要测试ETH接口的计划。虽然早有计划但一直没能完成,今天终于迈出了第一步,值得记录下来。

-------------------------------------------------------------------------------------------------------------

好了,开始正题。


软件准备。

首先,开发环境为CCSv6,安装MCSDK为最新版,请到TI官网查找并下载。

安装文件

bios_mcsdk_02_01_02_06_setupwin32.exe

补丁包

bios_mcsdk_02_01_02_06_patch01_setupwin32.exe


安装完成之后在CCS的[Window]-->[Preferences]首选项设置中选择Code Composer Studio下的RTSC选项卡

点击Products,添加搜索目录(上述MCSDK安装目录,假设为D:/Texas/SDK)

搜索到新安装的产品后会自动弹出安装窗口,选择所有产品(除了某一项,参见后文)然后确定。


注意!!!目前已确认NDK_2_21_01_38产品存在一些问题,如果选择安装会导致出错。

因此每次安装新产品后请不要选择这一项,即使选择也会提示出错的。


安装完成之后就可以导入官方提供的NDK测试用例。

假设MCSDK安装目录同上D:/Texas/SDK

那么NDK测试用例应该在./mcsdk_2_01_02_06/examples/ndk这个目录下

如果要导入C6678的helloWorld示例,那么请切换到子目录helloWorld/evmc6678l

[菜单]-->[File]-->[Import]


如果导入之后发现有些文件没有COPY进来,可以这样:在该项目右键选择[属性]


弹出属性设置对话框,选择[编辑]


浏览该文件所在路径

以helloWorld.c文件为例,它的路径应该是刚才导入示例时坐在的文件夹

点击[File...]按钮以浏览


设置完毕之后就可以编译并测试了。


硬件准备。

一般情况不用做任何硬件设置。但是,在这个示例中,需要更多的硬件配置过程。


开发板的BootMode设置,在断电条件下(废话)拨动SW3~SW6各开关至No Boot模式

其次是设置网络接口IP为静态的,这需要拨动SW9的第2个开关,具体如下


其实也很简单,就是把最靠左/右边的两个开关拨至OFF,其余均拨至ON即可。



测试过程记录。


为了能与PC进行通信,还需要设置IP为特定区段,即与PC处于同一个LAN区段。

在PC上执行ipconfig /all可以查看到本机(PC)的IP为169.254.11.118 (掩码255.255.0.0)

为了方便可以将C6678的IP设置为169.254.11.119

注意这个IP地址在不同PC上肯定会不同,需要根据具体情况进行设置,要求就是两个IP处在同一网段能够直接通信。

至于PC的MAC地址,通过上述命令也能看到,如果程序需要用到,直接填写即可。


IP地址修改后的代码片段如下

char *HostName    = "TMS320C6678";
char *LocalIPAddr = "169.254.11.119";   // My PC Local IP

//......省略......

/* MAC address for my PC */
Uint8 clientMACAddress[6] = {0x5C, 0x26, 0x0A, 0x69, 0x44, 0x0B};

//......省略......

// If the IP address is specified
    if (!platform_get_switch_state(1))
    {
        printf("IP address is specified.\n");
        CI_IPNET NA;
        CI_ROUTE RT;
        IPN      IPTmp;
        // Setup manual IP address
        bzero( &NA, sizeof(NA) );
        NA.IPAddr  = inet_addr(LocalIPAddr);
        NA.IPMask  = inet_addr(LocalIPMask);
        strcpy( NA.Domain, DomainName );
        NA.NetType = 0;

        //...

    }

//......省略......


在CCS中添加ccxml文件然后给core0添加gel文件

启动调试,GEL配置后启动调试的部分输出如下

  • C66xx_0: GEL Output: Setup_Memory_Map...  
  • C66xx_0: GEL Output: Setup_Memory_Map... Done.  
  • C66xx_0: GEL Output:   
  • Connecting Target...  
  • C66xx_0: GEL Output: DSP core #0  
  • C66xx_0: GEL Output: C6678L GEL file Ver is 2.005   
  • C66xx_0: GEL Output: Global Default Setup...  
  • C66xx_0: GEL Output: Setup Cache...   
  • C66xx_0: GEL Output: L1P = 32K     
  • C66xx_0: GEL Output: L1D = 32K     
  • C66xx_0: GEL Output: L2 = ALL SRAM     
  • C66xx_0: GEL Output: Setup Cache... Done.  
  • C66xx_0: GEL Output: Main PLL (PLL1) Setup ...   
  • C66xx_0: GEL Output: PLL not in Bypass, Enable BYPASS in the PLL Controller...   
  • C66xx_0: GEL Output: PLL1 Setup for DSP @ 1000.0 MHz.  
  • C66xx_0: GEL Output:            SYSCLK2 = 333.3333 MHz, SYSCLK5 = 200.0 MHz.  
  • C66xx_0: GEL Output:            SYSCLK8 = 15.625 MHz.  
  • C66xx_0: GEL Output: PLL1 Setup... Done.  
  • C66xx_0: GEL Output: Power on all PSC modules and DSP domains...   
  • C66xx_0: GEL Output: Security Accelerator disabled!  
  • C66xx_0: GEL Output: Power on all PSC modules and DSP domains... Done.  
  • C66xx_0: GEL Output: PA PLL (PLL3) Setup ...   
  • C66xx_0: GEL Output: PA PLL Setup... Done.  
  • C66xx_0: GEL Output: DDR3 PLL (PLL2) Setup ...   
  • C66xx_0: GEL Output: DDR3 PLL Setup... Done.  
  • C66xx_0: GEL Output: DDR begin (1333 auto)  
  • C66xx_0: GEL Output: XMC Setup ... Done   
  • C66xx_0: GEL Output:   
  • DDR3 initialization is complete.  
  • C66xx_0: GEL Output: DDR done  
  • C66xx_0: GEL Output: DDR3 memory test... Started  
  • C66xx_0: GEL Output: DDR3 memory test... Passed  
  • C66xx_0: GEL Output: PLL and DDR Initialization completed(0) ...  
  • C66xx_0: GEL Output: configSGMIISerdes Setup... Begin  
  • C66xx_0: GEL Output:   
  • SGMII SERDES has been configured.  
  • C66xx_0: GEL Output: Enabling EDC ...  
  • C66xx_0: GEL Output: L1P error detection logic is enabled.  
  • C66xx_0: GEL Output: L2 error detection/correction logic is enabled.  
  • C66xx_0: GEL Output: MSMC error detection/correction logic is enabled.  
  • C66xx_0: GEL Output: Enabling EDC ...Done   
  • C66xx_0: GEL Output: Configuring CPSW ...  
  • C66xx_0: GEL Output: Configuring CPSW ...Done   
  • C66xx_0: GEL Output: Global Default Setup... Done.  
  • C66xx_0: GEL Output: Invalidate All Cache...  
  • C66xx_0: GEL Output: Invalidate All Cache... Done.  
  • C66xx_0: GEL Output: GEL Reset...  
  • C66xx_0: GEL Output: GEL Reset... Done.  
  • C66xx_0: GEL Output: Disable all EDMA3 interrupts and events.  

[color=rgb(51, 102, 153) !important]复制代码

执行main函数之前会执行EVM_init()函数,随后继续,输出结果如下


此时等待PC操作,通过网线连接PC和C6678的ETH,然后在PC上执行helloWorld.exe

(这个文件在D:/Texas/SDK/ndk_2_21_02_43/packages/ti/ndk/winapps目录下)


这是CCS的控制台窗口会有响应,在PC段多次执行这个测试程序,在CCS窗口中会有如下输出


测试了十几次都响应正常。

其中TASK所在udpHello.c文件中,具体内容如下

  • int dtask_udp_hello( SOCKET s, UINT32 unused )  
  • {  
  •     static int counter=0;  
  •     printf("TASK execution %d\n",++counter);  
  •     struct sockaddr_in sin1;  
  •     struct timeval     to;  
  •     int                i,tmp;  
  •     char               *pBuf;  
  •     HANDLE             hBuffer;  
  •   
  •     (void)unused;  
  •   
  •     // Configure our socket timeout to be 3 seconds  
  •     to.tv_sec  = 3;  
  •     to.tv_usec = 0;  
  •     setsockopt( s, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof( to ) );  
  •     setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof( to ) );  
  •   
  •     for(;;)  
  •     {  
  •         tmp = sizeof( sin1 );  
  •         i = (int)recvncfrom( s, (void **)&pBuf, 0, (PSA)&sin1, &tmp, &hBuffer );  
  •   
  •         // Spit any data back out  
  •         if( i >= 0 )  
  •         {  
  •             sendto( s, pBuf, i, 0, (PSA)&sin1, sizeof(sin1) );  
  •             recvncfree( hBuffer );  
  •         }  
  •         else  
  •             break;  
  •     }  
  •   
  •     // Since the socket is still open, return "1"  
  •     // (we need to leave UDP sockets open)  
  •     return(1);      
  • }  

[color=rgb(51, 102, 153) !important]复制代码

每次执行时,counter自增,这样就能记录TASK执行的次数。




相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

967

主题

1447

帖子

9

粉丝