/*******************************************************************/
/*!
* 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");
}
/* Reset Touch Sensor */
MPR084WriteRegister(CONFIGURATION_REGISTER,0x04);
for(i=0;i<10000;i++) {
asm("nop");
}
TOGGLE_ATTN
for(i=0;i<10000;i++) {
asm("nop");
}
/* Initialize key logger */
for(i=0;i< LOG_LENGTH;i++)
{
keylog[i]=0;
}
/* 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();
IIC1D = u8RegisterAddress;
i2c_Wait();
IIC1D = u8Data;
i2c_Wait();
i2c_Stop();
Pause();
}
认为JM_Badge_Board_Bootloader_CW62例程的结构很好,提供了读写MPR084的函数接口。可以直接用来处理键盘事件。但是理解I2C的工作时序是很有必要的~ 把这个结构记录下来,以后写驱动程序的时候可以用这个结构来写。 |