律动的青春
 
Break out!
    

【I2C MPR084】 | 2008-12-04 20:16:50

/*******************************************************************/
/*!
 * 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的工作时序是很有必要的~ 把这个结构记录下来,以后写驱动程序的时候可以用这个结构来写。

上一篇   下一篇

以下网友评论只代表其个人观点,不代表本网站的观点或立场

数据加载中......
*
  (在使用IE浏览器下,如果系统长时间没有响应,您可以刷新页面,然后按ctrl+v将评论内容复制回来!)
EEFOCUS BLOG意见反馈留言板 不良信息反馈 欢迎批评指正
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 与非门科技(北京)有限公司 All Rights Reserved.