⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isl29001readerp.nc

📁 tinyos2.0版本驱动
💻 NC
字号:
/**
 * 本程序为ISL29001传感器的接口组件
 * @author Majy & Lizm & Dupl
 * @date 2008/09/27
 */
 
#include "I2C.h"

module ISL29001ReaderP
{
  provides
  {
    interface Read<uint16_t> as ISLReader;
  }
  uses
  {
    interface GeneralIO as PD_Enable;
    interface I2CPacket<TI2CBasicAddr>;
    interface Resource as I2CResource;
  }
}

implementation
{

  uint8_t I2CCmdBuffer[3];
  uint8_t I2CDataBuffer[4];
  uint16_t tmp;

  command error_t ISLReader.read()
  {  
    call PD_Enable.makeOutput();
    call PD_Enable.clr();
    call I2CResource.request();
    I2CCmdBuffer[0] = 0x00;
    return SUCCESS;
  }
  
  event void I2CResource.granted()
  {
    call I2CPacket.write((I2C_START | I2C_STOP), ISL_ADDRESS, 1, I2CCmdBuffer);	
    //call I2CPacket.write(0x03, ISL_ADDRESS, 1, I2CCmdBuffer);	
    return;
  }
  
  task void I2CRead()
  {    
    
	
	I2CDataBuffer[0] = 0;
	I2CDataBuffer[1] = 0;
	I2CDataBuffer[2] = 0;
	I2CDataBuffer[3] = 0;
	
    call I2CPacket.read((I2C_START | I2C_STOP), ISL_ADDRESS, 4, I2CDataBuffer);
    //call I2CPacket.read(0x03, ISL_ADDRESS, 4, I2CDataBuffer);
	//从mI2CDataBuffer读取4个字节数值
    //I2C共有4个8位数据寄存器TWDR,但无法为其都分配地址,因此只能一次性全部读出,
    //其中前2个寄存器中存放的分别是最近感知数值的低8位和高8位,little-endian方式
    //后2个寄存器中存放的分别是integration counter value的低8位和高8位
    //详见29001关于数据寄存器TWDR的说明	
  }
  
  async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data)  
  {		
    post I2CRead();
    return;
  }
  
  task void I2CReadDone()
  {
    uint8_t temp1, temp2;
    temp1 = (uint16_t)I2CDataBuffer[1];//感知数据的低8位,强制转换为16位数据
	temp2 = (uint16_t)I2CDataBuffer[2];//感知数据的高8位,强制转换为16位数据
	tmp = (temp2 << 8)|temp1;//tmp高8位是temp2,低8位是temp1
	//tmp的高8位是数据的高位,低8位是数据的低位
    signal ISLReader.readDone(SUCCESS, tmp);
  }
  
  async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data)  
  {
    post I2CReadDone();
    call I2CResource.release();
    return;
  }
  
  default event void ISLReader.readDone(error_t result, uint16_t val)
  {
    return;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -