HI
i'm trying to use TSL2561 sensor, but i can't geting to work. I found the code that works on the psoc that, I change it so it fits nrf52840 but it still does not work, but works on the psoc
can anyone see what i have done wrong
Fullscreen
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h> #include "boards.h" #include "app_util_platform.h" #include "app_error.h" #include "nrf_drv_twi.h" #include "nrf_delay.h" #include "TSL2561.h" #include "log.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" /* TWI instance ID. */ #define TWI_INSTANCE_ID 0 /* Indicates if operation on TWI has ended. */ static volatile bool m_xfer_done = false; /* TWI instance. */ static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID); /* Buffer for samples read from temperature sensor. */ static uint8_t m_sample; uint8_t command_bits=COMMAND_BIT; uint8_t control_powerOn=CONTROL_POWERON; uint8_t com_timing=(COMMAND_BIT|REGISTER_TIMING); uint8_t gain_low_int=0x00; /** * @brief TWI events handler. */ void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context) { switch (p_event->type) { case NRF_DRV_TWI_EVT_DONE: if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX) { data_handler(m_sample); } m_xfer_done = true; break; default: break; } } /** * @brief UART initialization. */ void twi_init (void) { ret_code_t err_code; const nrf_drv_twi_config_t twi_lm75b_config = { .scl = ARDUINO_SCL_PIN, .sda = ARDUINO_SDA_PIN, .frequency = NRF_TWI_FREQ_100K, .interrupt_priority = APP_IRQ_PRIORITY_HIGH, .clear_bus_init = false }; err_code = nrf_drv_twi_init(&m_twi, &twi_lm75b_config, twi_handler, NULL); APP_ERROR_CHECK(err_code); nrf_drv_twi_enable(&m_twi); } /** * @brief Function for main application entry. */ uint8_t init_TSL2561(void) { uint32_t status; uint8_t I2C_buffer[4]; /* buffer for I2C communication with TSL2561 */ uint8_t ADC0_buffer[2]; uint8_t ADC1_buffer; /* Write User Register */ uint8_t COM_WORD_REGISTER_ADC1_LO=0xAE; uint8_t COM_WORD_REGISTER_ADC0_LO=(COMMAND_BIT|WORD_BIT|REGISTER_ADC0_LO); status = nrf_drv_twi_tx(&m_twi, TSL_ADDR , &m_sample, sizeof(m_sample),false); // write direction if (status != NRF_SUCCESS ) {goto exit;} __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "write mode\n") nrf_delay_ms(1000); status = nrf_drv_twi_tx(&m_twi,TSL_ADDR, &control_powerOn,sizeof(control_powerOn),false); if (status != NRF_SUCCESS ) {__LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"TSL2561 is %u\r\n",status); goto exit;} nrf_delay_ms(1000); //now check to confirm the device is powered up status = nrf_drv_twi_rx(&m_twi, TSL_ADDR , &m_sample, sizeof(m_sample)); // read direction if (status != NRF_SUCCESS ){__LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"TSL2561 is %u\r\n",status); goto exit;} __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "read mode\n"); // status = nrf_drv_twi_rx(&m_twi, TSL_ADDR , &m_sample, sizeof(m_sample)); memset(I2C_buffer, 0, 4); memcpy(I2C_buffer, &status, sizeof(status)); __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"TSL2561 is %u\r\n",status); if (I2C_buffer[0] == 0 || I2C_buffer[0] == 51) { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"TSL2561 is powered\r\n"); nrf_delay_ms(1000); /* Switch back to Write User Register */ status =nrf_drv_twi_tx(&m_twi,TSL_ADDR, &m_sample,sizeof(m_sample),false); // write direction if (status != NRF_SUCCESS) goto exit; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"write mode\r\n"); nrf_delay_ms(1000); status = nrf_drv_twi_tx(&m_twi,TSL_ADDR, &com_timing,sizeof(com_timing),false); // write direction if (status != NRF_SUCCESS) goto exit; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"register timing\r\n"); nrf_delay_ms(1000); status = nrf_drv_twi_tx(&m_twi,TSL_ADDR, &gain_low_int,sizeof(gain_low_int),false); // write direction if (status != NRF_SUCCESS) goto exit; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"set gain low\r\n"); return 1; } exit: __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "fejl fejl fejl\n") return 0; } uint8_t getTSL2561_Lumos(void) { uint8_t errchk; uint32_t status; //uint8 I2C_buffer[4]; /* buffer for I2C communication with TSL2561 */ uint8_t ADC0_buffer[2]; /* ADC0 buffer for I2C communication with TSL2561 */ uint8_t ADC1_buffer[2]; /* ADC0 buffer for I2C communication with TSL2561 */ uint16_t lightval; uint16_t IRval; char str[50]; uint8_t COM_WORD_REGISTER_ADC0_LO=0xAC; uint8_t COM_WORD_REGISTER_ADC1_LO=0xAE; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"Reading values from TSL2561\r\n"); memset(ADC0_buffer, 0, 2); memset(ADC1_buffer, 0, 2); nrf_delay_ms(1000); //Channel 0 status = nrf_drv_twi_tx(&m_twi,TSL_ADDR,&m_sample,sizeof(m_sample),false); // write direction if (status != NRF_SUCCESS) goto exit; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"write mode CH0\r\n"); nrf_delay_ms(1000); status = nrf_drv_twi_tx(&m_twi,TSL_ADDR,&COM_WORD_REGISTER_ADC0_LO,sizeof(COM_WORD_REGISTER_ADC0_LO),false); if (status != NRF_SUCCESS) goto exit; nrf_delay_ms(1000); status= nrf_drv_twi_rx(&m_twi,TSL_ADDR, &ADC0_buffer,sizeof(ADC0_buffer)); if (status != NRF_SUCCESS) goto exit; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"checking ADC0 %u %u\r\n",ADC0_buffer[0], ADC0_buffer[1]); nrf_delay_ms(1000); //Channel 1 status = nrf_drv_twi_tx(&m_twi,TSL_ADDR,&m_sample,sizeof(m_sample),false); // write direction if (status != NRF_SUCCESS) goto exit; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"write mode CH1\r\n"); nrf_delay_ms(1000); status = nrf_drv_twi_tx(&m_twi,TSL_ADDR,&COM_WORD_REGISTER_ADC1_LO,sizeof(COM_WORD_REGISTER_ADC1_LO),false); if (status != NRF_SUCCESS) goto exit; nrf_delay_ms(1000); status= nrf_drv_twi_rx(&m_twi,TSL_ADDR, &ADC1_buffer,2); // if (status != NRF_SUCCESS) goto exit; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"checking ADC0 %u %u\r\n",ADC1_buffer[0], ADC1_buffer[1]); __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"checking ADC1\r\n"); int i=0; if(i==0) {__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Values = %X %X %X %X\r\n", ADC0_buffer[0],ADC0_buffer[1],ADC1_buffer[0],ADC1_buffer[1]); lightval = (ADC0_buffer[1] << 8) + ADC0_buffer[0]; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Light Value = %hu\r\n", lightval); IRval = (ADC1_buffer[1] << 8) + ADC1_buffer[0]; __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "IR Value = %hu\r\n", IRval); } return 1; exit: __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"There was a problem reading TSL2561\r\n"); return 0; } int main(void) { __LOG_INIT(LOG_SRC_APP | LOG_SRC_ACCESS, LOG_LEVEL_INFO, LOG_CALLBACK_DEFAULT); APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); NRF_LOG_DEFAULT_BACKENDS_INIT(); NRF_LOG_INFO("\r\nTWI sensor example"); NRF_LOG_FLUSH(); twi_init(); //LM75B_set_mode(); while (true) { nrf_delay_ms(500); /* do { __WFE(); }while (m_xfer_done == false);*/ // read_sensor_data(); for (int xx = 0; xx < 5; xx++) { if(init_TSL2561()) { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "skal læse værdi\n") // short delay to get sensor readings if (getTSL2561_Lumos()) { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "læst værdi\n")} } } NRF_LOG_FLUSH(); } }
i got it to work yesterday, but when i test to day it did not work and i have not change the code from yesterday.