注册登录

TSL2561 Diver例程及TSL2540介绍

TSL2561是一个采用SM-BUS/I2C接口的可以直接读取测量的数字型测量光强度传感器。虽然TAOS被AMS收购后本产品已经不推荐新设计使用,但可以参照本文写出新的TSL2540的驱动例程。

TSL2540也是数字接口的环境光传感器,不同的是一路支持可见光,一路支持红外光。后者实际上可以变成红外遥控的接收器了,延伸出不少有趣的应用。以后再文介绍。

本文采用I2C接口不涉及SM-BUS。(移植的时候要修改工程文件里面I2C.h 位带操作那个寄存器配置就是下面的7行代码,还有,本文采用的I2C地址是浮空输入,所以地址是0x39)

#define IIC_SCL_Pin  GPIO_Pin_9  
#define IIC_SDA_Pin  GPIO_Pin_8  
#define GPIO_IIC     GPIOB  
#define RCC_APB2Periph_GPIOIIC RCC_APB2Periph_GPIOB                                               
  
#define IIC_SDA_OUT()  {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=0x00000003;}//输入模式上拉下拉输入模式  这段代码要修改  
#define IIC_SDA_IN()   {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=0x00000008;}//通用推挽输出50MZ        这个也要修改  
  
#define SDA_PIN_OUT       PBout(8)  
#define SCL_PIN_OUT       PBout(9)  
#define SDA_PIN_IN        PBin(8)  

一、从机地址

根据datasheet,可以看出有一个引脚ADDR SEL用来设置芯片地址,当引脚接地时从机地址为0x29,浮空时从机地址0x39,接高电平时为0x49.在头文件中采用宏定义如下:

1.png

1.      #define TSL2561_ADDR0 0x29 // address with ''0'' shorted on board  
2.	#define TSL2561_ADDR  0x39 // default address  
3.	#define TSL2561_ADDR1 0x49 // address with ''1'' shorted on board  

二、TSL2561的写/读操作

TSL2561采用标准的I2C总线接口,参照数据手册容易得到TSL2561的写时序。时序图,和代码如下。

2.png

/* 
功能:写命令和数据 
参数:command高四位为控制位低四位为要写入数据的地址,date要写入的数据 
*/  
void TSL2561_Write(u8 command,u8 date)  
{  
    iic_start();  
    iic_byte_write(TSL2561_ADDR<<1);  
    iic_wait_ack();  
    iic_byte_write(command);  
    iic_wait_ack();  
    iic_byte_write(date);  
    iic_wait_ack();  
    iic_stop();  
}  

接下来的是读数据。

在读数据的时候,因为TSL2561的ADC的数据寄存器分为DATE0_LOW,DATE0_HIGT,DATE1_LOW,DATE1_HIGT,一共两路每路16位。因此一次读数据要有两次的I2C读操作,并把DATE_HIGT移到高位。

3.png

/* 
功能:读取一个字节的数据 
参数:command高四位为命令,低四位为要读的数据地址地址 
*/  
u16 TSL2561_Read(u8 command)  
{  
    u16 date;  
    iic_start();  
    iic_byte_write(TSL2561_ADDR<<1);  
    iic_wait_ack();  
    iic_byte_write(command);  
    iic_wait_ack();  
      
    iic_start();  
    iic_byte_write((TSL2561_ADDR<<1)+1);  
    iic_wait_ack();  
    date=iic_byte_read(1);  
    date+=(iic_byte_read(1)<<8);  
    iic_stop();  
    return date;  
}  

三、TSL的寄存器地址

每个寄存器地址和几个常用的寄存器地址宏定义如下:

4.png

TIMING寄存器主要设置积分时间。

// TSL2561 registers  
  
#define TSL2561_CMD           0x80  
#define TSL2561_TIMING        0x81  
#define TSL2561_REG_ID        0x8A  
#define TSL2561_DATA0_LOW     0x8C  
#define TSL2561_DATA0_HIGH    0x8D  
#define TSL2561_DATA1_LOW     0x8E  
#define TSL2561_DATA1_HIGH    0x8F  

四、COMMAND寄存器

command寄存器主要用来设置要配置的寄存器地址,其低四位就是上述寄存器地址表中的地址。

5.png

五、Control 寄存器

Control寄存器主要用来控制模块的上电和断电。其值为0x03时上电为0x00时为断电。

6.png

六、TIMING寄存器

 TIMING寄存器主要用俩选择增益和积分时间,说明和代码如下:

7.png

8.png

//Timing Register Value.Set integration time  
                                      //最后两位设置积分时间  
#define  TIMING_13MS         0x00     //积分时间13.7毫秒  
#define  TIMING_101MS        0x01     //积分时间101毫秒  
#define  TIMING_402MS        0x02     //积分时间402毫秒  
#define  TIMING_GAIN_1X      0x10     //增益倍数与积分时间进行或运算  
#define  TIMING_GAIN_16X     0x00      

七、综合代码

/* 
功能:启动TLS模块 
*/  
void TSL2561_PowerOn(void)  
{  
    TSL2561_Write(TSL2561_CMD,TSL2561_POWER_ON);  
}  
/* 
功能:关闭TSL模块 
*/  
void TSL2561_PowerDown(void)  
{  
    TSL2561_Write(TSL2561_CMD,TSL2561_POWER_ON);  
}  
/* 
功能:设置积分时间 
参数:TIMING_13MS、TIMING_101MS、TIMING_402MS| 
      TIMING_GAIN_1X,TIMING_GAIN_16X选择积分时间和增益,两个或运算 
 
*/  
void TSL2561_TimingSet(u8 TIME)  
{  
    iic_start();  
    iic_byte_write(TSL2561_ADDR<<1);  
    iic_wait_ack();  
    iic_byte_write(TSL2561_TIMING);  
    iic_wait_ack();  
    iic_byte_write(TIME);  
    iic_wait_ack();  
    iic_stop();  
}  
/* 
功能:初始化TSL2561模块 
参数: 
*/  
void TSL2561_Init(u8 Time_model)  
{  
    TSL2561_PowerDown();  
      
    TSL2561_TimingSet(Time_model);  
}  
/* 
功能:读取整个字节chanel0 
参数:CHANEL 
*/  
u16 TSL2561_Chanel0Read(void)  
{  
    u16 buff;  
    buff=TSL2561_Read(TSL2561_DATA0_LOW);  
    return buff;  
}  
/* 
功能:读取chanel1数据 
参数:无 
*/  
u16 TSL2561_Chanel1Read(void)  
{  
    u16 buff;  
    buff=TSL2561_Read(TSL2561_DATA0_LOW);  
    return buff;  
}  

0条回复

作者
用户头像
文章 0关注 0粉丝 0
发私信
相关文章
联系客服