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
|