3편에서 예제소스와 개발 자료들을 다운로드하였으면 이제 코드를 하나씩 살펴본다.
다운로드하는 방법이 궁금하면 아래 링크를 클릭!
[nRF52832] 3. 개발 관련 자료(Layout, SoftDevice, SDK) 다운로드 방법, 가이드 (tistory.com)
[nRF52832] 3. 개발 관련 자료(Layout, SoftDevice, SDK) 다운로드 방법, 가이드
IDE 설치와 동시에 갖고 놀만한 예제와 개발에 필요한 다른 소스들도 받아보자. nrf52832를 검색한 뒤에 노르딕 홈페이지를 들어간다. nRF52832 - Versatile Bluetooth 5.2 SoC - nordicsemi.com nRF52832 - Nordic Semicond
work-with-drink.tistory.com
프로젝트를 열기 전에 Nordic Infocenter의 설명을 먼저 읽어보자
https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/spi_master_example.html
nRF5 SDK v17.1.0: SPI Master Example
The SPI Master Example demonstrates the use of the SPI or SPIM peripheral. It uses the SPI master driver. The application executes SPI transactions every 200 ms and toggles the LED when the transfer is completed. If you connect one board that runs the SPI
infocenter.nordicsemi.com
설명을 하나씩 읽어보자
The SPI Master Example demonstrates the use of the SPI or SPIM peripheral.
It uses the SPI master driver.
The application executes SPI transactions every 200 ms and toggles the LED when the transfer is completed.
SPI, SPIM을 사용하는 예제로 Master driver를 사용한다.
Master는 nRF52832가 다른 주변 소자를 제어하는 구조를 의미한다.
200ms마다 SPI 통신을 하며 통신이 완료되면 LED가 Toggle 된다,
Test the SPI Master Example application by performing the following steps
테스트하는 방법은 간단하다.
- 컴파일하고 프로그램을 다운로드한다
- 200ms마다 LED가 Toggle 되는지 확인한다.
아직 nRF52 DK가 오지 않은 상태라 직접 해보지는 못하지만 이제 코드를 열어서 같이 살펴보자.
예제 소스는 SDK폴더 내 examples 폴더에 모여있다.
그중 SPI 예제는 peripheral> spi> pca10040> blank> ses에 위치하고 있다.
spi 예제가 spi master인 듯하다.
main.c - 초기 설정
main.c를 열어보면 변수와 c파일들이 먼저 반겨준다.
spi 및 기타 gpio 제어 c파일이 include 되어있다.
gpio 제어는 LED 제어의 목적이지 않나 생각해 본다.
그 뒤로는 SPI 세팅 관련 변수 설정이다.
SPI instance를 0으로 설정하고 있고, 전송이 되었는지 확인하기 위한 flag 변수도 설정되어 있다.
아래쪽은 Tx, Rx 버퍼가 설정되어 있다.
SPI 통신으로 TEST_STRING으로 되어있는 데이터를 선송하는 듯하다.
main.c - SPI event handler
SPI가 이벤트가 발생했을 때 수행되는 handler 구문이다.
나중에 필요에 따라 해당 부분을 수정하면 된다.
지금 여기에서는 flag를 true로 변경한 뒤에 데이터가 있으면 log를 출력하는 형태로 되어있다.
main.c - main 구문
bsp_board_init에서 LED 제어 관련 세팅을 수행한다.
NRF_LOG_DEFAULT_BACKENDS_INIT(); 에서는 로그 출력 관련 초기화를 진행한다.
아래 구문이 SPI 세팅 메인 부분이다.
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
→ 기본 Setting loading
spi_config.ss_pin = SPI_SS_PIN;
spi_config.miso_pin = SPI_MISO_PIN;
spi_config.mosi_pin = SPI_MOSI_PIN;
spi_config.sck_pin = SPI_SCK_PIN;
→ SPI 통신 핀 변경
APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
→ SPI 통신 세팅 변경 및 Error 확인
main.c -main 세팅 상세(NRF_DRV_SPI_DEFAULT_CONFIG)
위의 코드에서 하나씩 뜯어보자
NRF_DRV_SPI_DEFAULT_CONFIG - nrf_drv_spi.h 위치
핀 세팅은 모두 미사용으로 설정되어 있다.
irq_priority는 인터럽트 우선순위를 의미하며 sdk_config.h에 6으로 설정되어 있다.
인터럽트 관련해서는 나중에 천천히 설명하겠다.
orc는 over-run character로, Tx 버퍼의 모든 바이트가 전송됐지만 Rx 동작 때문에 전송이 계속될 때 사용된다고 한다.
무슨 말인지 모르니 지금은 넘어가도록 하자.
frequency는 통신 주파수를 의미하며 최소 125k에서 8M까지 가능하다.
mode는 SCK핀 SPI 통신의 클럭에 대한 설정이다.
제어하고자 하는 소자에서 요구하는 스펙에 따라 다르게 설정하면 된다.
보통 Communication Timing Diagram에 설명이 나와있으니 클럭 부분을 잘 보고 설정하면 된다.
leading egde가 rising edge를 trailing edge가 falling edge를 의미하는 듯하다.
여기에서는 SCK를 High, rising edge일 때 데이터를 주고받는 듯하다.
마지막으로 bit_order는 데이터 전송 시 데이터 전송 순서를 MSB 혹은 LSB로 설정하는 부분이다.
이 역시 제어하고자 하는 소자에서 요구하는 스펙에 맞게 설정하면 된다.
main.c -main 세팅 상세(통신 핀 설정)
다시 메인으로 넘어와서 핀 세팅 부분을 살펴보자
해당 define은 sdk_config에 선언되어 있으니 하나씩 검색해 보면 직관적으로 알 수 있다.
sdk_config.h는 보드 세팅을 변경하는 부분이기 때문에 수정 후 빌드 시 오래 걸린다는 단점이 있다.
나중에는 핀 세팅하는 부분을 main.c 초기 세팅하는 부분에 놓고 바꾸면 빌드 시간을 줄일 수 있다.
main.c - 무한 루프 구문
Rx 버퍼 초기화 후 flag를 초기화한다.
그 뒤에 미리 세팅해 둔 tx 버퍼와 함께 spi 통신을 수행하고,
spi event handler에서 set 된 Flag를 확인될 때까지 대기한다.
정상적으로 종료되면 led를 toggle 하고 200ms 대기 후 반복한다.
SPI 통신 예제 소스를 한번 알아보았다.
내용이 잘못되거나 궁금한 점이 있으면 댓글로 남겨주면 확인 후 답변하겠다.
다음에는 gpio와 interrupt를 알아보도록 하자
'개발 > BLE' 카테고리의 다른 글
[nRF52832] 4-2. 예제 코드 파해치기 2탄 - Pin Change Interrupt (0) | 2023.05.03 |
---|---|
[nRF52832] 3. 개발 관련 자료(Layout, SoftDevice, SDK) 다운로드 방법, 가이드 (0) | 2023.04.12 |
[nRF52832] 2. IDE(Segger Embedded Studio) 다운로드 방법, 가이드 (0) | 2023.04.05 |
[nRF52832] 1-2. 소자 선정 방법, 가이드 2편(시리얼통신, 수급, 패키지, 보험) (0) | 2023.03.29 |
[nRF52832] 1-1. 소자 선정 방법, 가이드 1편(BLE, 내부 용량, FPU) (0) | 2023.03.22 |