示例#1
0
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;
}
示例#2
0
/*
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;
}
示例#3
0
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");
}
示例#4
0
文件: mma8451q.c 项目: djyos/djyos
// =============================================================================
// 功能:读加速度器的寄存器(内部调用)
// 参数: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;
}
示例#5
0
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;
}
示例#6
0
//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);
}
示例#7
0
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;
	}
示例#8
0
// =============================================================================
// 功能:读数据
// 参数: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;
}
示例#9
0
文件: HMC.c 项目: Eacaen/Quadrotor
//这种读法有问题 ,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]);
		
   
}
示例#10
0
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);
}
示例#11
0
文件: crtch.c 项目: Mars-Wu/djyos
// =============================================================================
// 功能:读取此时是否触摸屏上有触摸
// 参数:无
// 返回: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;
}
示例#12
0
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;
}
示例#13
0
文件: crtch.c 项目: Mars-Wu/djyos
// =============================================================================
// 功能:读取触摸屏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;
}
示例#14
0
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;
}
示例#15
0
//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);
}
示例#16
0
 /************************************************************************************
*
*  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);
   }
   
   
}
示例#17
0
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);

		}
	}
}