/*FUNCTION*------------------------------------------------------------------- * * Function Name : max3353_WriteReg * Returned Value : * Comments : Write data to max3353 register * * *END*----------------------------------------------------------------------*/ bool max3353_WriteReg ( uint8_t i2c_channel, uint8_t regAdd , uint8_t regValue ) { /* Send I2C slave address to bus*/ i2c_Start(i2c_channel); i2c_WriteByte(i2c_channel,(MAX3353_SLAVE_ADDR <<1) | 0); i2c_Wait(i2c_channel); /* Send register address of MAX3353 */ i2c_WriteByte(i2c_channel, regAdd); i2c_Wait(i2c_channel); /* Send data to MAX3353*/ i2c_WriteByte(i2c_channel, regValue); i2c_Wait(i2c_channel); /* Send stop signal */ i2c_Stop(i2c_channel); Pause(); return TRUE; }
/*FUNCTION*------------------------------------------------------------------- * * Function Name : max3353_ReadReg * Returned Value : * Comments : Read data from max3353 register * * *END*----------------------------------------------------------------------*/ bool max3353_ReadReg ( uint8_t i2c_channel, uint8_t regAdd, uint8_t* p_regValue ) { uint8_t result; uint32_t j; /* Send Slave Address */ i2c_Start(i2c_channel); i2c_WriteByte(i2c_channel, (MAX3353_SLAVE_ADDR <<1) | 0); i2c_Wait(i2c_channel); /* Write Register Address */ i2c_WriteByte(i2c_channel, regAdd); i2c_Wait(i2c_channel); /* Do a repeated start */ i2c_RepeatedStart(i2c_channel); /* Send Slave Address */ i2c_WriteByte(i2c_channel, (MAX3353_SLAVE_ADDR << 1) | 0x01); i2c_Wait(i2c_channel); /* Put in Rx Mode */ i2c_SetRXMode(i2c_channel); /* Turn off ACK */ i2c_GiveNACK(i2c_channel); /* Dummy read */ result = i2c_ReadByte(i2c_channel); for (j=0; j<5000; j++){}; i2c_Wait(i2c_channel); /* Send stop signal */ i2c_Stop(i2c_channel); result = i2c_ReadByte(i2c_channel); Pause(); *p_regValue = result; return TRUE; }
/* * @brief: Read all 3 axes of HMC5883L * @param[in]: ptr output to individual axes * @param[out]: none */ void hmc5883l_ReadXYZ(int16_t *x, int16_t *y, int16_t *z){ uint8_t b[6]; i2c_WriteByte(I2C_ID_HMC5883L, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE); ROM_SysCtlDelay(6*(ROM_SysCtlClockGet()/3000)); i2c_ReadBuf(I2C_ID_HMC5883L, HMC5883L_DATA, 6, b); *x = ((int16_t)(((uint16_t)b[0]<<8) | (uint16_t)b[1]))*xyz_comp_num[0]/xyz_comp_den[0]; *y = ((int16_t)(((uint16_t)b[2]<<8) | (uint16_t)b[3]))*xyz_comp_num[1]/xyz_comp_den[1]; *z = ((int16_t)(((uint16_t)b[4]<<8) | (uint16_t)b[5]))*xyz_comp_num[2]/xyz_comp_den[2]; }
/* * @brief: Perform Selftest * @param[in]: none * @param[out]: Selftest success result. 1:Gain=5. 2:Gain=6. 3:Gain=7. 4:Test unsuccessful */ uint8_t hmc5883l_SelfTest(void){ i2c_WriteByte(I2C_ID_HMC5883L, HMC5883L_RA_CONFIG_A, HMC5883L_AVERAGING_8 | HMC5883L_RATE_15 | HMC5883L_BIAS_POSITIVE); i2c_WriteByte(I2C_ID_HMC5883L, HMC5883L_RA_CONFIG_B, HMC5883L_GAIN_390); hmc5883l_ReadXYZ(&Testx, &Testy, &Testz); Testxyz[0] = Testx; Testxyz[1] = Testy; Testxyz[2] = Testz; arm_max_q15(Testxyz, 3, &TestMax, &TestMaxInd); arm_min_q15(Testxyz, 3, &TestMin, &TestMinInd); if(TestMax<HMC5883L_MAX_5 && TestMin>HMC5883L_MIN_5){ hmc5883l_Config(); return 1; } else{ i2c_WriteByte(I2C_ID_HMC5883L, HMC5883L_RA_CONFIG_B, HMC5883L_GAIN_330); hmc5883l_ReadXYZ(&Testx, &Testy, &Testz); Testxyz[0] = Testx; Testxyz[1] = Testy; Testxyz[2] = Testz; arm_max_q15(Testxyz, 3, &TestMax, &TestMaxInd); arm_min_q15(Testxyz, 3, &TestMin, &TestMinInd); if(TestMax<HMC5883L_MAX_6 && TestMin>HMC5883L_MIN_6){ hmc5883l_Config(); return 2; } else{ i2c_WriteByte(I2C_ID_HMC5883L, HMC5883L_RA_CONFIG_B, HMC5883L_GAIN_330); hmc5883l_ReadXYZ(&Testx, &Testy, &Testz); Testxyz[0] = Testx; Testxyz[1] = Testy; Testxyz[2] = Testz; arm_max_q15(Testxyz, 3, &TestMax, &TestMaxInd); arm_min_q15(Testxyz, 3, &TestMin, &TestMinInd); if(TestMax<HMC5883L_MAX_7 && TestMin>HMC5883L_MIN_7){ hmc5883l_Config(); return 3; } else{ hmc5883l_Config(); return 4; } } } }
/* * @brief: Configure data O/P method * @param[in]: Data update: * CONTINOUS_UPDATE/BATCH_UPDATE * Endian * BIG_ENDIAN/LITTLE_ENDIAN * Data resolution * DPSx. x = 250, 500, 2000 * @param[out]: none */ void l3g4200d_DataConfig(uint32_t upd, uint32_t end, uint32_t res) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG4, upd|end|res); switch (res){ case 0x00<<4: DpsRes = 875; break; case 0x01<<4: DpsRes = 1750; break; case 0x02<<4: DpsRes = 7000; break; } }
/* * @brief: Configure boot mode * @param[in]: BOOT_NORMAL, BOOT_MEM * @param[out]: none */ void l3g4200d_Boot(uint32_t boot) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG5, boot); }
/* * @brief: Configure FIFO behaviour * @param[in]: FIFO_DISABLE, FIFO_ENABLE * @param[out]: none */ void l3g4200d_FIFO(uint32_t fifo) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG5, fifo); }
/* * @brief: Write to TAP_AXES register * @param[in]: Suppres bit * ADXL345_TAPAXES_SUP_ENABLE, ADXL345_TAPAXES_SUP_DISABLE * TapX bit * ADXL345_TAPAXES_TAPX_ENABLE, ADXL345_TAPAXES_TAPX_DISABLE * TapY bit * ADXL345_TAPAXES_TAPY_ENABLE, ADXL345_TAPAXES_TAPY_DISABLE * TapZ bit * ADXL345_TAPAXES_TAPZ_ENABLE, ADXL345_TAPAXES_TAPZ_DISABLE * */ void adxl345_WriteTapAxes(uint8_t sup, uint8_t tapx, uint8_t tapy, uint8_t tapz){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_TAP_AXES , sup|tapx|tapy|tapz); }
/* * @brief: Configure SPI * @param[in]: WIRE_INT_4, WIRE_INT_3 * @param[out]: none */ void l3g4200d_SPI(uint32_t spi) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG4, spi); }
/* * @brief: Power down l3g4200d * @param[in]: none * @param[out]: none */ void l3g4200d_PowerDown(void) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG1, PD); }
/* * @brief: Configure HPF behavior and cutoff frequency * @param[in]: HPF behavior. * RESET_FILTER * REF_SIG_FILTER * NORMAL_MODE * AUTORESET * HPF Cut off Frequency ODRxxxHPFCy * x : 100, 200, 400, 800 * y : 30, 15, 8, 4, 2, 1, 0P5, 0P2, 0P1, 0P05, 0P02, 0P02 * For available refer Table 27 in the datasheet * @param[out]: none */ void l3g4200d_ConfigReg2(uint32_t bhr, uint32_t hpf) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG2, bhr|hpf); }
/* * @brief: Set X axis OffSet * @param[in]: Value * @param[out]: none */ void adxl345_WriteXOffSet(int8_t xoff){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_OFSX, xoff); }
/* * @brief: Out selection configuration * @param[in]: DATA_NON_HPF, , DATA_LPF, DATA_HPF_LPF * @param[out]: none */ void l3g4200d_OutSel(uint32_t out) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG5, out); }
/* * @brief: Write to Data Format register * @param[in]: Self Test * ADXL345_DATA_SELFTEST_ENABLE, ADXL345_DATA_SELFTEST_DISABLE * SPI Config * ADXL345_DATA_SPI_3, ADXL345_DATA_SPI_4 * Int Interrupt * ADXL345_DATA_INT_INVERT_ENABLE, ADXL345_DATA_INT_INVERT_DISABLE * Full res * ADXL345_DATA_FULLRES_ENABLE, ADXL345_DATA_FULLRES_DISABLE * Justify * ADXL345_DATA_JUSTIFY_LEFT, ADXL345_DATA_JUSTIFY_RIGHT * Range * ADXL345_DATA_RANGE_2G * ADXL345_DATA_RANGE_4G * ADXL345_DATA_RANGE_8G * ADXL345_DATA_RANGE_18G * @param[out]: none */ void adxl345_WriteDataFormat(uint8_t selftest, uint8_t spi, uint8_t intinv, uint8_t fullres, uint8_t justify, uint8_t range){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_DATA_FORMAT, selftest|spi|intinv|0x00|fullres|justify|range); }
/* * @brief: Write to FIFO ctl registers * @param[in]: FIFO * ADXL345_FIFO_BYPASS * ADXL345_FIFO_FIFO * ADXL345_FIFO_STREAM * ADXL345_FIFO_TRIGGER * Trigger * ADXL345_TRIG_INT1, ADXL345_TRIG_INT2 * Sample * ADXL345_SAMPLE_WATERMARKENABLE * ADXL345_SAMPLE_WATERMARKDISABLE * @param[out]: none */ void adxl345_WriteFIFOCtl(uint8_t fifo, uint8_t trigger, uint8_t sample){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_FIFO_CTL, fifo|trigger|sample); }
/* * @brief: Enable interrupts * @param[in]: Data Ready * ADXL345_INT_DATARDY_ENABLE, ADXL345_INT_DATARDY_DISABLE * Single Tap * ADXL345_INT_SINGLETAP_ENABLE, ADXL345_INT_SINGLETAP_DISABLE * Double Tap * ADXL345_INT_DOUBLETAP_ENABLE, ADXL345_INT_DOUBLTAP_DISABLE * Activity * ADXL345_INT_ACTIVITY_ENABLE, ADXL345_INT_ACTIVITY_DISABLE * Inactivity * ADXL345_INT_INACTIVITY_ENABLE, ADXL345_INT_INACTIVITY_DISABLE * Freefall * ADXL345_INT_FREEFALL_ENABLE, ADXL345_INT_FREEFALL_DISABLE * Water Mark * ADXL345_INT_WATERMARK_ENABLE, ADXL345_INT_WATERMARK_DISABLE * Over Run * ADXL345_INT_OVERRUN_ENABLE, ADXL345_INT_OVERRUN_DISABLE * @param[out]: none */ void adxl345_WriteINTEnable(uint8_t DataRDY, uint8_t singletap, uint8_t doubletap, uint8_t act, uint8_t inact, uint8_t ff, uint8_t watermrk, uint8_t overrun){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_INT_ENABLE, DataRDY|singletap|doubletap|act|inact|ff|watermrk|overrun); }
/* * @brief: Write to the power ctl register * @param[in]: Link * ADXL345_LINK_ENABLE, ADXL345_LINK_DISABLE * Auto Sleep * ADXL345_ASLEEP_ENABLE, ADXL345_ASLEEP_DISABLE * Measure * ADXL345_MEASURE_ENABLE, ADXL345_MEASURE_DISABLE * Sleep * ADXL345_SLEEP_ENABLE, ADXL345_SLEEP_DISABLE * Wakeup * ADXL345_WAKE_8HZ * ADXL345_WAKE_4HZ * ADXL345_WAKE_2HZ * ADXL345_WAKE_1HZ; * @param[out]: none */ void adxl345_WritePWRCtl(uint8_t link,uint8_t autosleep, uint8_t measure, uint8_t sleep, uint8_t wake){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_POWER_CTL, link|autosleep|measure|sleep|wake); // i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_POWER_CTL, 0x00<<5|0x01<<4|0x01<<3|0x01<<2|0x00); }
/* * @brief: Set power mode and bandwidth * @param[in]: Power mode * ADXL345_LowPower , ADXL345_NormalPower * BW Rate * ADXL345_BW_1600 * ADXL345_BW_800 * ADXL345_BW_400 * ADXL345_BW_200 * ADXL345_BW_100 * ADXL345_BW_50 * ADXL345_BW_25 * ADXL345_BW_12P5 * ADXL345_BW_6P25 * ADXL345_BW_3P13 * ADXL345_BW_1P56 * ADXL345_BW_0P78 * ADXL345_BW_0P39 * ADXL345_BW_0P20 * ADXL345_BW_0P10 * ADXL345_BW_0P05 * @param[out]: none */ void adxl345_WriteBWRate(uint8_t pwr, uint8_t bw){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_BW_RATE, pwr|bw); }
/* * @brief: Enable HPF * @param[in]: HIGH_PASS_DISABLE, HIGH_PASS_ENABLE * @param[out]: none */ void l3g4200d_HPF(uint32_t hpf) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG5, hpf); }
/* * @brief: Set Y axis OffSet * @param[in]: Value * @param[out]: none */ void adxl345_WriteYOffSet(int8_t yoff){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_OFSY, yoff); }
/* * @brief: Int1 selection configuration * @param[in]: NON_HPF_FILT_INT, HPF_FILT_INT, LPF_FILT_INT, HPF_LPF_INT * @param[out]: none */ void l3g4200d_INT1(uint32_t int1) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG5, int1); }
/* * @brief: Set axis OffSet * @param[in]: Value * @param[out]: none */ void adxl345_WriteZOffSet(int8_t zoff){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_OFSZ, zoff); }
/* * @brief: Configure data rate, bandwidth and enable axis measurement * @param[in]: Data rate and bandwidth * Acceptable values: * ODR100FC12P5 * ODR100FC25 * ODR200FC12P5 * ODR200FC25 * ODR200FC50 * ODR200FC70 * ODR400FC20 * ODR400FC25 * ODR400FC50 * ODR400FC110 * ODR800FC30 * ODR800FC35 * ODR800FC50 * ODR800FC110 * @param[out]: None */ void l3g4200d_ConfigReg1(uint32_t odr) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG1, odr|Normal|Zen|Yen|Xen); }
/* * @brief: Control AC/DC coupled operation * @param[in]: Enable AC coupled operation for Activity * ADXL345_ACT_ACDC_ENABLE, ADXL345_ACT_ACDC_DISABLE * Enable X axis for activity * ADXL345_ACTX_ENABLE, ADXL345_ACTX_DISABLE * Enable Y axis for activity * ADXL345_ACTY_ENABLE, ADXL345_ACTY_DISABLE * Enable Z axis for activity * ADXL345_ACTZ_ENABLE, ADXL345_ACTZ_DISABLE * Enable AC coupled operation for Inactivity * ADXL345_INACT_ACDC_ENABLE, ADXL345_INACT_ACDC_DISABLE * Enable X axis for inactivity * ADXL345_INACTX_ENABLE, ADXL345_INACTX_DISABLE * Enable Y axis for inactivity * ADXL345_INACTY_ENABLE, ADXL345_INACTY_DISABLE * Enable Z axis for inactivity * ADXL345_INACTZ_ENABLE, ADXL345_INACTZ_DISABLE * @param[out]: none */ void adxl345_WriteACDC(uint8_t ActEN, uint8_t ActX, uint8_t ActY, uint8_t ActZ, uint8_t InActEN, uint8_t InActX, uint8_t InActY, uint8_t InActZ){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_ACT_INACT_CTL, ActEN|ActX|ActY|ActZ|InActEN|InActX|InActY|InActZ); }
/* * @brief: Sleep l3g4200d * @param[in]: none * @param[out]: none */ void l3g4200d_Sleep(void) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG1, Sleep); }
/* * @ brief: Write threshold value for tap interrupts * @ param[in]: Threshold value * @ param[out]: none */ void adxl345_WriteTapThresh(uint8_t tap){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_THRESH_TAP, tap); }
/* * @brief: Configure interrupts on L3G4200D * @param[in]: Interrupts to enable. A combination of the following is possible * I1_Int1 * I1_BOOT * H_LACTIVE * PP_OD * I2_DRDY * I2_WTM * I2_ORUN * I2_EMPTY * @param[out]: None */ void l3g4200d_ConfigReg3(uint32_t intr) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG3, 0x00); i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG3, intr); }
/* * @brief: Write the FreeFall time threshold * @param[in]: value * @param[out]: none */ void adxl345_WriteTimeFF(uint8_t timeff){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_TIME_FF, timeff); }
/* * @brief: Configure self test * @param[in]: Self test * DISABLE, POSITIVE_SELF_TEST, NEUTRAL_SELF_TEST, NEGATIVE_SELF_TEST * @param[out]: none */ void l3g4200d_SelfTest(uint32_t test) { i2c_WriteByte(I2C_ID_L3G4200D, CTRL_REG4, test); }
/* * @brief: Write the FreeFall threshold value * @param[in]: value * @param[out]: none */ void adxl345_WriteThreshFF(uint8_t threshff){ i2c_WriteByte(I2C_ID_ADXL345, ADXL345_RA_THRESH_FF, threshff); }