터치패드 센싱하기#1 - 프로젝트 준비

flimbs·2021년 5월 14일
1
post-thumbnail

인트로

나는 입력장치가 너무너무 좋다.
좋아하는 마음을 억누를수가 없어서 일단 터치패드 모듈을 샀다.

Azoteq IQS55EV02
EV 키트인거같다.

그리고 깃허브를 팠다.
깃허브 주소

내가 꾸준하다면 참 좋을텐데..

개발 환경

  • Segger embedded studion
  • nRF52-DK
  • nRF5 SDK v16.0.0
  • RTT Viewr
  • Azotec IQS550EV02-S

프로젝트 세팅

일단 제일 만만한 예제 twi_scanner 를 가져왔다.
nRF52_SDK_16.0.0_98a08e2\examples\peripheral\twi_scanner
로 가면 있다.

나는 보통 SDK폴더 바로밑에 내 폴더 만들어서
nRF52_SDK_16.0.0_98a08e2\flimbs\20210515_azotec_iqs550ev02\twi_scanner
같은 식으로 많이 사용한다.

twi_scanner\pca10056\blank\ses\twi_scanner_pca10056.emProject

일단 RTT 로 로그를 찍을거니까 sdk_config.h 를 열어서 수정해준다. 모든 예제들은 UART로그가 디폴트더라. UART도 꺼주자

NRF_LOG_BACKEND_RTT_ENABLED 1
NRF_LOG_BACKEND_UART_ENABLED 0
SEGGER_RTT_CONFIG_BUFFER_SIZE_UP 4096 //로그 버퍼를 키운다.

깃허브 세팅

.gitignore 세팅을 해준다.
이거 잘못 세팅하면 나중에 대환장파티 열린다.
stm 등 다른 프로젝트도 염두해뒀단점 참고해주세여

*.axf
*.swp
*.htm
*.Inp
*.map
*.tra
*.dep
*._2i
*.l2p
*.__i
*.fed
*.crf
*.d
*.o
*.lst
*.lnp
*.bak
*.scvd

*.ini
*.iex
*.sct
*.uvgui.*
*.uvguix.*
*.tmp
**/JLinkLog.txt
**/_viminfo
**/_vimtags
_build/
RTE/

## Segger Embedded Studio ##
*.jlink
*.emSession
**/ses/Output/

## Visual Studio Code ##
.vscode/
.history/

##STM##
*.dep
*.pdb
*.spy
*.stw
*.wdb
*.wed
Debug
Release

*.rej

이 프로젝트는 git 에 올리려 따로 SDK를 복사했지만 테스트용으로 쓰는 프로젝트는 SDK 하나를 이니셜커밋 해놓고 프로젝트마다 브랜치를 따서 쓰고있다.

I2C 주소 스캔

라곤 했지만 선을 연결하고 그냥 아까 불러온 예제 프로젝트를 실행하는것 뿐이다.

물론 디바이스 주소는 문서를 보면 나와있다. 하지만 프로젝트 생성한게 기쁘니깐 실행해보자.

보드를 보면 납땜을 할수있는 포트가 있다.
RDY, RST, GND, 3V3, SCL, SDA 라고 써있다.

SCL과 SDA 가 통신선,

VCC GND는 문서를 보고 연결하자. 3.3V다.
nRF52 DK 에는 3.3V(멀티미터로 찍어보면 2.9V 정도 나오온다.) 포트가 있다. 그걸 사용하자.

RST포트가 있다. 이걸 High로 넣어줘야 도는 애들이 종종 있다.

RDY는 인터럽트 선 인것같다.

일단 막무가내로 실행시켜보았다

퍄..

연결이 잘못됐나 확인해본다. 이럴때 로직아날라이저가 있으면 유용하다.

확인해보니 DK는 잘못이없다.

아까부터 신경쓰였던 RST포트를 문서에서 찾아본다.

