STM32下光照传感器TSL驱动

8 篇文章 0 订阅

主要基于本人的I2C模拟库文件实现:

#ifndef _TSL_DRV_H_
#define _TSL_DRV_H_
#include "stm32f10x_lib.h"
#include "stm32f10x_nvic.h"

void TSL_i2cInit(void);
u8 TSL_powerUp(void);
void TSL_powerDown(void);
u8 TSL_getLux(float *lux_val);

#endif //_TSL_DRV_H_

#include "HKY_tsl.h"
#include <math.h>

#undef  PIN_SCL
#define PIN_SCL 	GPIO_Pin_10


#undef  PIN_SDA
#define PIN_SDA 	GPIO_Pin_11


#include "HKY_i2c.h"

/*------------------------------TSL 2550-------------------------------------*/
#define TSL_RD_ADDR 	       	0x73 //tsl2550, read address
#define TSL_WR_ADDR 		0x72 //tsl2550, write address
#define TSL_CMD_PD   		0x00 // power down
#define TSL_CMD_PU   		0x03 // power up and read config.
#define TSL_CMD_EXT  		0x1D // set extended mode
#define TSL_CMD_RST  		0x18 // reset to standard mode
#define TSL_CMD_ADC0 		0x43 // read ADC0 value
#define TSL_CMD_ADC1 		0x83 // read ADC1 value
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  TSL_i2cInit 
 */
/* --------------------------------------------------------------------------*/
void TSL_i2cInit(void)
{
    int i;
    TWI_Initialize();
    for (i = 0; i < 10; i++)
    {
	TWI_SCL_0();
	TWI_NOP();
	TWI_SCL_1();
	TWI_NOP();
    }
}
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  i2c_write_single 
 * 
 * @Param: addr
 * @Param: data
 * 
 * @Returns:   
 */
/* --------------------------------------------------------------------------*/
static u8 i2c_write_single(u8 addr, u8 data)
{
    u8 ret = TWI_ACK;
    ret = TWI_START();
    if (ret == TWI_BUS_ERROR)
	return ret;

    ret = TWI_SendByte(addr);
    if (ret == TWI_NACK)
	return ret;

    ret = TWI_SendByte(data);
    if (ret == TWI_NACK)
	return ret;

    TWI_STOP();

    return ret;
}
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  i2c_read_single
 * @Desp :  read one single byte
 * 
 * @Param: addr
 * @Param: data
 * 
 * @Returns: TWI_ACK, TWI_NACK 
 */
/* --------------------------------------------------------------------------*/
static u8 i2c_read_single(u8 addr, u8 *data)
{
    u8 ret = TWI_ACK;
    
    ret = TWI_START();
    if (ret == TWI_BUS_ERROR)
        return ret;

    //send address
    ret = TWI_SendByte(addr);
    if (ret == TWI_NACK)
    	return ret;
	
    //read one byte
    *data = TWI_ReceiveByte();

    TWI_SendNACK();
    TWI_STOP();

    return ret;
}
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  TSL_powerUp 
 * 
 * @Returns:  TWI_NACK, COMMAND
 */
/* --------------------------------------------------------------------------*/
u8 TSL_powerUp(void)
{
    u8 val;
    u8 ret;
    ret = i2c_write_single(TSL_WR_ADDR, TSL_CMD_PU);
    if (ret != 0)
	return ret;
    ret = i2c_read_single(TSL_RD_ADDR, &val);
    if (ret != 0)
	return ret;
    return val;
}
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  TSL_powerDown 
 */
/* --------------------------------------------------------------------------*/
void TSL_powerDown(void)
{
    i2c_write_single(TSL_WR_ADDR, TSL_CMD_PD);
}
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  TSL_readADC0 
 * 
 * @Returns:  succ: val
 * 	      fail: -1 
 */
