1. 程式人生 > >CCS+C6678LE開發記錄06:乙太網介面測試

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.

執行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);    
}

每次執行時,counter自增,這樣就能記錄TASK執行的次數。

先記錄到這裡吧,內容有點多了。

本文原創,博文地址

http://blog.csdn.net/fengyhack/article/details/43271795