nRF52 TMP102 讀取温度值
TMP102是一個温度感測器,可以用I2C或TWI界面來和MCU溝通。
而Nordic的藍牙晶片到了nRFSDK 15之後,已經提供很多的範例程式,I2C或TWI存取的寫法也有提供。最基本的scan 是否有設備存在的程式範例就是/examples/peripheral/twi_scanner。本文以這支範例程式來試驗讀取TMP102温度值的程式寫法。
----------------------------------------------------------------------------
硬體接線
依以下方式,只要接4條線。左為nRF52840 DK腳位,右為TMP102腳位。
P0.27 -> SCL
P0.26 -> SDA
GND -> GND
VDD nRF -> 1.4 - 3.6V
如下圖,這四個腳位都在右上角P4, P20
----------------------------------------------------------------------------
程式寫法
打開twi_scanner這支程式,在main()之前加入以下程式:
#define TMP_ADDRESS (0x48)
/**
* @brief read TMP102 temperature
*/
void read_tmp102(void)
{
uint8_t tmp_data[2];
uint8_t tmp_data_le[2];
uint16_t *tmp = (uint16_t *) &tmp_data_le[0];
nrf_drv_twi_rx(&m_twi, TMP_ADDRESS, tmp_data, 2);
tmp_data_le[0] = tmp_data[1];
tmp_data_le[1] = tmp_data[0];
float tmp102 = (*tmp >> 4) * 0.0625;
NRF_LOG_INFO("DATA: 0x%x, 0x%x", tmp_data[0], tmp_data[1]);
NRF_LOG_INFO("TMP: " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(tmp102));
NRF_LOG_FLUSH();
}
這樣在main()的最下方while之前,就可以加入叫用read_tmp102()的程式來取得温度值。
看程式就知道只用了nrf_drv_twi_rx()這個讀取資料的函數。其他部份只是對資料格式的解讀而已。這部份寫法不是太完美,不過正常情形下還勘用。
-----------------------------------------------------------------------------
SCL, SDA腳位的選擇
這兩個腳位其實不是一定固定使用P0.27, P0.26,只是因為nRF52840 DK這張開發板的接腳設定和Arduino Uno相容,而Arduino SCL, SDA腳位正好在右上角位置,也就是P0.27, P0.26的位置。其實想換腳位也是可以的,只要修改以下:
/**
* @brief TWI initialization.
*/
void twi_init (void)
{
ret_code_t err_code;
const nrf_drv_twi_config_t twi_config = {
.scl = NRF_GPIO_PIN_MAP(1,15), //ARDUINO_SCL_PIN,
.sda = NRF_GPIO_PIN_MAP(1,14), //ARDUINO_SDA_PIN,
.frequency = NRF_DRV_TWI_FREQ_100K,
.interrupt_priority = APP_IRQ_PRIORITY_HIGH,
.clear_bus_init = false
};
err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);
APP_ERROR_CHECK(err_code);
nrf_drv_twi_enable(&m_twi);
}
可以看到範例程式還為P0.27, P0.26定義了常數ARDUINO_SCL_PIN,ARDUINO_SDA_PIN,我們可以將之替換成想使用的腳位,如上程式,就改成了P1.15, P1.14
而Nordic的藍牙晶片到了nRFSDK 15之後,已經提供很多的範例程式,I2C或TWI存取的寫法也有提供。最基本的scan 是否有設備存在的程式範例就是
----------------------------------------------------------------------------
硬體接線
依以下方式,只要接4條線。左為nRF52840 DK腳位,右為TMP102腳位。
P0.27 -> SCL
P0.26 -> SDA
GND -> GND
VDD nRF -> 1.4 - 3.6V
如下圖,這四個腳位都在右上角P4, P20
----------------------------------------------------------------------------
程式寫法
打開twi_scanner這支程式,在main()之前加入以下程式:
#define TMP_ADDRESS (0x48)
/**
* @brief read TMP102 temperature
*/
void read_tmp102(void)
{
uint8_t tmp_data[2];
uint8_t tmp_data_le[2];
uint16_t *tmp = (uint16_t *) &tmp_data_le[0];
nrf_drv_twi_rx(&m_twi, TMP_ADDRESS, tmp_data, 2);
tmp_data_le[0] = tmp_data[1];
tmp_data_le[1] = tmp_data[0];
float tmp102 = (*tmp >> 4) * 0.0625;
NRF_LOG_INFO("DATA: 0x%x, 0x%x", tmp_data[0], tmp_data[1]);
NRF_LOG_INFO("TMP: " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(tmp102));
NRF_LOG_FLUSH();
}
這樣在main()的最下方while之前,就可以加入叫用read_tmp102()的程式來取得温度值。
看程式就知道只用了nrf_drv_twi_rx()這個讀取資料的函數。其他部份只是對資料格式的解讀而已。這部份寫法不是太完美,不過正常情形下還勘用。
-----------------------------------------------------------------------------
SCL, SDA腳位的選擇
這兩個腳位其實不是一定固定使用P0.27, P0.26,只是因為nRF52840 DK這張開發板的接腳設定和Arduino Uno相容,而Arduino SCL, SDA腳位正好在右上角位置,也就是P0.27, P0.26的位置。其實想換腳位也是可以的,只要修改以下:
/**
* @brief TWI initialization.
*/
void twi_init (void)
{
ret_code_t err_code;
const nrf_drv_twi_config_t twi_config = {
.scl = NRF_GPIO_PIN_MAP(1,15), //ARDUINO_SCL_PIN,
.sda = NRF_GPIO_PIN_MAP(1,14), //ARDUINO_SDA_PIN,
.frequency = NRF_DRV_TWI_FREQ_100K,
.interrupt_priority = APP_IRQ_PRIORITY_HIGH,
.clear_bus_init = false
};
err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);
APP_ERROR_CHECK(err_code);
nrf_drv_twi_enable(&m_twi);
}
可以看到範例程式還為P0.27, P0.26定義了常數ARDUINO_SCL_PIN,ARDUINO_SDA_PIN,我們可以將之替換成想使用的腳位,如上程式,就改成了P1.15, P1.14
留言