/*******************************************************************/ /*! * I2C Initialization * Set Baud Rate and turn on I2C */ //初始化I2c的频率,并使能 void init_I2C(void) { if(!PTGD_PTGD1) /* If connected to USB and thus 12MHz bus */ { IIC1F =
0x14; /* set MULT and ICR
*/ }
else /*
750kHz bus */ { IIC1F =
0x00; /* set MULT and ICR
*/ } IIC1C1 = 0x80; /* enable
IIC */ }
/*******************************************************************/ /*! * MPR084 Initialization */ //MPR084 初始化,单片机通过i2c设置MPR084 的寄存器 void MPR084_init(void) { /* Delay Loop to ensure MPR084 is powered up */ int i;
for(i=0;i<10000;i++) { asm("nop"); }
/* Turn on I2C Clock */ SCGC1_IIC1=1;
/* Configure I2C */ init_I2C();
/* Turn on ATTN Pin */ PTCDD_PTCDD6=1; ATTN=1;
/* Ensure MPR084 is awake */ TOGGLE_ATTN
/* Delay Loop to ensure MPR084 is powered up */ for(i=0;i<10000;i++) { asm("nop"); }
/* Put in Stop 1 Mode for initial Config */ MPR084WriteRegister(CONFIGURATION_REGISTER,0x14);
/* Set maximum number of concurrent touches allowed to 1 */ MPR084WriteRegister(MAX_TOUCH,0x01);
/* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER1,0x3F); /* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER2,0x3F); /* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER3,0x3F); /* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER4,0x3F); /* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER5,0x3F); /* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER6,0x3F); /* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER7,0x3F); /* Set Sensitivity Threshold to 0x3F */ MPR084WriteRegister(SENSITIVITY_REGISTER8,0x3F);
//寄存器的具体功能参见MPR084的芯片资料中的寄存器表格 /* Turn off Sounder */ MPR084WriteRegister(SOUNDER_CONFIGURATION_REGISTER,0x00);
/* Sound On, Auto Calibration On, Touch and Release Buffer
On, Sensor On */ MPR084WriteRegister(TOUCH_CONFIGURATION_REGISTER, 0x1D);
/* Set 5ms Master Clock */ MPR084WriteRegister(MASTER_TICK_COUNTER_REGISTER,0x00);
/* TASP Multiplier to 2 */
MPR084WriteRegister(TOUCH_ACQUISITION_SAMPLE_PERIOD_REGISTER,0x01);
/* No Delay for Touches */ MPR084WriteRegister(LOW_POWER_CONFIGURATION_REGISTER,
0x00);
/* Turn on IRQ and put in Run 2 Mode */ MPR084WriteRegister(CONFIGURATION_REGISTER,0x13);
/* Turn off I2C Clock */ SCGC1_IIC1=0;
/* Turn on IRQ */ IRQSC=0x52; }
/*******************************************************************/ /*! * Start I2C Transmision * @param SlaveID is the 7 bit Slave Address * @param Mode sets Read or Write Mode */ void IIC_StartTransmission (unsigned char SlaveID,unsigned char
Mode) { if(Mode == MWSR) { /* set transmission mode */ MasterTransmission = MWSR; } else { /* set transmission mode */ MasterTransmission = MRSW; }
/* shift ID in right possition */ SlaveID = (byte) MPR084_I2C_ADDRESS << 1;
/* Set R/W bit at end of Slave Address */ SlaveID |= (byte)MasterTransmission;
/* send start signal */ //S信号发出 i2c_Start();
/* send ID with W/R bit */ i2c_write_byte(SlaveID); }
/*******************************************************************/ /*! * Read a register from the MPR084 * @param u8RegisterAddress is Register Address * @return Data stored in Register */ //通过I2c从MPR084读取数据,并且返回数据(byte ) //需要先理解I2c数据传递的方式 byte u8MPR084ReadRegister(byte u8RegisterAddress) { byte result, result2;
/* Set Register Pointer on MPR084 */ IIC_StartTransmission(SlaveID,MWSR); i2c_Wait();
IIC1D = u8RegisterAddress; i2c_Wait();
i2c_Stop();
Pause();
/* Request data from Register
*/ IIC_StartTransmission(SlaveID,MRSW); i2c_Wait();
i2c_EnterRxMode(); result2 = IIC1D; i2c_Wait();
result = IIC1D; i2c_DisableAck(); i2c_Wait();
i2c_Stop(); result2 = IIC1D;
Pause();
return result; }
/*******************************************************************/ /*! * Write a byte of Data to specified register on MPR084 * @param u8RegisterAddress is Register Address * @param u8Data is Data to write */ //通过i2c向MPR084的寄存器写入数据,用于设置MPR084的工作方式,设定MPR084的读取地址 void MPR084WriteRegister(byte u8RegisterAddress, byte u8Data) { /* send data to slave */ IIC_StartTransmission(SlaveID,MWSR); i2c_Wait();