void accel_disable_int(void) { uint8_t i2cbuffer[4]; //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 4); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG3, 0x00); //turn off FIFO interrupt }
void accel_disable_temp(void) { uint8_t i2cbuffer[4]; //QPRINTF("Disabling Temp Sensor..."); //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 4); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_TEMP_CFG_REG, 0x00); //disable ADC and Temp sensor // QPRINTF("Done\r\n"); }
//enable accelerometer for single sample, no interrupt void accel_enable_sample(void) { uint8_t i2cbuffer[4]; accel_shutdown(); //reset accel //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 4); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG1, LIS3DH_50HZ | LIS3DH_LP | LIS3DH_ENX | LIS3DH_ENY | LIS3DH_ENZ); //original stuff for init below: //I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG1, LIS3DH_50HZ | LIS3DH_LP | LIS3DH_ENX | LIS3DH_ENY | LIS3DH_ENZ); }
void accel_get_X_samples(int8_t *xdat, uint8_t samps) { uint8_t i2cbuffer[3]; int i; //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 3); for(i = 0; i< 10000; i++);//wait for i2c clock to lock for(i = 0; i< samps; i++) { xdat[i] = (int8_t)(((uint8_t)(I2C_BYTE_READ(LIS3DH_ADDR, LIS3DH_OUT_X_H)))); } }
//get accelerometer samples, mask can choose which axis are requested (8b000_0zyx) void accel_get_sample(int8_t *xdat, int8_t *ydat, int8_t *zdat, uint8_t mask) { uint8_t i2cbuffer[3]; //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 3); //for(int i = 0; i< 10000; i++){} if((mask & 0x01) > 0) //send x axis *xdat = (int8_t)(((uint8_t)(I2C_BYTE_READ(LIS3DH_ADDR, LIS3DH_OUT_X_H)))); if((mask & 0x02) > 0) //send y axis *ydat = (int8_t)(((uint8_t)(I2C_BYTE_READ(LIS3DH_ADDR, LIS3DH_OUT_Y_H)))); if((mask & 0x04) > 0) //send z axis *zdat = (int8_t)(((uint8_t)(I2C_BYTE_READ(LIS3DH_ADDR, LIS3DH_OUT_Z_H)))); }
void accel_enable_temp(void) { uint8_t i2cbuffer[4]; //QPRINTF("Configuring Temp Sensor..."); //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 4); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_TEMP_CFG_REG, LIS3DH_ADC_EN | LIS3DH_TEMP_EN); //Enable ADC and Temp sensor //I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG4, LIS3DH_BDU); //Enable Block Data Update //QPRINTF("Done\r\n"); }
//enable accelerometer for pedometer void accel_enable_fifo(void) { uint8_t i2cbuffer[4]; //QPRINTF("Configuring FIFO..."); accel_shutdown(); //reset accel //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 4); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG1, LIS3DH_50HZ | LIS3DH_LP | LIS3DH_ENX | LIS3DH_ENY | LIS3DH_ENZ); //turn on XYZ, low power, 50Hz I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_FIFO_CTRL_REG, LIS3DH_FIFO_MODE | ACCEL_FIFO_DEPTH); //fifo mode, watermark length 10, Send to inerrupt to INT1 I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG5, LIS3DH_FIFO_EN | LIS3DH_LIR_INT1); //Enable FIFO I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG3, LIS3DH_FIFO_WM | LIS3DH_INT1_EN | LIS3DH_FIFO_OVERRUN); //Enable FIFO watermark interrupt 1 I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG2, LIS3DH_HPF_EN); //enalbe high pass filter for pedometer, disable for better value range on all XYZ axis //I2C_BYTE_READ(LIS3DH_ADDR, LIS3DH_HP_FILTER_RESET); //reset high pass filter zero level to current //QPRINTF("Done\r\n"); }
void accel_shutdown(void) { uint8_t i2cbuffer[4]; //Initialize I2C master i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 4); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG1, LIS3DH_POWER_DOWN); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG5, LIS3DH_BOOT); //reboot regs I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG6, LIS3DH_BOOT_I1); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG1, 0x00); //power down I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG2, 0x00); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG3, 0x00); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG4, 0x00); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG5, 0x00); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_CTRL_REG6, 0x00); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_FIFO_CTRL_REG, 0x00); I2C_BYTE_WRITE(LIS3DH_ADDR, LIS3DH_INT1_CFG, 0x00); }
int main (void) { uint32_t j; uint8_t buffer[100]; uint8_t rxbuffer[100]; SystemInit(); //Initialize I2C master i2c_init(I2C_SCL_RATIO(100000), i2cbuffer, 104); for (j = 0; j < 100; j++) { buffer[j] = 0x55 + j; rxbuffer[j] = 0; } while (1) /* Loop forever */ { // Write 1byte data(0x80) to register(address is 0x00 and 1byte) of device(address is 0x21) I2C_BYTE_WRITE(0x21, 0x00, 0x80); // Read 1byte data from register(address is 0x06 and 1byte) of device(address is 0x21) buffer[0] = I2C_BYTE_READ(0x21, 0x06); // Write 1byte data(0x11) to register(address is 0x00 and 2byte) of device(address is 0x50) I2C_BYTE_WRITE2(0x50, 0x00, 0x11); // Read 1byte data from register(address is 0x00 and 2byte) of device(address is 0x50) buffer[0] = I2C_BYTE_READ2(0x50, 0x00); // Write nbyte data(50byte) to register(address is 0x00 and 2byte) of device(address is 0x50) I2C_nBYTE_WRITE2(0x50, 0x00, buffer, 50); // Read nbyte data(60byte) from register(address is 0x00 and 2byte) of device(address is 0x50) I2C_nBYTE_READ2(0x50, 0x00, rxbuffer, 60); } }
/** **************************************************************************************** * @brief Restore peripheral setting after wakeup **************************************************************************************** */ void usr_sleep_restore(void) { #if QN_DBG_PRINT uart_init(QN_DEBUG_UART, USARTx_CLK(0), UART_115200); uart_tx_enable(QN_DEBUG_UART, MASK_ENABLE); uart_rx_enable(QN_DEBUG_UART, MASK_ENABLE); #endif #if (defined(QN_ADV_WDT)) if(usr_env.adv_wdt_enable) { wdt_init(1007616, WDT_INT_MOD); // 30.75s } #endif //Initialize I2C master to save time later uint8_t i2cbuffer[3]; i2c_init(I2C_SCL_RATIO(1), i2cbuffer, 3); //QPRINTF("SLEEP RESTORE\r\n"); //send_packet(PROTOCOL_MODE_TX2); }
int ble_i2c( const uint8_t * const pcCommandString,uint8_t* pcWriteBuffer,uint32_t commpare_length) { const int8_t *pcom; uint32_t pxParameterStringLength; uint8_t len; uint8_t i2c_addr ; uint8_t i2c_reg ; uint8_t i2c_data; if(pcCommandString[commpare_length+1] == '=') { //i2c_addr pcom = at_get_parameter((const int8_t*)pcCommandString + commpare_length + 2, 1, &pxParameterStringLength); if(pxParameterStringLength > 0) { i2c_addr = at_HEXstringToNum((const uint8_t *)pcom, pxParameterStringLength); } else { goto pram_err; } //i2c_reg pcom = at_get_parameter((const int8_t*)pcCommandString + commpare_length + 2, 2, &pxParameterStringLength); if(pxParameterStringLength > 0) { i2c_reg = at_HEXstringToNum((const uint8_t *)pcom, pxParameterStringLength); } else { goto pram_err; } // i2c R&W? pcom = at_get_parameter((const int8_t*)pcCommandString + commpare_length + 2, 0, &pxParameterStringLength); if(pxParameterStringLength == 1) { syscon_SetPMCR1WithMask(QN_SYSCON,P23_MASK_PIN_CTRL | P24_MASK_PIN_CTRL,P23_I2C_SDA_PIN_CTRL | P24_I2C_SCL_PIN_CTRL); i2c_init(I2C_SCL_RATIO(100000), i2c_buff, 4); if(pcom[0] == 'R') { i2c_data = I2C_BYTE_READ(i2c_addr,i2c_reg); if(i2c_is_finish()) { len = commpare_length+1; memcpy(pcWriteBuffer, pcCommandString, len); len += sprintf((char *)pcWriteBuffer + len,":0x%02x\r\nOK\r\n",i2c_data); return len; } goto pram_err; } else if(pcom[0] == 'W') { //i2c_data pcom = at_get_parameter((const int8_t*)pcCommandString + commpare_length + 2, 3, &pxParameterStringLength); if(pxParameterStringLength > 0) { i2c_data = at_HEXstringToNum((const uint8_t *)pcom, pxParameterStringLength); } else { goto pram_err; } I2C_BYTE_WRITE(i2c_addr, i2c_reg, i2c_data); if(!i2c_is_finish()) { goto pram_err; } } } else { goto pram_err; } } else { goto pram_err; } return sprintf((char*)pcWriteBuffer,"OK\r\n"); pram_err: return sprintf((char*)pcWriteBuffer,"ERR\r\n"); }