static void LCD_open_cmd(__u32 sel) { IIC_Write(0xfc, 0xf830, 0xb2); IIC_Write(0xfc, 0xf833, 0xc2); IIC_Write(0xfc, 0xf831, 0xf0); IIC_Write(0xfc, 0xf840, 0x80); IIC_Write(0xfc, 0xf881, 0xec); }
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 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); }
/************************************************************************************ * * Accel_GetXYZMeasurements * ************************************************************************************/ #if TRUE == gAccelerometerSupported_d #if gTargetBoard_c == gMc1323xRcm_c /* Only for MC1323xRCM board */ accelErr_t Accel_GetXYZMeasurements (accelData_t* XYZValues, accelCallback_t AccelCallback) { iicErr_t SerialComError = gIicErrNoError_c; uint8_t au8TempBuffer = 0; #if(TRUE == gAccelParameterValidation_d) if((NULL == XYZValues) || (NULL == AccelCallback)) { return gAccelErrInvalidParam_c; } #endif if( gAccelComStatusIdle_c != mgAccelCurrentStatus) { return gAccelErrDriverBusy_c; } mgXYZValues = XYZValues; mgAccelCallback = AccelCallback; au8TempBuffer = mAccelXValueReg_c; SerialComError = IIC_Write (mAccelmma7660fcI2cAddress_c,&au8TempBuffer, 1,AccelWrite_IicCallback); if(gIicErrNoError_c != SerialComError) { (void)IIC_StopTransaction(mAccelmma7660fcI2cAddress_c); return gAccelErrInterfComError_c; } else { mgAccelCurrentStatus = gAccelComStatusWrtAddress_c; } return gAccelNoError_c; }
// ============================================================================= // 功能:在指定地址写入一个字节的数据 // 参数:Addr,写入地址 // Value,写入的数据 // 返回:写入的数据量 // ============================================================================= u32 E2PROM_WriteByte(u32 Addr,u8 Value) { u32 result = 0; if(Addr > CN_E2ROM_MAX_SIZE) return result; result = IIC_Write(&pg_E2ROM_Dev,Addr,&Value,1,true,CN_E2ROM_OP_TIMEOUT); return result; }
void Set_Time(uint8_t Y,uint8_t M,uint8_t D,uint8_t w, uint8_t h,uint8_t m, uint8_t s) { IIC_Write(DS3231_ADDRESS, DS3231_SECOND , ((s/10)<<4)|(s%10)); IIC_Write(DS3231_ADDRESS, DS3231_MINUTE , ((m/10)<<4)|(m%10)); IIC_Write(DS3231_ADDRESS, DS3231_HOUR , ((h/10)<<4)|(h%10)); IIC_Write(DS3231_ADDRESS, DS3231_WEEKDAY , ((w/10)<<4)|(w%10)); IIC_Write(DS3231_ADDRESS, DS3231_YEAR , ((Y/10)<<4)|(Y%10)); IIC_Write(DS3231_ADDRESS, DS3231_MONTH , ((M/10)<<4)|(M%10)); IIC_Write(DS3231_ADDRESS, DS3231_DAY , ((D/10)<<4)|(D%10)); time(); return; }
// ============================================================================= // 功能:按页写,最大字节不能超过一页大小的数据,WC是芯片的写控制引脚,每次写之前需拉低 // 电平,写完需拉高电平,但是本板件WC一直是低电平,这样导致写完后,芯片需花一定 // 时间去判断是否写完 // 参数:PageNo,页号 // pSrcBuf,写入的数据 // SrcLen,写入字节数,必须小于一页数据量 // 返回:写入的字节数 // ============================================================================= u32 E2PROM_WritePage(u32 PageNo,u8 *pSrcBuf,u32 SrcLen) { u32 Addr,result=0; if((PageNo > CN_E2ROM_MAX_PAGE) || (SrcLen == 0) || (SrcLen > CN_E2ROM_PAGE_SIZE) || (NULL == pSrcBuf)) return result; Addr = PageNo * CN_E2ROM_PAGE_SIZE; result = IIC_Write(&pg_E2ROM_Dev,Addr,pSrcBuf,SrcLen,1,CN_E2ROM_OP_TIMEOUT); Djy_EventDelay(CN_CHIP_WRITE_FINISHED_TIME); return result; }
char MPU6050_swrite(unsigned char WriteAddr,unsigned char Data) { // Single_write(&Data,MPU6050_Addr,WriteAddr,1); IIC_Write(&Data,MPU6050_Addr,WriteAddr,1); return Data; }
void PCA_Reset() { IIC_Write(PCA_Add,PCA9685_MODE1,0x00); }
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); } } }