nRF5x 를 이용하는 프로젝트는 대부분 IOT용 센서가 많이 있으므로 I2C 는 가장 기본이 될것 같다.
nRF5 SDK에서 제공하는 I2C 예제를 이용하여 테스트 해보자.
[nRF52 xBee EVM] 보드의 I2C는 IO26, IO25에 할당되어 있다.
pca10028.h 파일에서 핀맵을 [nRF51822 xBee EVM] 보드에 맞도록 수정 한다.
//#define ARDUINO_SCL_PIN 7 // SCL signal pin
//#define ARDUINO_SDA_PIN 30 // SDA signal pin
#define ARDUINO_SCL_PIN 26 // SCL signal pin
#define ARDUINO_SDA_PIN 25 // SDA signal pin
기본 소스코드를 구동하면 시리얼 포트로 아무런 출력이 나오지 않는다.
뭐가 문제 일까?
NRF_LOG_INFO() 함수에서 시리얼 포트로 출력 하는것 같은데...
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_INFO("TWI scanner.\r\n");
NRF_LOG_FLUSH();
twi_init();
for (address = 1; address <= TWI_ADDRESSES; address++)
{
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.\r\n", address);
}
NRF_LOG_FLUSH();
}
if (!detected_device)
{
NRF_LOG_INFO("No device was found.\r\n");
NRF_LOG_FLUSH();
}
설정 파일에서 NRF_LOG_INFO를 출력 할 수 있도록 수정 해 주어야 한다.
/examples/peripheral/twi_scanner/pca10028/blank/configsdk_config.h
우선 NRF_LOG_ENABLED 를 1로 설정 하고
UART 핀맵 설정 NRF_LOG_BACKEND_SERIAL_UART_TX_PIN, NRF_LOG_BACKEND_SERIAL_UART_RX_PIN 을 보드에 맞도록 수정해 주어야 한다.
#ifndef UART_ENABLED
#define UART_ENABLED 1
#endif
:
:
// <o> NRF_LOG_BACKEND_SERIAL_UART_TX_PIN - UART TX pin
#ifndef NRF_LOG_BACKEND_SERIAL_UART_TX_PIN
//#define NRF_LOG_BACKEND_SERIAL_UART_TX_PIN 9
#define NRF_LOG_BACKEND_SERIAL_UART_TX_PIN 6
#endif
// <o> NRF_LOG_BACKEND_SERIAL_UART_RX_PIN - UART RX pin
#ifndef NRF_LOG_BACKEND_SERIAL_UART_RX_PIN
//#define NRF_LOG_BACKEND_SERIAL_UART_RX_PIN 11
#define NRF_LOG_BACKEND_SERIAL_UART_RX_PIN 8
#endif
그러면 아래와 같이 시리얼 포트로 I2C address값을 출력 하는것을 확인 할수 있다.
그리고 nRF5 SDK에 I2C 온도 센서 LM75의 온도 값을 출력한는 예제가 있다.
examples/peripheral/twi_sensor
TCN75 온도 센서 모듈을 이용하여 온도 테스트 해보자
static void read_sensor_data()
{
m_xfer_done = false;
/* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
ret_code_t err_code = nrf_drv_twi_rx(&m_twi, LM75B_ADDR, &m_sample, sizeof(m_sample));
APP_ERROR_CHECK(err_code);
}
int main(void)
{
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_INFO("\r\nTWI sensor example\r\n");
NRF_LOG_FLUSH();
twi_init();
LM75B_set_mode();
while (true)
{
nrf_delay_ms(500);
do
{
__WFE();
}while (m_xfer_done == false);
read_sensor_data();
NRF_LOG_FLUSH();
}
}
소스코드 구동하면 LM75 온도 센서 모듈의 온도 값을 정상적으로 출력 하는것을 확인 할 수 있다.