페이지

글목록

2016년 2월 6일 토요일

[dialog] I/O control, UART Tx Write Test with DSPS (DA14580) (2/3)

이번에는 지난 번에 만들어 놓은 Timer callbak 함수 내에 일정한 주기로 포트를 읽어서 입력된 포트값의 상태를 읽어서 UART에 Write 하는 동작을 테스트 해 보겠습니다.

먼저, 입력 포트를 추가합니다.

periph.c 의 GPIO_reservations 함수에 다음을 추가합니다. Expert Kit 의 스위치는 2개가 있는데, P0_6 과 P1_1 이어서 이 2개의 포트를 추가합니다.

void GPIO_reservations(void)
{
   RESERVE_GPIO(SW0, GPIO_PORT_0, GPIO_PIN_6, PID_GPIO);    // SW IN(K2)
   RESERVE_GPIO(SW1, GPIO_PORT_1, GPIO_PIN_1, PID_GPIO);    // SW IN(K1)
   
   RESERVE_GPIO(LED, LED_PORT, LED_PIN, PID_GPIO);    // LED OUT

   RESERVE_GPIO( UART1_TX, UART1_TX_PORT, UART1_TX_PIN, PID_UART1_TX);  
   RESERVE_GPIO( UART1_RX, UART1_RX_PORT, UART1_RX_PIN, PID_UART1_RX);
#if (UART_HW_FLOW_ENABLED) 
   RESERVE_GPIO( UART1_RTS, UART1_RTS_PORT, UART1_RTS_PIN, PID_UART1_RTSN);  
   RESERVE_GPIO( UART1_CTS, UART1_CTS_PORT, UART1_CTS_PIN, PID_UART1_CTSN);
#endif /*UART_HW_FLOW_ENABLED*/
}

set_pad_functions 함수에도 코드를 추가합니다.
void set_pad_functions(void)        // set gpio port function mode
{
   GPIO_ConfigurePin(GPIO_PORT_0, GPIO_PIN_6, INPUT_PULLUP, PID_GPIO, true);
   GPIO_ConfigurePin(GPIO_PORT_1, GPIO_PIN_1, INPUT_PULLUP, PID_GPIO, true);

   GPIO_ConfigurePin(LED_PORT, LED_PIN, OUTPUT, PID_GPIO, false);

    GPIO_ConfigurePin( UART1_TX_PORT, UART1_TX_PIN, OUTPUT, PID_UART1_TX, false );
    GPIO_ConfigurePin( UART1_RX_PORT, UART1_RX_PIN, INPUT_PULLUP, PID_UART1_RX, false );
#if (UART_HW_FLOW_ENABLED) 
    GPIO_ConfigurePin( UART1_RTS_PORT, UART1_RTS_PIN, OUTPUT, PID_UART1_RTSN, false );
    GPIO_ConfigurePin( UART1_CTS_PORT, UART1_CTS_PIN, INPUT_PULLUP, PID_UART1_CTSN, false );
#endif /*UART_HW_FLOW_ENABLED*/
}



다음으로, 지난번에 만들어 두었던 타이머 인터럽트에 의해 1초마다 콜백되는 timer0_general_user_callback_function 함수에 포트를 읽어서 UART로 송신하는 프로그램을 추가해 보겠습니다.

UART에 Write 하는 방법은 사실 좀 오랫동안 찾아 해메다가 알아냈습니다. 좀 편법적인듯도 하지만 동작은 잘 되네요. DSPS 프로그램은 버퍼가 2개 있는데 1)BLE 쪽 송/수신 버퍼 와 2)UART 송/수신 버퍼 입니다. DSPS 동작 특성은 BLE 로 받으면 무조건 UART로 보내게 되어 있으므로 BLE 수신 버퍼에 데이터를 Write 하면 UART에 출력됩니다. 이 버퍼는 링버퍼로 이루어져 있는데 아무 때나, 버퍼에 최대 용량 이내로 데이터를 넣어주면 UART로 출력되고, 다 나가면 버퍼는 비워집니다.

쉽게 말하면, da14580을 BLE에서 데이터가 들어온 것으로 속이는 것입니다.
BLE 수신시 링버퍼에 데이터를 넣는(push) 함수가 app_ble_push() 입니다.
이 함수에 전송할 데이터와 데이터 갯수를 전달해 주면 UART에 출력됩니다.

void timer0_general_user_callback_function(void) 
{
   static uint8_t n = 0;
   static uint32_t cnt_100ms = 0;
   uint8_t try_test[100];
   uint16_t port_Input=0;

   cnt_100ms++;
    // when pass  10 * 100ms
    if ( 10 == n ) 
    {
      port_Input = GPIO_GetPinStatus(GPIO_PORT_0,GPIO_PIN_6) + ((GPIO_GetPinStatus(GPIO_PORT_1,GPIO_PIN_1))<<1 span="">

      sprintf((char *)try_test,"time = %8d ms , Port state : %01X\n\r\0",(cnt_100ms*100),port_Input);

      app_ble_push(try_test,size_user_str(try_test));
       n = 0;
        if (GPIO_GetPinStatus(LED_PORT, LED_PIN))
        {
            GPIO_SetInactive(LED_PORT, LED_PIN);
        }
        else
        {
            GPIO_SetActive(LED_PORT, LED_PIN);
        }
     }
     n++;
}

자 그럼, 출력된 UART 를 터미날로 볼까요?


버튼 상태가 잘 읽히고, DA14580을 속여서 UART로 데이터가 잘 송신되고 있습니다. ^^

댓글 없음:

댓글 쓰기