EV키트인만큼 문서가 참 잘되어있다.
일단 찾아볼수있는건
IQS550EV02 Datasheet 키트의 전반적 스펙 문서
IQS5xx-B000 Datasheet 프로토콜, 사용법등을 다룬 문서
Arduino Example 실제 동작하는 아두이노 예제

이외에도 부트로더 문서나 세팅용 프로그램 등의 파일을 찾을수 있는데 일단 RST핀에 집중하자.

실제 프로토콜에 대한 설명이 있는문서는 IQS5xx-B000 Datasheet이다.

리셋에 관한 내용이다. 우리가 보고있는건 NRST 핀이고 Active Low 니깐 High로 바꿔놓고 다시 테스트해본다.

    nrf_gpio_pin_dir_set(PIN_RST,NRF_GPIO_PIN_DIR_OUTPUT);//RST 핀을 Output으로 설정
    
    nrf_gpio_pin_write(PIN_RST,1); //RST핀을 High로 변경
    
    for (address = 1; address <= TWI_ADDRESSES; address++)//1에서 127까지 RX를 던져 ACK 가 나오는지 확인
    {
        err_code = nrf_drv_twi_rx(&m_twi, address, &sample_data, sizeof(sample_data));
        if (err_code == NRF_SUCCESS)
        {
            detected_device = true;
            NRF_LOG_INFO("TWI device detected at address 0x%x.", address);
        }
        NRF_LOG_FLUSH();
    }    

    if (!detected_device)
    {
        NRF_LOG_INFO("No device was found.");
        NRF_LOG_FLUSH();
    }

결과는!

실패!

왜?

문서를 다시본다. Suspend 항목에 의심가는 내용이 있다.

슬립상태에 들어가있을땐 첫번째 I2C 리퀘스트에 NCK를 보내고 150us 내에 들어온 두번째 리퀘스트에 ACK 응답을 한다는것.

스캐닝 for문은 각 주소를 한번씩만 스캔하기때문에 NCK가 들어오는건 당연한얘기였던것.

for문 속에서 주소를 두번씩 스캔하도록 변경한다.

   nrf_gpio_pin_dir_set(PIN_RST,NRF_GPIO_PIN_DIR_OUTPUT);    
   
   nrf_gpio_pin_write(PIN_RST,1);

   for (address = 1; address <= TWI_ADDRESSES; address++)
   {
     for(uint8_t i=0; i<2; i++)//두번돌림
     {
       err_code = nrf_drv_twi_rx(&m_twi, address, &sample_data, sizeof(sample_data));
       if (err_code == NRF_SUCCESS)
       {
           detected_device = true;
           NRF_LOG_INFO("TWI device detected at address 0x%x.", address);
       }
       NRF_LOG_FLUSH();
     }
   }    

   if (!detected_device)
   {
       NRF_LOG_INFO("No device was found.");
       NRF_LOG_FLUSH();
   }

결과는...

얄루!

오늘의 삽질 히스토리

테스트1 -> 주소 못찾음 -> 로직아날라이저로 DK동작검증 -> 문서 확인하여 RST핀 사용법확인 -> RST High로 전환하도록 변경
테스트2 -> 주소 못찾음 -> 문서 확인하여 I2C Wake 항목 확인 -> 루프안에서 2번씩 RX를 하도록 코드변경
테스트3 -> 주소 찾음

생각보다 길어졌는데 사실 이친구가 좀 특이케이스 이긴하다.

통신을 뚫다가 생기는 문제점은 대부분 매뉴얼을 제대로 안봐서 생기더라.

나도 처음에 몇번 고생한뒤로는 매뉴얼을 두세번 보고 시작한다.

지금은 즐겁자고 하는 코딩이니깐 얼레벌레 진행하는거구...

일단 여기까지 커밋을 하고.

다음엔 첨부된 샘플 코드를 분석해서 진짜 데이터를 가져와보쟝

profile
얄루

0개의 댓글