STM32F103 使用 AS7341 光谱检测传感器的驱动程序
因为项目需要,使用到AS7341传感器并且通过STM32进行处理与发送,而搜索了很久,并没有找到使用STM32对于该传感器的驱动程序,只有Arduino的相关例程。
又因为本人没有学过Arduino,对于Arduino所使用的C++也并不熟悉,只能参考其他文章与代码来做出修改。
(参考的文章:STM32F429 使用 TCS34725 颜色传感器的驱动程序、AS7341 Visible Light Sensor
)
1、Arduino代码的记录
器件地址如下:
寄存器地址如下:
以下是Arduino代码中的寄存器地址配置,可以直接用
#define REG_AS7341_ASTATUS 0X60
/*
#define REG_AS7341_CH0_DATA_L 0X61//文档中说可以从0x60或者0x94开始查询,该地方使用第二种
#define REG_AS7341_CH0_DATA_H 0X62
#define REG_AS7341_ITIME_L 0X63
#define REG_AS7341_ITIME_M 0X64
#define REG_AS7341_ITIME_H 0X65
#define REG_AS7341_CH1_DATA_L 0X66
#define REG_AS7341_CH1_DATA_H 0X67
#define REG_AS7341_CH2_DATA_L 0X68
#define REG_AS7341_CH2_DATA_H 0X69
#define REG_AS7341_CH3_DATA_L 0X6A
#define REG_AS7341_CH3_DATA_H 0X6B
#define REG_AS7341_CH4_DATA_L 0X6C
#define REG_AS7341_CH4_DATA_H 0X6D
#define REG_AS7341_CH5_DATA_L 0X6E
#define REG_AS7341_CH5_DATA_H 0X6F
*/
#define REG_AS7341_CONFIG 0X70
#define REG_AS7341_STAT 0X71
#define REG_AS7341_EDGE 0X72
#define REG_AS7341_CPIO 0X73
#define REG_AS7341_LED 0X74
#define REG_AS7341_ENABLE 0X80
#define REG_AS7341_ATIME 0X81
#define REG_AS7341_WTIME 0X83
#define REG_AS7341_SP_TH_L_LSB 0X84
#define REG_AS7341_SP_TH_L_MSB 0X85
#define REG_AS7341_SP_TH_H_LSB 0X86
#define REG_AS7341_SP_TH_H_MSB 0X87
#define REG_AS7341_AUXID 0X90
#define REG_AS7341_REVID 0X91
#define REG_AS7341_ID 0X92
#define REG_AS7341_STATUS_1 0X93
#define REG_AS7341_ASTATUS 0X94
#define REG_AS7341_CH0_DATA_L 0X95
#define REG_AS7341_CH0_DATA_H 0X96
#define REG_AS7341_CH1_DATA_L 0X97
#define REG_AS7341_CH1_DATA_H 0X98
#define REG_AS7341_CH2_DATA_L 0X99
#define REG_AS7341_CH2_DATA_H 0X9A
#define REG_AS7341_CH3_DATA_L 0X9B
#define REG_AS7341_CH3_DATA_H 0X9C
#define REG_AS7341_CH4_DATA_L 0X9D
#define REG_AS7341_CH4_DATA_H 0X9E
#define REG_AS7341_CH5_DATA_L 0X9F
#define REG_AS7341_CH5_DATA_H 0XA0
#define REG_AS7341_STATUS_2 0XA3
#define REG_AS7341_STATUS_3 0XA4
#define REG_AS7341_STATUS_5 0XA6
#define REG_AS7341_STATUS_6 0XA7
#define REG_AS7341_CFG_0 0XA9
#define REG_AS7341_CFG_1 0XAA
#define REG_AS7341_CFG_3 0XAC
#define REG_AS7341_CFG_6 0XAF
#define REG_AS7341_CFG_8 0XB1
#define REG_AS7341_CFG_9 0XB2
#define REG_AS7341_CFG_10 0XB3
#define REG_AS7341_CFG_12 0XB5
#define REG_AS7341_PERS 0XBD
#define REG_AS7341_GPIO_2 0XBE
#define REG_AS7341_ASTEP_L 0XCA
#define REG_AS7341_ASTEP_H 0XCB
#define REG_AS7341_AGC_GAIN_MAX 0XCF
#define REG_AS7341_AZ_CONFIG 0XD6
#define REG_AS7341_FD_TIME_1 0XD8
#define REG_AS7341_TIME_2 0XDA
#define REG_AS7341_CFG0 0XD7
#define REG_AS7341_STATUS 0XDB
#define REG_AS7341_INTENAB 0XF9
#define REG_AS7341_CONTROL 0XFA
#define REG_AS7341_FIFO_MAP 0XFC
#define REG_AS7341_FIFO_LVL 0XFD
#define REG_AS7341_FDATA_L 0XFE
#define REG_AS7341_FDATA_H 0XFF
这篇文章的有较介绍 (AS7341 Visible Light Sensor) 可知,AS7341的主要功能有两种:1、频谱检测 2、闪烁频率检测 。
由于我需要的功能是频谱检测,使用默认的spm模式,因而不需要进行ADC增益与转换时间的设置。以下是我用到的代码。
以下是Arduino源码:
int DFRobot_AS7341::begin(eMode_t mode) //初始化部分
{
uint8_t buffer[2];
_pWire->begin();
_pWire->beginTransmission(_address);
if(_pWire->endTransmission() != 0){
DBG("");
DBG("bus data access error"); DBG("");
return ERR_DATA_BUS;
}
enableAS7341(true);
measureMode = mode;
return ERR_OK;
}
uint8_t DFRobot_AS7341::readID()//读id,用于判断是否是正确
{
uint8_t id;
if(readReg(REG_AS7341_ID,&id,1) == 0){
DBG(