/* --------------------------------------------------------------------------*/
u8 TSL_readADC0(u8 *val)
{
    u8 ret;
    
    ret = i2c_write_single(TSL_WR_ADDR, TSL_CMD_ADC0);
    if (ret != 0)
	return ret;

    ret = i2c_read_single(TSL_RD_ADDR, val);
    if (ret != 0)
	return ret;

    return ret;
}
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  TSL_readADC1 
 * 
 * @Returns:  succ: val
 * 	      fail: -1 
 */
/* --------------------------------------------------------------------------*/
u8 TSL_readADC1(u8 *val)
{
    u8 ret;
    
    ret = i2c_write_single(TSL_WR_ADDR, TSL_CMD_ADC1);
    if (ret != 0)
	return ret;
    
    ret = i2c_read_single(TSL_RD_ADDR, val);
    if (ret != 0)
	return ret;
    return ret;
}

/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  get_count_val 
 * 
 * @Param: ch
 * 
 * @Returns:   
 */
/* --------------------------------------------------------------------------*/
#define GET_CHORD(ch) ( ((ch) >> 4) & 0x07 )
#define GET_STEP(ch) ((ch) & 0x0f )

static u32 get_count_val(u8 ch)
{
    u32 C, S;
    float CC;
    u32 count_val;

    C = GET_CHORD(ch);
    S = GET_STEP(ch);
    CC = pow(2, C);

    count_val = (u32)( 16.5 * (CC - 1) + (S * CC) );
    return count_val;   
}
/* --------------------------------------------------------------------------*/
/** 
 * @Brief:  TSL_getLux 
 * 
 * @Param: ch0
 * @Param: ch1
 * 
 * @Returns:   
 */
/* --------------------------------------------------------------------------*/
u8 TSL_getLux(float *lux_val)
{
    float r;
    float count_val_0, count_val_1;
    u8 ch0, ch1;
    int ret;

    NVIC_SETPRIMASK();
    ret = TSL_readADC0(&ch0);
    NVIC_RESETPRIMASK();
    if (ret != 0)
	return ret;
    
    NVIC_SETPRIMASK();
    ret = TSL_readADC1(&ch1);
    NVIC_RESETPRIMASK();
    if (ret != 0)
	return ret;

    ch0 &= 0x7f;
    ch1 &= 0x7f;

    count_val_0 = get_count_val(ch0);
    count_val_1 = get_count_val(ch1);

    r = count_val_1 / count_val_0;
   
    *lux_val = (float)(count_val_0 * 0.46 * exp((-1) * 3.13 * r));

    return 0;
}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
stm32--tsl256.zip_stm32是一个压缩文件,其中包含了与stm32tsl256芯片相关的文件和代码。stm32是一种32位的单片机系列,由STMicroelectronics公司推出。它具有高性能、低功耗和丰富的外设接口,适用于各种嵌入式系统应用。tsl256是一种环境光传感器芯片,用于检测周围环境的光照强度。 这个压缩文件可以包含stm32芯片和tsl256传感器之间的通信协议、引脚连接方式、初始化代码以及一些示例应用程序。通过使用这些文件和代码,开发人员可以很方便地在stm32上使用tsl256传感器来测量光照强度。例如,可以通过读取tsl256传感器输出的模拟电压值,转换为相应的光照强度数值。开发人员可以根据需要进行修改和定制,以适应具体的应用场景。 使用stm32--tsl256.zip_stm32文件,开发人员可以节省大量的开发时间和精力。他们无需从零开始编写通信协议和初始化代码,也无需从头研究如何与tsl256传感器进行交互。相反,他们可以直接使用这些提供的文件和代码,快速实现与tsl256传感器的集成,并进行光照强度的测量和应用开发。 总之,stm32--tsl256.zip_stm32是一个方便开发人员在stm32上使用tsl256传感器的压缩文件。它包含了相关的文件和代码,可以用于通信协议、引脚连接、初始化以及示例应用程序。通过使用这些文件和代码,开发人员可以快速、方便地实现在stm32上使用tsl256传感器进行光照强度测量和应用开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值