網頁

2014年6月3日 星期二

[EZ-USB FX3] UART on Development Kit


從 Uart 印一些 message 作 debug 用, 是 firmware 常用的開發技巧. FX3 所附的範例中, 也有一些有印出 debug message, 不過, 實際上操作, Uart 卻是一片空白. 以下用一步一步的操作, 來確認 Uart 的問題.

1. 檢查 Uart 裝置.

現在很多電腦都沒有 Uart/RS232/COM port 這樣的介面, 取而代之的, 是 Uart-USB 的裝置很容易取得. 以下就使用 Uart-USB 來代替 UART 的輸出.
在控制台, 裝置管理員, 可以看到連接埠, 下圖中的 COM10, 就是我們要用的 Uart port.
image

2. 開啟 PC 端的終端機.

不管是用 Hyper Terminal, 或是其他隨便什麼軟體, Uart 都有一些設定要做, 不過很簡單.Port name (COM10), Speed/baud rate (115200), Data bits (8), Stop bits (1), Parity (None),Flow control (None )
image

3. 設定 DVK ( developmen kit ) 上面的 jumper.

J101 1 and 2, GPIO_46=UART_RTS, J101 用來設定 GPIO 46 當作 UART_RTS
J102 1 and 2, GPIO_47=UART_CTS, J102 用來設定 GPIO 47 當作 UART_CTS
J103 1 and 2, GPIO_48=UART_TX, J103 用來設定 GPIO 48 當作 UART_TX
J104 1 and 2, GPIO_49=UART_RX, J104 用來設定 GPIO 49 當作 UART_RX 實際上, CTS/RTS 現在已經很少用到, 所以只跳 J103/J104 也是可以的.
image

4. 開啟 USBDebug 範例. Build 完 project.

update 到 DVK 上, 嗯, 還是不 work.
image

5. 修改 USBDebug 範例.

1. cyfxusbdebug.c 的 main()
UART 的 GPIO 的設定應該和以下的程式碼相同. 如果都沒有改過, 應該是一樣的.
/* No LPP or GPIO is being used. */
io_cfg.isDQ32Bit = CyFalse;
io_cfg.s0Mode = CY_U3P_SPORT_INACTIVE;
io_cfg.s1Mode = CY_U3P_SPORT_INACTIVE;
io_cfg.useUart   = CyTrue;
io_cfg.useI2C    = CyFalse;
io_cfg.useI2S    = CyFalse;
io_cfg.useSpi    = CyFalse;
io_cfg.lppMode   = CY_U3P_IO_MATRIX_LPP_UART_ONLY;
/* No GPIOs are enabled. */
io_cfg.gpioSimpleEn[0]  = 0;
io_cfg.gpioSimpleEn[1]  = 0;
io_cfg.gpioComplexEn[0] = 0;
io_cfg.gpioComplexEn[1] = 0;
status = CyU3PDeviceConfigureIOMatrix (&io_cfg);
if (status != CY_U3P_SUCCESS)
{
    goto handle_fatal_error;
}
以上是設定的 Uart 的 IO. 但是 UART 的 config 卻沒有設, 因此要加入一個 function CyFxDebugInit ()
2. 加入 CyFxDebugInit ()
/* This function initializes the debug module. The debug prints
* are routed to the UART and can be seen using a UART console
* running at 115200 baud rate. */
void CyFxDebugInit (void)
{
    CyU3PUartConfig_t uartConfig;
    CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
    /* Initialize the UART for printing debug messages */
    apiRetStatus = CyU3PUartInit();
    if (apiRetStatus != CY_U3P_SUCCESS)
    {
        /* Error handling */
        CyFxAppErrorHandler(apiRetStatus);
    }
    /* Set UART configuration */
    CyU3PMemSet ((uint8_t *)&uartConfig, 0, sizeof (uartConfig));
    uartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200;
    uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT;
    uartConfig.parity = CY_U3P_UART_NO_PARITY;
    uartConfig.txEnable = CyTrue;
    uartConfig.rxEnable = CyFalse;
    uartConfig.flowCtrl = CyFalse;
    uartConfig.isDma = CyTrue;
    apiRetStatus = CyU3PUartSetConfig (&uartConfig, NULL);
    if (apiRetStatus != CY_U3P_SUCCESS)
    {
        CyFxAppErrorHandler(apiRetStatus);
    }
    /* Set the UART transfer to a really large value. */
    apiRetStatus = CyU3PUartTxSetBlockXfer (0xFFFFFFFF);
    if (apiRetStatus != CY_U3P_SUCCESS)
    {
        CyFxAppErrorHandler(apiRetStatus);
    }
    /* Initialize the debug module. */
    apiRetStatus = CyU3PDebugInit (CY_U3P_LPP_SOCKET_UART_CONS, 8);
    if (apiRetStatus != CY_U3P_SUCCESS)
    {
        CyFxAppErrorHandler(apiRetStatus);
    }
    CyU3PDebugPreamble (CyFalse); }
3. 呼叫 CyFxDebugInit()
在 ApplnThread_Entry() 中, 呼叫 CyFxDebugInit () /* Entry function for the AppThread. */
void
ApplnThread_Entry ( uint32_t input)
{
    CyFxDebugInit();
    /* Initialize the logger application */
    CyFxApplnInit();
    for (;;)
    {
        CyU3PThreadSleep (1000);
        if (glIsApplnActive)
        {
            CyU3PDebugPrint (2, "USB Debug logger: time from start in ticks: %d\n", CyU3PGetTime ());
        }
        CyU3PDebugPrint (2, "USB Debug Hello: %d\n", CyU3PGetTime ());
    }
}
到這邊應該就可以在 PC 上看到 debug message 了, 不過, 還有一些地方要注意  

Note

1. FX3 的 Uart 不會立刻顯示. 大約要幾秒鐘之後, PC 上才會開始看到字. 並不是 delay, 而是 Uart 要過幾秒鐘才有作用. 2. 文字偏移, 沒有回到左邊界. 如果 PC 的軟體沒有自動把“\n” 取代成 “\r\n” 就會造成文字一直偏移. 這時可以自己加. 例如 :
CyU3PDebugPrint (2, "USB Debug Hello: %d\n", CyU3PGetTime ());
改成
CyU3PDebugPrint (2, "USB Debug Hello: %d\r\n", CyU3PGetTime ());



















沒有留言:

張貼留言

請提供您寶貴的意見