*以下文章资源均来自互联网,文章内容仅供参考,如果侵犯了您的权益,请留言或通过邮箱与我联系。
The following article resources are all from the Internet, the content of the article is for reference only. If you violate your rights and interests, please leave a message or contact me through email.
E-mail:chaoliang.hou@cn-depulong.com
/****************************************************************************************
在我学习STM32的时候使用的是正点原子的开发板,所以里面的有些代码可能使用了例程中的代码,如果这里会涉及利益上的问题,请与我取得联系。
/*****************************************************************************************
1 VEML6040颜色传感器
1.1 芯片简介
关于VEML6040颜色传感器的详细介绍可以到这个网址去看
https://atta.szlcsc.com/upload/public/pdf/source/20180511/C78465_1ECCD5CBB0DFD90660DF8047804D95FA.pdf
简单点来说,VEML6040是一款颜色传感器,可以获取当前颜色的RGBW值(W值有什么用我也不知道),然后通过计算得到色坐标,最终得到采集的颜色。
VEML6040适用于3.3V的单片机系统,采用I2C总线传输数据,使用OPLG封装(这种封装手焊很难的,因为引脚在芯片正下面)
芯片长这样的,手册里面也给出了推荐的焊盘尺寸:
手册里面得到4个焊盘的大小是不一样的,在立创商城里面也给出了推荐的尺寸:
这里面给出的是4个一样的,我实际用的这种封装焊接过,大小正好,但是还是差点,我推荐用手册中给出的,但是可以画成一样的4个焊盘。
1.2 芯片外围电路
手册中给出了芯片的推荐电路:
外围电路非常简单,
1.GND接地就可以
2.VDD接电源,但是要接0.1UF的电容滤波,所以在给芯片供电的时候,电源线要先经过电容再接入芯片
3.I2C的2根数据线分别接入单片机的I2C总线的引脚。当然你也可以使用I/O口软件模拟I2C的时序,这样的话就直接接2个普通的I/O口就可以了。
4.2跟数据线要通过2个上啦电阻拉高至3.3V(电源电压)
2 I2C总线
至于什么是I2C总线,百度比我解释的更加清楚,大家可以自己去查,VEML6040采用的是I2C总线进行数据传输,我们得首先知道I2C中的几个命令:
还有VEML6040在进行数据传输的时候的方式,手册里面给出了在进行获取颜色数据时候的时序:
3 基于STM32的程序
3.1 I2C驱动
首先我们应该写出I2C的驱动程序,就是上面说的那几个信号,开始、结束、应答信号。我这里采用的是是使用软件模拟的方式来驱动。
3.1.1 I/O口设置
使用软件模拟的话,就随便使用2个I/O就可以了,I/O口设置为输出模式就可以
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
3.1.2 开始信号
这里的SDA1和SCL1是我之前久宏定义好的,就是对应相应的I/O口
void IIC1_Start(void)
{
SDA1_OUT(); //sda线输出
SDA1=1;
SCL1=1;
delay_us(4);
SDA1=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
SCL1