标题:
apd9930接近传感器STM32 IIC源码
[打印本页]
作者:
zhaosj
时间:
2018-2-2 10:16
标题:
apd9930接近传感器STM32 IIC源码
apd9930接近传感器IIC源码C stm32平台
0.png
(46.29 KB, 下载次数: 99)
下载附件
2018-2-2 16:14 上传
单片机源程序如下:
/*******************************************************************************
*Filename: apd9930.c
*Revised: $Date: 2017-11-16 15:23 $
*Author: double
*Description: 温湿度传感器驱动
*******************************************************************************
*************************引脚配置**********************************************
*******************************************************************************
*
* --------------------
* | PB8 |--> SCL
* | PB9 |--> SDA
* --------------------
*******************************************************************************/
#include "apd9930.h"
#define DISTANCE_DOWN_VLAUE 1000 //距离的界限值
unsigned char Distance_status = 0;
unsigned char status[2];
unsigned short distance;
#define DISTANCE_READ_TIMES 3
unsigned char DistanceReadCnt = 0; //ADC读取计数
unsigned int diatnce_vlaue[2*DISTANCE_READ_TIMES]; //读取值
unsigned char init_APDS9930(void);
/*******************************************************************************
* @fn apd9930_init
*
* @brief 初始化
*
* @return none
*
******************************************************************************/
void apd9930_init(void){
// SCL_OUT();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入,或者改成上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
// __HAL_RCC_GPIOB_CLK_ENABLE();
// HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
// GPIO_InitStruct.Pin = GPIO_PIN_8;
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//
// GPIO_InitStruct.Pin = GPIO_PIN_9;
// GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
delay_us(150);
init_APDS9930();
}
void APD9930_SDA_IN(void){
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入,或者改成上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void APD9930_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void APD9930_SDA_H(void)
{
APD9930_SDA_OUT();
APD9930_IIC_SDA_H;
}
void APD9930_SDA_L(void)
{
APD9930_SDA_OUT();
APD9930_IIC_SDA_L;
}
unsigned char APD9930_SDA_Read(void)
{
APD9930_SDA_IN();
return APD9930_READ_SDA;
}
void APD9930_SCL_H(void)
{
APD9930_IIC_SCL_H;
}
void APD9930_SCL_L(void)
{
APD9930_IIC_SCL_L;
}
void APD9930_i2c_delay(void)
{
unsigned int z;
for(z=0;z<10;z++);
//2M时钟,一个指令周期就行。测量速度是20ms读取完数据
__nop();
}
unsigned char APD9930_i2c_star(void)
{
APD9930_SDA_H();
APD9930_SCL_H();
APD9930_i2c_delay();
if (!APD9930_SDA_Read())
return 1;
APD9930_SDA_L();
APD9930_i2c_delay();
if (APD9930_SDA_Read())
return 1;
APD9930_SDA_L();
APD9930_SCL_L();
APD9930_i2c_delay();
return 0;
}
void APD9930_i2c_stop(void)
{
APD9930_SCL_L();
APD9930_i2c_delay();
APD9930_SDA_L();
APD9930_i2c_delay();
APD9930_SCL_H();
APD9930_i2c_delay();
APD9930_SDA_H();
APD9930_i2c_delay();
}
void APD9930_i2c_ack(void)
{
APD9930_SCL_L();
APD9930_i2c_delay();
APD9930_SDA_L();
APD9930_i2c_delay();
APD9930_SCL_H();
APD9930_i2c_delay();
APD9930_SCL_L();
APD9930_i2c_delay();
}
void APD9930_i2c_noAck(void)
{
APD9930_SCL_L();
APD9930_i2c_delay();
APD9930_SDA_H();
APD9930_i2c_delay();
APD9930_SCL_H();
APD9930_i2c_delay();
APD9930_SCL_L();
APD9930_i2c_delay();
}
unsigned char APD9930_i2c_waitAck(void)
{
unsigned char t = 200;
APD9930_SCL_L();
APD9930_i2c_delay();
APD9930_SDA_H();
APD9930_i2c_delay();
//////////////////////////此处为金句,IO输入输出切换的瞬间有抖动,造成异常应答
APD9930_SDA_Read();
//////////////////////////
APD9930_SCL_H();
APD9930_i2c_delay();
while( APD9930_SDA_Read() )
{
t --;
APD9930_i2c_delay();
if(t==0)
{
APD9930_SCL_L();
return 1;
}
APD9930_i2c_delay();
}
APD9930_i2c_delay();
APD9930_SCL_L();
APD9930_i2c_delay();
return 0;
}
void APD9930_i2c_sendByte( unsigned char byte )
{
unsigned char i = 8;
while (i--) {
APD9930_SCL_L();
APD9930_i2c_delay();
if (byte & 0x80)
APD9930_SDA_H();
else
APD9930_SDA_L();
byte <<= 1;
APD9930_i2c_delay();
APD9930_SCL_H();
APD9930_i2c_delay();
}
APD9930_SCL_L();
APD9930_i2c_delay();
}
unsigned char APD9930_i2c_readByte(void)
{
unsigned char i = 8;
unsigned char byte = 0;
APD9930_SDA_H();
APD9930_SDA_Read();
while (i--)
{
byte <<= 1;
APD9930_SCL_L();
APD9930_i2c_delay();
APD9930_SCL_H();
APD9930_i2c_delay();
if (APD9930_SDA_Read())
{
byte |= 0x01;
}
}
APD9930_SCL_L();
APD9930_i2c_delay();
return byte;
}
//--------------------------------------------------------------------------
// Function: void WriteCharToChip(unsigned int address,unsigned char dat)
// Discrption:
//00000 Normal ?no action
//00101 Proximity interrupt clear
//00110 ALS interrupt clear
//00111 Proximity and ALS interrupt clear
//other Reserved ?Do not write
//--------------------------------------------------------------------------
void ClearINTF(unsigned char address)
{
APD9930_i2c_star();
APD9930_i2c_sendByte(((0x39<<1)&(0XFE)));
APD9930_i2c_waitAck();
APD9930_i2c_sendByte(0xA0|address);
APD9930_i2c_waitAck();
APD9930_i2c_stop();
}
//--------------------------------------------------------------------------
// Function: void WriteCharToChip(unsigned int address,unsigned char dat)
// Discrption:
//--------------------------------------------------------------------------
void WriteRegData(unsigned char address,unsigned char dat)
{
APD9930_i2c_star();
APD9930_i2c_sendByte(((0x39<<1)&(0XFE)));
APD9930_i2c_waitAck();
APD9930_i2c_sendByte(0x80|address);
APD9930_i2c_waitAck();
APD9930_i2c_sendByte(dat);
APD9930_i2c_waitAck();
APD9930_i2c_stop();
}
void Delay(unsigned char x){
delay_us(x);
}
//--------------------------------------------------------------------------
// Function: unsigned char ReadCharFromChip(unsigned int Address)
// Discrption:
//--------------------------------------------------------------------------
unsigned short int Read_Word(unsigned char Address)
{
unsigned char recv_data[2];///0 low; 1 high
APD9930_i2c_star();
APD9930_i2c_sendByte((0x39<<1)&(0XFE));
APD9930_i2c_waitAck();
APD9930_i2c_sendByte(0xa0|Address);
APD9930_i2c_waitAck();
//SCL_LOW();
APD9930_i2c_star();
APD9930_i2c_sendByte(((0x39<<1)|(0X01)));
APD9930_i2c_waitAck();
recv_data[0]=APD9930_i2c_readByte();
APD9930_i2c_ack();
Delay(5);
recv_data[1]=APD9930_i2c_readByte();
APD9930_i2c_noAck();
APD9930_i2c_stop();
return (unsigned short int)(recv_data[0] + 256 * recv_data[1]);
}
//--------------------------------------------------------------------------
//read byte
//--------------------------------------------------------------------------
unsigned char Read_byte(unsigned char Address)
{
unsigned char recv_data;
APD9930_i2c_star();
APD9930_i2c_sendByte((0x39<<1)&(0XFE));
APD9930_i2c_waitAck();
APD9930_i2c_sendByte(0xA0|Address);
APD9930_i2c_waitAck();
//SCL_LOW();
// SCL = 0;///////////////////////////////////////////////////////////////////////////////////////////////////
APD9930_i2c_star();
APD9930_i2c_sendByte(((0x39<<1)|(0X01)));
APD9930_i2c_waitAck();
recv_data=APD9930_i2c_readByte();
APD9930_i2c_noAck();
APD9930_i2c_stop();
return recv_data;
}
unsigned char init_APDS9930(void)
{
unsigned char ATIME,PTIME,WTIME,PPCOUNT;
unsigned char PDRIVE,PDIODE,PGAIN,AGAIN;
unsigned char WEN,PEN,AEN,PON;
// unsigned short int CH0_data, CH1_data, Prox_data_18,Prox_data_19,Prox_data,IAC1,IAC2;
// unsigned short int CH0_data1, CH1_data1, Prox_data1_18,Prox_data1_19,Prox_data1,IAC1a,IAC2a;
char CH0_data,CH1_data,Pro_data;
ATIME = 0xf6; // 2.7 ms ?minimum ALS integration time
WTIME = 0xff; // 2.7 ms ?minimum Wait time
PTIME = 0xf6; // 2.7 ms ?minimum Prox integration time
PPCOUNT = 0x08; // Minimum prox pulse count
WriteRegData(0, 0); //Disable and Powerdown
WriteRegData (1, ATIME);
WriteRegData (2, PTIME);
WriteRegData (3, WTIME);
//WriteRegData (0xd, 0);
WriteRegData (0xe, PPCOUNT);
Delay(120); //Wait for 12 ms
PDRIVE = 0; //100mA of LED Power
PDIODE = 0x20; // CH1 Diode
PGAIN = 0; //1x Prox gain
AGAIN = 0; //1x ALS gain
WriteRegData (0xf, PDRIVE | PDIODE | PGAIN |AGAIN);
//WriteRegData(0xc,0xf0);
WEN = 8; // Enable Wait
PEN = 4; // Enable Prox
AEN = 2; // Enable ALS
PON = 1; // Enable Power On
WriteRegData (0, WEN | PEN | AEN | PON);
//WriteRegData(0,0x0f );
Delay(120); //Wait for 12 ms
CH0_data = Read_Word(0x14);
CH1_data = Read_Word(0x16);
Pro_data = Read_Word(0x18);
if(CH0_data | CH1_data | Pro_data){}
return 1;
}
unsigned short int distance_value(void)
{
unsigned int dis;
unsigned int i,j,k;
DistanceReadCnt++;
if(DistanceReadCnt>=2*DISTANCE_READ_TIMES) DistanceReadCnt = DISTANCE_READ_TIMES;
diatnce_vlaue[DistanceReadCnt%DISTANCE_READ_TIMES] = Read_Word(0x18);
if(DistanceReadCnt>=2*DISTANCE_READ_TIMES){
DistanceReadCnt = DISTANCE_READ_TIMES;
//排序
for(i=0;i<DISTANCE_READ_TIMES;i++){
for(k=i,j=k+1;j<DISTANCE_READ_TIMES;j++)
if(diatnce_vlaue[k]<diatnce_vlaue[j]) k=j;
if(k!=i){
j=diatnce_vlaue[k];
diatnce_vlaue[k]=diatnce_vlaue[i];
diatnce_vlaue[i]=j;
}
}
dis = 0;
if(DISTANCE_READ_TIMES>2){
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
apd9930.zip
(3.22 KB, 下载次数: 140)
2018-2-2 10:16 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
wangwei0952
时间:
2018-3-20 18:35
正好在调试 下来看看
作者:
zsy118
时间:
2018-4-26 11:23
本帖最后由 zsy118 于 2018-4-26 17:44 编辑
正是我需要的,希望有用
作者:
gmy2171
时间:
2018-6-11 08:44
试试看
作者:
zhpic
时间:
2020-6-24 23:08
学习一下。
作者:
秋枫彼岸花
时间:
2020-12-17 15:08
下载来看看是不是我所需要的,先谢谢楼主的分享
作者:
adad2
时间:
2022-7-1 13:54
51黑,有你更精彩
作者:
fqh123
时间:
2024-6-13 10:44
正好在调试 下来看看
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1