TSL2561是一个采用smbus/iic接口的可以直接读取测量的数字型测量光强度传感器。本文采用iic接口不涉及smbs。工程下载:点击打开链接(移植的时候要修改工程文件里面iic.h 位带操作那个寄存器配置就是下面的7行代码,关于stm32位带操作,和iic分析可以看我之前写的两篇博客文章列表里面可以找到,还有我采用的地址是浮空输入所以地址是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)

一、从机地址

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

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

二、TSL2561的写/读操作

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

/*
功能:写命令和数据
参数: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();
}

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

 
/*
功能:读取一个字节的数据
参数: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的寄存器地址

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

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寄存器主要用来设置要配置的寄存器地址,其低四位就是上述寄存器地址表中的地址。

五、Control 寄存器

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

六、TIMING寄存器

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

//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_DATA1_LOW);return buff;
}

在读取CH0和CH1的数据后还要进行一定的补偿计算才能得出实际的光强度,在我的写的代码中,读出CH0和CH1没有问题,但在进行补偿计算时我只是照着数据手册写出了代码,因为我对光的强度没啥概念,也没有合适的测量光强度仪,所以并不能保证补偿计算的正确,但是读出的原始数据是没问题的。下载连接:点击打开链接

TSL2561 STM32驱动程序相关推荐

  1. stm32 2.4寸 TFT 触摸屏STM32驱动程序 2.4inch Arduino Display

    stm32 2.4寸 TFT 触摸屏STM32驱动程序 2.4inch Arduino Display 今日为准备一项比赛,选购了一款2.4寸 8位并口通信的TFT触摸屏,此屏幕原本是专为arduin ...

  2. ADS1015使用指南及STM32驱动程序

    ADS1015使用指南及驱动程序 ADS1015使用指南 简介 ADS1015的引脚介绍 ADS1015的寄存器介绍 寄存器相关配置 驱动程序 ADS1015使用指南 由于网上关于TI公司的ADS10 ...

  3. (标准库)直流无刷电机驱动(1)——简介及STM32驱动程序

    有朋友想看部分讲解可以(标准库)直流无刷电机驱动(2)--霍尔传感器定时器初始化 (标准库)直流无刷电机驱动(3)--霍尔传感器状态获取 ------------------------------- ...

  4. ADS8685/ADS8681/ADS8689的stm32驱动程序

    我在做ad的八路采集模块,用的是多路复用器配合芯片ads8685实现的,但在驱动ads8685芯片的时候费了不少时间,我把自己研究的驱动代码分享给大家,希望能够帮助大家做开发!

  5. AM2302+STM32驱动程序

    AM2302是一款通过数字信号输出来测量空气温湿度的传感器,可测量0~99.9%RH范围内的湿度,精度为±2%RH,分辨度为0.1 RH:可测量-40℃~80℃范围内的温度,精度为±0.5℃,分辨度为 ...

  6. 基于STM32的GPS模块驱动(AIR530)

    一.概述 由于做项目要用到GPS定位,于是在某宝购买了这款GPS模块.项目采用的MCU是STM32.废话少说,进入正题. 二.GPS模块简介 Air530 模块是一款高性能.高集成度的多模卫星定位导航 ...

  7. STM32驱动4寸ST7796S LCD-TFT屏

    STM32驱动4寸ST7796S LCD-TFT屏 简介 屏幕与STM32F103RCT6开发板接线 屏幕原理图 STM32驱动程序 屏幕显示效果 简介 屏幕驱动芯片ST7796S最大支持320*48 ...

  8. 第1讲、Cadence Allergo绘制小马哥DragonFly四轴飞行器PCB四层板教程简介

    初学者在学习单片机的时候大多都没有很明确的学习目的,所以往往学了很多课程之后,还是不能独立开发一个比较简单的项目,甚至不能完成一个简单项目的单独软件或者硬件部分的开发.这是因为大多数人是被动的.没有目 ...

  9. 2020年TI杯大学生电子设计大赛 无线运动传感器节点 备赛、参赛实录(历时一个月)

    转载请标明转载自:https://blog.csdn.net/weixin_44578655/article/details/109020022 9.5 清单已经出了一段时间了.买的少部分元器件也到了 ...

  10. 玩转电机驱动——DRV8848驱动直流减速电机(STM32F103)

    文章目录 前言 一.硬件基础 二.DRV8848驱动 1. DDRV8848芯片特性 2. 引脚的功能及类型 3. DRV8848电路图 三.STM32驱动程序 1. 电路分析 2. 程序编写 2.1 ...

最新文章

  1. 关于Linux的用户管理的相关研究-------(一)
  2. 深度强化学习-马尔科夫决策过程和表格型方法
  3. kaggle研究生招生(下)
  4. boost::math::quadrature::exp_sinh用法的测试程序
  5. 一个应用程序多线程误用的分析
  6. 关系的三类完整性约束
  7. QCon速递:Xen漏洞热补丁修复、异地双活、ODPS新功能与金融互联网
  8. java8之list集合中取出某一属性的方法
  9. 年薪 50w+ 的程序员,是这样写代码的?
  10. javascript操作listbox方法 【转】
  11. 递归求解全排列问题以及八皇后问题
  12. 组建一个局域网一般会用到哪些设备_朋友私信一个简单的问题:端口和网关到底有什么区别?...
  13. 黑马程序员——面向对象篇之多态
  14. 实践项目:图书馆管理系统
  15. [除一波并查集和贪心的草]
  16. html progress标签的样式设置,progress后紧跟数字长度样式
  17. sequence与sequencer
  18. 10种方式卸掉感情垃圾
  19. Ubuntu18.04无法连接Wifi解决方案
  20. 视频人像分割算法—C++推理(视频抠图 图片抠图)

热门文章

  1. 推荐一款Android高清平板应用--豆果美食
  2. 测试工程师入门知识点整理
  3. 2017-2018 Petrozavodsk Winter Training Camp, Saratov SU Contest C.Cover the Paths 贪心+DFS
  4. java练手小项目雷霆战机
  5. Android手机截图怎么做,手机截屏怎么弄,详细教您手机截图方法
  6. java球球的表面积和体积代码_【编程1小时】球体表面积和体积计算
  7. [Dubbox异常] Unable to locate Spring NamespaceHandler for XML schema namespace [http://dubbo.apache[
  8. 关于使用克莱姆法则和矩阵消元法解线性方程组的效率的比较
  9. 大学英语综合教程二 Unit 1 到Unit 8 课文内容英译中 中英翻译
  10. mysql怎么删除临时表里的数据_MySQL如何创建和删除临时表 | 学步园