📄 isl29001readerp.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 + -