void MMA845x_init(void) { uint8_t ver = 0; MMA485x_IO_init(); MMA845x_writebyte(CTRL_REG1, ASLP_RATE_20MS + DATA_RATE_5MS); delay_us(20); MMA845x_writebyte(XYZ_DATA_CFG_REG, FULL_SCALE_2G); //2G delay_us(20); MMA845x_writebyte(CTRL_REG1, ACTIVE_MASK); //激活状态 delay_us(20); ver = MMA845x_readbyte(WHO_AM_I_REG); if(ver == MMA8451Q_ID) { // } }
void MMA845x_read(void) { int8_t tmp = 0; if(cal_flag == 1) { //允许采集 if(cal_step == 0) { cal_step = 1; tmp = MMA845x_readbyte(OUT_X_MSB_REG); if(x_s == 0) { //第一次采集 x_s = 1; xmax = tmp; xmin = tmp; } if(tmp >= 0) { //临时值为正数时,和最大与最小值比较 if(xmax >= 0) { //正数时,最大值比较替换 if(tmp > xmax) { xmax = tmp; } } else { //负数时,直接替换 xmax = tmp; } if(xmin >= 0) { //正数的时候,较小值比较替换 if(tmp < xmin) { xmin = tmp; } } else { //负数的时候,直接放弃 } } else { //临时值为负数时,进行最大值,最小值比较 if(xmax >= 0) { //为正数时直接放弃 } else { //为负数的时候,选择较大 if((-tmp) < (-xmax)) { xmax = tmp; } } if(xmin >= 0) { //为正数,直接替换 xmin = tmp; } else { //为负数时候,比较较小值 if((-tmp) > (-xmin)) { xmin = tmp; } } } } else if(cal_step == 1) { cal_step = 2; tmp = MMA845x_readbyte(OUT_Y_MSB_REG); if(y_s == 0) { //第一次采集 y_s = 1; ymax = tmp; ymin = tmp; } if(tmp >= 0) { //临时值为正数时,和最大与最小值比较 if(ymax >= 0) { //正数时,最大值比较替换 if(tmp > ymax) { ymax = tmp; } } else { //负数时,直接替换 ymax = tmp; } if(ymin >= 0) { //正数的时候,较小值比较替换 if(tmp < ymin) { ymin = tmp; } } else { //负数的时候,直接放弃 } } else { //临时值为负数时,进行最大值,最小值比较 if(ymax >= 0) { //为正数时直接放弃 } else { //为负数的时候,选择较大 if((-tmp) < (-ymax)) { ymax = tmp; } } if(ymin >= 0) { //为正数,直接替换 ymin = tmp; } else { //为负数时候,比较较小值 if((-tmp) > (-ymin)) { ymin = tmp; } } } } else if(cal_step == 2) { cal_step = 0; tmp = MMA845x_readbyte(OUT_Z_MSB_REG); if(z_s == 0) { //第一次采集 z_s = 1; zmax = tmp; zmin = tmp; } if(tmp >= 0) { //临时值为正数时,和最大与最小值比较 if(zmax >= 0) { //正数时,最大值比较替换 if(tmp > zmax) { zmax = tmp; } } else { //负数时,直接替换 zmax = tmp; } if(zmin >= 0) { //正数的时候,较小值比较替换 if(tmp < zmin) { zmin = tmp; } } else { //负数的时候,直接放弃 } } else { //临时值为负数时,进行最大值,最小值比较 if(zmax >= 0) { //为正数时直接放弃 } else { //为负数的时候,选择较大 if((-tmp) < (-zmax)) { zmax = tmp; } } if(zmin >= 0) { //为正数,直接替换 zmin = tmp; } else { //为负数时候,比较较小值 if((-tmp) > (-zmin)) { zmin = tmp; } } } } } }
void component_key_alarm() { const uint8 DATA_SIZE = sizeof(HMC5883L_data) + sizeof(RTC_Clock) + sizeof(MMA8451_data); char szTrace[piece_size]; HMC5883L_data data_5883; RTC_Clock clock; Sensor data_8451; uint8 nIndex = 0; uint32 nVotage = 0; LED_Light(led_blue, true); sprintf(szTrace, "key = alarm, led = blue"); post_trace(szTrace); for(nIndex = 0; nIndex < 60; ++nIndex) { HMC5883L_ReadXYZ(&data_5883); sprintf(szTrace, "hmc5883 x = %d, y = %d, z = %d", data_5883.x, data_5883.y, data_5883.z); post_trace(szTrace); clock = GetTime(); sprintf(szTrace, "sd2058: 20%02d:%02d:%02d %02d:%02d:%02d", clock.year, clock.month, clock.day, clock.hour, clock.minute, clock.second); post_trace(szTrace); if((MMA845x_readbyte(MMA845x_STATUS_00) & 0x08) != 0) { //三个轴数据更新 MMA845x_readData(&data_8451); if(data_8451.x == -1 && data_8451.y == -1 && data_8451.z == -1) { post_trace("MMA8451: read error data"); } else { sprintf(szTrace, "MMA8451: x = %d, y = %d, z = %d", data_8451.x, data_8451.y, data_8451.z); post_trace(szTrace); } } else { post_trace("MMA8451: read error"); } nVotage = ADC_Read(); sprintf(szTrace, "votage = %d", nVotage); post_trace(szTrace); } memcpy(szTrace, &data_5883, sizeof(HMC5883L_data)); memcpy(szTrace + sizeof(HMC5883L_data), &clock, sizeof(RTC_Clock)); memcpy(szTrace + sizeof(HMC5883L_data) + sizeof(RTC_Clock), &data_8451, sizeof(MMA8451_data)); write_file("temp", szTrace, DATA_SIZE); post_trace("save sensor data in file named \"temp\" in tf card"); { InfoBase base_info = { 0 }; InfoState state_info = { 0 }; if(get_base_info(&base_info)) { sprintf(szTrace, "base info, sid = %s, imei = %s", base_info.sid, base_info.imei); post_trace(szTrace); } if(get_state_info(&state_info)) { sprintf(szTrace, "state info, charging: %s, quantity: %d, sim card: %s, signal: %d, lac: %s, cell: %s, lng: %s, lat: %s", (is_charging(&state_info) ? "yes" : "no"), get_quantity(&state_info), (is_sim_card_exist(&state_info) ? (is_sim_card_valid(&state_info) ? "normal" : "error") : "lost"), get_signal(&state_info), state_info.lac, state_info.cell, state_info.lng, state_info.lat); post_trace(szTrace); } } post_trace("alarm completed"); LED_Light(led_blue, false); }