i2c实现代码.docVIP

  • 12
  • 0
  • 约 4页
  • 2017-03-05 发布于重庆
  • 举报
i2c实现代码

/**********MMA7455L加速度的采集**************/ MMA7455L是一款数字输出、低功耗、紧凑型电容式微机械三轴加速度计,具有信号调理、低通滤波器、温度补偿、自测、可配置通过中断引脚检测0g、以及脉冲检测等功能。0g偏置和灵敏度是出厂配置,无需外部器件、客户可使用指定的0g寄存器和g-Select 量程选择对0g偏置进行校准,量程可通达命令选择3个加速度范围(2g/4g/8g)。 实现代码: /********************初始化***************************/ void init_iic(void) { LPC_SYSCON-PRESETCTRL |= (11); //i2c复位取消,不理解为什么 LPC_SYSCON-SYSAHBCLKCTRL |= (15); //使能iic时钟 LPC_SYSCON-SYSAHBCLKCTRL |= (116);//使能iocon时钟 LPC_IOCON-PIO0_4 |= (10);//将P0.4配置成SCL LPC_IOCON-PIO0_5 |= (10);//将P0.5配置成SDA LPC_SYSCON-SYSAHBCLKCTRL = ~(016); LPC_I2C-SCLH = 47; //180 //快速模式在400KHZ左右 LPC_I2C-SCLL = 93; //180 //设置高低电平占空比 LPC_I2C-CONCLR = 0XFF; //清除iic所有标志位 LPC_I2C-CONSET = (16);//使能iic接口 } void iic_start_Bit(void) { LPC_I2C-CONCLR = 0X2c; //除iic使能位外,其他位都清0;设置过程中,尽量使用赋值“=” LPC_I2C-CONSET = (15); //置位起始条件,发送起始条件 while(!(LPC_I2C-CONSET (13)));//检测中断标志位是否置1,等待起始条件发送 while(LPC_I2C-STAT != 0X08);//检测发送后的状态是否是0x08, 注意:两个while语句以及下面的while语句这样用不是很好,完全可采用中断的方式,在中断程序里判断状态,根据相应的状态,编写相应的服务程序。 这样写只是为了测试程序方便 } void iic_set_mode(void) { iic_start_Bit(); /***主发送模式***/ LPC_I2C-DAT = (0X1D 1);//MMA7455L的device address 0X1D + W位 LPC_I2C-CONCLR = (15)|(13); //清起始bit,清中断标志,注意有多个位要清0时,尽量一次完成,不要分开一位一位的清0或置1,容易出错 while(!(LPC_I2C-CONSET (13))); while(LPC_I2C-STAT!=0x18); LPC_I2C-DAT = 0X16; //MMA7455L的Mode control register LPC_I2C-CONCLR = (13); //清中断标志位 while(!(LPC_I2C-CONSET (13))); while(LPC_I2C-STAT!=0x28); //等待发送完,状态码为0x28 LPC_I2C-DAT = 0X05;// 发送设置数据,MMA7455L,设置为测量模式,测量范围8g LPC_I2C-CONCLR = (13); while(!(LPC_I2C-CONSET (13))); while(LPC_I2C-STAT!=0x28); //等待发送完,状态码为0x28 LPC_I2C-CONCLR = (13); LPC_I2C-CONSET = (14);//发送停止条件 } char iic_readData(char addr) //ddr为x、y、z加速度数据寄存器地址 { char ch; iic_start_Bit(); /***主发送模式***/ LPC_I2C-DAT = (0X1D1); //MMA7455L的device address 0X1D + W LPC_I2C-CONCLR = (15)|(13);

文档评论(0)

1亿VIP精品文档

相关文档