ErrorStatus fnSetAlarmClock(uint8_t h,uint8_t m,uint8_t setting) { uint8_t t; if ((h>=24)||(m>=60)) return ERROR; rt_kprintf("\n===Enter Alarm Clock Mode===\n"); /* Set Alarm Time */ t = IIC_Read(DS3231_ADDRESS,DS3231_CONTROL) & 0xFC; if (setting) { IIC_Write(DS3231_ADDRESS,DS3231_CONTROL,t | 0x01); IIC_Write(DS3231_ADDRESS,DS3231_A1_S,0x00); IIC_Write(DS3231_ADDRESS,DS3231_A1_M,(m%10)|((m/10)<<4)); IIC_Write(DS3231_ADDRESS,DS3231_A1_H,(h%10)|((h/10)<<4)); IIC_Write(DS3231_ADDRESS,DS3231_A1_D,0x80); }else{ IIC_Write(DS3231_ADDRESS,DS3231_CONTROL,t | 0x02); IIC_Write(DS3231_ADDRESS,DS3231_A2_M,(m%10)|((m/10)<<4)); IIC_Write(DS3231_ADDRESS,DS3231_A2_H,(h%10)|((h/10)<<4)); IIC_Write(DS3231_ADDRESS,DS3231_A2_D,0x80); } /* Clear Alarm Flag */ t = IIC_Read(DS3231_ADDRESS,DS3231_CON_STA); t &= 0xFC; IIC_Write(DS3231_ADDRESS,DS3231_CON_STA,t); rt_event_send(en_event,EVENT_TEMP_CLOCK); rt_thread_delay_hmsm(0,0,1,0); rt_event_send(reg_event,REG_ALARM_MSK); reg_output[REG_ALARM] = REG_Convert(REG_HexToReg(m%10),REG_HexToReg(m/10),REG_HexToReg(h%10),REG_HexToReg(h/10),1,0); rt_thread_delay_hmsm(0,0,1,0); reg_output[REG_ALARM] = 0xFFFFFFFF; rt_thread_delay_hmsm(0,0,0,62); reg_output[REG_ALARM] = 0xFFFFFFFE; rt_thread_delay_hmsm(0,0,0,62); reg_output[REG_ALARM] = 0xFFFFFEBF; rt_thread_delay_hmsm(0,0,0,62); reg_output[REG_ALARM] = 0xFFFEBFF7; rt_thread_delay_hmsm(0,0,0,62); reg_output[REG_ALARM] = 0xFEBFF7FF; rt_thread_delay_hmsm(0,0,0,62); reg_output[REG_ALARM] = 0xBFF7FFFF; rt_thread_delay_hmsm(0,0,0,62); reg_output[REG_ALARM] = 0xF7FFFFFF; rt_thread_delay_hmsm(0,0,0,62); reg_output[REG_ALARM] = 0xFFFFFFFF; rt_thread_delay_hmsm(0,0,0,62); StandBy(); return SUCCESS; }
/* void Setting_Write(void) { uint8_t t; while (1) { IIC_WriteSeq(AT24C32_ADDRESS,SETTING_BASE,Setting,SETTING_LENGTH); rt_thread_delay_hmsm(0,0,0,100); IIC_ReadSeq(AT24C32_ADDRESS,SETTING_BASE+1, &t,1); if (t!=Setting[1]) rt_thread_delay_hmsm(0,0,0,100); else break; } return; } void Setting_Read(void) { IIC_ReadSeq(AT24C32_ADDRESS,SETTING_BASE,Setting,SETTING_LENGTH); return; } void pomodoro_set(uint8_t a,uint8_t b,uint8_t c) { Setting[POMODORO_TIME] = a; Setting[POMODORO_BREAK_TIME] = b; Setting[POMODORO_REST_TIME] = c; Setting_Write(); return; } FINSH_FUNCTION_EXPORT_ALIAS(pomodoro_set,pomodoro,Set Interval of Pomodoro Clock(Working,Break,Rest)) */ void time(void) { rt_enter_critical(); rt_kprintf(" Date:\t20%x-%x-%x\n Time:\t%x:%x:%x\n Temperature:\t%d C\n",\ IIC_Read(DS3231_ADDRESS, DS3231_YEAR),IIC_Read(DS3231_ADDRESS,DS3231_MONTH)&0x7f,IIC_Read(DS3231_ADDRESS,DS3231_DAY),\ IIC_Read(DS3231_ADDRESS, DS3231_HOUR),IIC_Read(DS3231_ADDRESS,DS3231_MINUTE),IIC_Read(DS3231_ADDRESS,DS3231_SECOND),\ IIC_Read(DS3231_ADDRESS, DS3231_TEMP_MSB)); rt_exit_critical(); return; }
void MPU6050_read(unsigned char WriteAddr,unsigned char *pData,unsigned char Num) { unsigned char chk=0; chk = IIC_Read(pData,MPU6050_Addr,WriteAddr,Num); if(chk != I2C_NOTimeout) rt_kprintf("I2C TimerOut \n"); }
// ============================================================================= // 功能:读加速度器的寄存器(内部调用) // 参数:RegAddr,寄存器地址(8位) // pbyBuf,读取结果存储空间 // wBytesNum,读取数据的长度 // 返回:true,读取成功;false,读取失败 // ============================================================================= bool_t __MMA8541Q_ReadReg(u8 RegAddr, u8 *pbyBuf, u16 wBytesNum) { if(wBytesNum == IIC_Read(ps_MMA_Dev,RegAddr,pbyBuf,wBytesNum,s_MMA_Timeout)) return true; else return false; }
char MPU6050_sread(unsigned char WriteAddr) { unsigned char Data; // Single_read(&Data,MPU6050_Addr,WriteAddr,1); IIC_Read(&Data,MPU6050_Addr,WriteAddr,1); return Data; }
//Reads the current pressure in Pa //Unit must be set in barometric pressure mode //Returns -1 if no new data is available float MPL3115A2::readPressure() { //Check PDR bit, if it's not set then toggle OST if(IIC_Read(STATUS) & (1<<2) == 0) toggleOneShot(); //Toggle the OST bit causing the sensor to immediately take another reading //Wait for PDR bit, indicates we have new pressure data int counter = 0; while(IIC_Read(STATUS) & (1<<2) == 0) { if(++counter > 600) return(-999); //Error out after max of 512ms for a read delay(1); } // Read pressure registers Wire.beginTransmission(MPL3115A2_ADDRESS); Wire.write(OUT_P_MSB); // Address of data to get Wire.endTransmission(false); // Send data to I2C dev with option for a repeated start. THIS IS NECESSARY and not supported before Arduino V1.0.1! Wire.requestFrom(MPL3115A2_ADDRESS, 3); // Request three bytes //Wait for data to become available counter = 0; while(Wire.available() < 3) { if(counter++ > 100) return(-999); //Error out delay(1); } byte msb, csb, lsb; msb = Wire.read(); csb = Wire.read(); lsb = Wire.read(); toggleOneShot(); //Toggle the OST bit causing the sensor to immediately take another reading // Pressure comes back as a left shifted 20 bit number long pressure_whole = (long)msb<<16 | (long)csb<<8 | (long)lsb; pressure_whole >>= 6; //Pressure is an 18 bit number with 2 bits of decimal. Get rid of decimal portion. lsb &= 0b00110000; //Bits 5/4 represent the fractional component lsb >>= 4; //Get it right aligned float pressure_decimal = (float)lsb/4.0; //Turn it into fraction float pressure = (float)pressure_whole + pressure_decimal; return(pressure); }
float MPL3115A2::readTemp() { if(IIC_Read(STATUS) & (1<<1) == 0) toggleOneShot(); //Toggle the OST bit causing the sensor to immediately take another reading //Wait for TDR bit, indicates we have new temp data int counter = 0; while( (IIC_Read(STATUS) & (1<<1)) == 0) { if(++counter > 600) return(-999); //Error out after max of 512ms for a read delay(1); } // Read temperature registers Wire.beginTransmission(MPL3115A2_ADDRESS); Wire.write(OUT_T_MSB); // Address of data to get Wire.endTransmission(false); // Send data to I2C dev with option for a repeated start. THIS IS NECESSARY and not supported before Arduino V1.0.1! Wire.requestFrom(MPL3115A2_ADDRESS, 2); // Request two bytes //Wait for data to become available counter = 0; while(Wire.available() < 2) { if(counter++ > 100) return(-999); //Error out delay(1); } byte msb, lsb; msb = Wire.read(); lsb = Wire.read(); toggleOneShot(); //Toggle the OST bit causing the sensor to immediately take another reading //Negative temperature fix by D.D.G. word foo = 0; bool negSign = false; //Check for 2s compliment if(msb > 0x7F) { foo = ~((msb << 8) + lsb) + 1; //2’s complement msb = foo >> 8; lsb = foo & 0x00F0; negSign = true; }
// ============================================================================= // 功能:读数据 // 参数:Addr,读数据的地址 // pDstBuf,读数据的存储地址 // DstLen,地址长度 // 返回:读取的数据量,字节 // ============================================================================= u32 E2PROM_ReadData(u32 Addr,u8 *pDstBuf,u32 DstLen) { u32 result = 0; if((Addr + DstLen > CN_E2ROM_MAX_SIZE) || (DstLen == 0)) return result; result = IIC_Read(&pg_E2ROM_Dev,Addr,pDstBuf,DstLen,CN_E2ROM_OP_TIMEOUT); return result; }
//这种读法有问题 ,IIC!! void Multiple_read_HMC5883(u8*BUF) { u8 i; i=IIC_Read(HMC_SlaveAddress,RES_X_MSB,6,BUF); // printf("%d\r\n",i); Hmc_X = (BUF[0]<<8) | BUF[1]; Hmc_Y = (BUF[2]<<8) | BUF[3]; Hmc_Z = (BUF[4]<<8) | BUF[5]; printf("----------------%d %d %d %d %d %d\r\n",BUF[0],BUF[1],BUF[2],BUF[3],BUF[4],BUF[5]); }
void SetPWMFreq(short freq) { short prescale=6103; uint8_t oldmode,newmode; freq*=0.9; prescale/=freq; oldmode =IIC_Read(PCA_Add,PCA9685_MODE1); newmode =(oldmode&0x7f)|0x10; IIC_Write(PCA_Add,PCA9685_MODE1,newmode); IIC_Write(PCA_Add,PCA9685_PRESCALE,prescale); IIC_Write(PCA_Add,PCA9685_MODE1,oldmode); Delay5ms(); IIC_Write(PCA_Add,PCA9685_MODE1,oldmode|0xa1); }
// ============================================================================= // 功能:读取此时是否触摸屏上有触摸 // 参数:无 // 返回:1,触摸;0,未触摸 // ============================================================================= static bool_t CRT_Touched(void) { u8 buf,RegAddr,wBytesNum; bool_t result = false; RegAddr = CRT_STATUS; wBytesNum = 1; wBytesNum = IIC_Read(ps_CRT_Dev,RegAddr,&buf,wBytesNum,s_CRT_Timeout); if(1 == wBytesNum) { if(buf & CRT_SR_RTST_MASK) result = true; } return result; }
static int __init s3c2410_kbd_init(void) { int ret; int oldiiccon; int flags; ret = set_external_irq(IRQ_KBD, EXT_FALLING_EDGE, GPIO_PULLUP_EN); local_irq_save(flags); IIC_init(); Set_IIC_mode(ZLG7289_IICCON, &oldiiccon); ret=IIC_Read(ZLG7290_ADDR, 0); //restore IICCON Set_IIC_mode(oldiiccon, NULL); local_irq_save(flags); DPRINTK("zlg7290 system register=0x%x\n", ret); KBD_CLOSE_INT(); ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops); if (ret < 0) { printk(DEVICE_NAME " can't get major number\n"); return ret; } kbdMajor = ret; /* Enable touch interrupt */ ret = request_irq(IRQ_KBD, s3c2410_isr_kbd,SA_INTERRUPT, DEVICE_NAME, s3c2410_isr_kbd); if (ret) { return ret; } kbddev.head = kbddev.tail = 0; kbddev.kbdmode= KEY_NULL; init_waitqueue_head(&(kbddev.wq)); #ifdef CONFIG_DEVFS_FS devfs_kbd_dir = devfs_mk_dir(NULL, "keyboard", NULL); devfs_kbdraw = devfs_register(devfs_kbd_dir, "0raw", DEVFS_FL_DEFAULT, kbdMajor, KBDRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR, &s3c2410_fops, NULL); #endif printk (DEVICE_NAME"\tinitialized\n"); return 0; }
// ============================================================================= // 功能:读取触摸屏AD采样值,分别为X值和Y值,未做校正的数据 // 参数:X,Y,输出参数,存储读取到的数据地址 // 返回:true,读取成功;false,读取失败 // ============================================================================= static bool_t CRT_ReadXY(s32 *X, s32 *Y) { u8 buf[4],RegAddr,wBytesNum; bool_t result = false; RegAddr = CRT_XY_AD; wBytesNum = 4; wBytesNum = IIC_Read(ps_CRT_Dev,RegAddr,buf,wBytesNum,s_CRT_Timeout); if(4 == wBytesNum) { *X = (buf[0]<<8) + buf[1]; *Y = (buf[2]<<8) + buf[3]; result = true; } return result; }
unsigned char MPU_Sigle_Read(unsigned reg_addr) { unsigned char reg_data; IIC_Start(); IIC_Send(MPU6050_ADDR); IIC_Wait_Ack(); IIC_Send(reg_addr); IIC_Wait_Ack(); IIC_Start(); IIC_Send(MPU6050_ADDR+1); IIC_Wait_Ack(); reg_data = IIC_Read(); IIC_Ack(1); IIC_Stop(); return reg_data; }
//Returns the number of meters above sea level //Returns -1 if no new data is available float MPL3115A2::readAltitude() { toggleOneShot(); //Toggle the OST bit causing the sensor to immediately take another reading //Wait for PDR bit, indicates we have new pressure data int counter = 0; while( (IIC_Read(STATUS) & (1<<1)) == 0) { if(++counter > 600) return(-999); //Error out after max of 512ms for a read delay(1); } // Read pressure registers Wire.beginTransmission(MPL3115A2_ADDRESS); Wire.write(OUT_P_MSB); // Address of data to get Wire.endTransmission(false); // Send data to I2C dev with option for a repeated start. THIS IS NECESSARY and not supported before Arduino V1.0.1! Wire.requestFrom(MPL3115A2_ADDRESS, 3); // Request three bytes //Wait for data to become available counter = 0; while(Wire.available() < 3) { if(counter++ > 100) return(-999); //Error out delay(1); } byte msb, csb, lsb; msb = Wire.read(); csb = Wire.read(); lsb = Wire.read(); // The least significant bytes l_altitude and l_temp are 4-bit, // fractional values, so you must cast the calulation in (float), // shift the value over 4 spots to the right and divide by 16 (since // there are 16 values in 4-bits). float tempcsb = (lsb>>4)/16.0; float altitude = (float)( (msb << 8) | csb) + tempcsb; return(altitude); }
/************************************************************************************ * * AccelWrite_IicCallback * ************************************************************************************/ // Callback function for Target Board MC1323xRCM #if gTargetBoard_c == gMc1323xRcm_c /* Only for MC1323xRCM board */ void AccelWrite_IicCallback (iicResult_t IicWriteResult) { bool_t fTempErr = 0; iicErr_t SerialComError = gIicErrNoError_c; if(gIicTxRxSuccess_c == IicWriteResult) { switch (mgAccelCurrentStatus) { case gAccelComStatusWrtAddress_c: SerialComError = IIC_Read (mAccelmma7660fcI2cAddress_c,&mgReadBuffer[0], 3,AccelRead_IicCallback); mgAccelCurrentStatus = gAccelComStatusReadBusy_c; if(gIicErrNoError_c != SerialComError) { fTempErr = 1; } break; case gAccelComStatusReadBusy_c: case gAccelComStatusNoInit_c: case gAccelComStatusIdle_c: case gAccelComStatusMax_c: // ERROR fTempErr = 1; break; } } else { fTempErr = 1; } if(fTempErr) { mgAccelCurrentStatus = gAccelComStatusIdle_c; (void)IIC_StopTransaction(mAccelmma7660fcI2cAddress_c); mgAccelCallback(gAccelErrInterfComError_c); } }
void rt_thread_alarm_entry (void *parameter) { uint8_t buf; uint16_t t; rt_uint32_t e; AlarmerInit(); SetAlarm(0); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); if (PWR_GetFlagStatus(PWR_FLAG_WU)==SET) { rt_kprintf("\n\nWaken up by DS3231\n"); if ((IIC_Read(DS3231_ADDRESS, DS3231_CON_STA)) & 0x01) fnAlarm(); IIC_Write(DS3231_ADDRESS, DS3231_CON_STA,0x80); } RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE); while (rt_mq_recv(key_mq,&buf,sizeof(uint8_t),10)==RT_EOK); while (1) { do { rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER); }while(buf!=0); t = 0; reg_output[REG_ALARM]=0xF777F7F7; rt_event_send(reg_event,REG_ALARM_MSK); rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER); if (buf>9) { rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e); continue; } t = buf; reg_output[REG_ALARM]=(0x01000000*REG_HexToReg(buf)) | (0x00FFFFFF & reg_output[REG_ALARM]) | 0x80000000; rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER); if (buf>9) { rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e); continue; } t = t*10+buf; reg_output[REG_ALARM]=(0x00010000*REG_HexToReg(buf)) | (0xFF00FFFF & reg_output[REG_ALARM]); rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER); if (buf>9) { rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e); continue; } t = t*10+buf; reg_output[REG_ALARM]=(0x00000100*REG_HexToReg(buf)) | (0xFFFF00FF & reg_output[REG_ALARM]); rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER); if (buf>9) { rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e); continue; } t = t*10+buf; reg_output[REG_ALARM]=(0x00000001*REG_HexToReg(buf)) | (0xFFFFFF00 & reg_output[REG_ALARM]); rt_mq_recv(key_mq,&buf,sizeof(uint8_t),RT_WAITING_FOREVER); if (buf<=9) { rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e); continue; }else { if (fnSetAlarmClock(t/100,t%100,buf==0x0B)==ERROR) rt_event_recv(reg_event,REG_ALARM_MSK,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,&e); } } }