English | 简体中文 | 繁體中文 | 日本語 | Deutsch | 한국어
Das Broadcom APDS-9960 ist ein digitales RGB-, Umgebungslicht-, Näherungs- und Gestensensorgerät in einem einzigen 8-Pin-Gehäuse. Das Gerät verfügt über eine I2C-kompatible Schnittstelle, die Rot-, Grün-, Blau-, Klar- (RGBC), Näherungs- und Gestenerkennung mit IR-LED bereitstellt. Die RGB- und Umgebungslichterkennungsfunktion erkennt die Lichtintensität unter verschiedenen Lichtbedingungen und durch verschiedene Dämpfungsmaterialien, einschließlich abgedunkeltem Glas. Darüber hinaus ermöglicht der integrierte UV-IR-Sperrfilter eine genaue Erfassung des Umgebungslichts und der korrelierten Farbtemperatur. Die Näherungs- und Gestenfunktion ist werkseitig getrimmt und auf 100 mm Näherungserkennungsabstand kalibriert, ohne dass eine Kalibrierung durch den Kunden erforderlich ist. Die Gestenerkennung verwendet vier gerichtete Fotodioden, die in einen sichtbaren Sperrfilter integriert sind, um einfache OBEN-UNTEN-RECHTS-LINKS-Gesten oder komplexere Gesten genau zu erkennen. Das Hinzufügen von mikrooptischen Linsen innerhalb des Moduls sorgt für hocheffiziente Übertragung und Empfang von Infrarotenergie. Eine interne Zustandsmaschine ermöglicht es, das Gerät zwischen RGBC-, Näherungs- und Gestenmessungen in einen Energiesparzustand zu versetzen, was einen sehr geringen Stromverbrauch bietet Kamera-Touchscreen deaktivieren, Austausch mechanischer Schalter, Gestenerkennung und so weiter.
LibDriver APDS9960 ist der voll funktionsfähige Treiber von APDS9960, der von LibDriver gestartet wurde. LibDriver ist MISRA-konform.
/src enthält LibDriver APDS9960-Quelldateien.
/interface enthält die plattformunabhängige Vorlage LibDriver APDS9960 IIC.
/test enthält den Testcode des LibDriver APDS9960-Treibers und dieser Code kann die erforderliche Funktion des Chips einfach testen.
/example enthält LibDriver APDS9960-Beispielcode.
/doc enthält das LibDriver APDS9960-Offlinedokument.
/Datenblatt enthält APDS9960-Datenblatt.
/project enthält den allgemeinen Beispielcode für Linux- und MCU-Entwicklungsboards. Alle Projekte verwenden das Shell-Skript, um den Treiber zu debuggen, und die detaillierten Anweisungen finden Sie in der README.md jedes Projekts.
/misra enthält die Ergebnisse des LibDriver MISRA Code Scans.
Verweisen Sie auf eine plattformunabhängige IIC-Schnittstellenvorlage und stellen Sie Ihren Plattform-IIC-Treiber fertig.
Fügen Sie das Verzeichnis /src, den Schnittstellentreiber für Ihre Plattform und Ihre eigenen Treiber zu Ihrem Projekt hinzu. Wenn Sie die Standardbeispieltreiber verwenden möchten, fügen Sie das Verzeichnis /example zu Ihrem Projekt hinzu.
Sie können auf die Beispiele im Verzeichnis /example zurückgreifen, um Ihren eigenen Treiber zu vervollständigen. Wenn Sie die Standardprogrammierbeispiele verwenden möchten, erfahren Sie hier, wie Sie diese verwenden.
#include "driver_apds9960_basic.h"
uint8_t res;
uint32_t i, times;
times = 3;
res = apds9960_basic_init();
if (res != 0)
{
return 1;
}
/* 1000 ms */
apds9960_interface_delay_ms(1000);
for (i = 0; i < times; i++)
{
uint8_t proximity;
uint16_t red, green, blue, clear;
/* read rgbc */
res = apds9960_basic_read_rgbc((uint16_t *)&red, (uint16_t *)&green, (uint16_t *)&blue, (uint16_t *)&clear);
if (res != 0)
{
apds9960_interface_debug_print("apds9960: read rgbc failed.\n");
(void)apds9960_basic_deinit();
return 1;
}
/* read proximity */
res = apds9960_basic_read_proximity((uint8_t *)&proximity);
if (res != 0)
{
apds9960_interface_debug_print("apds9960: read proximity failed.\n");
(void)apds9960_basic_deinit();
return 1;
}
/* output */
apds9960_interface_debug_print("%d/%d.\n", i + 1, times);
apds9960_interface_debug_print("apds9960: red is 0x%04X.\n", red);
apds9960_interface_debug_print("apds9960: green is 0x%04X.\n", green);
apds9960_interface_debug_print("apds9960: blue is 0x%04X.\n", blue);
apds9960_interface_debug_print("apds9960: clear is 0x%04X.\n", clear);
apds9960_interface_debug_print("apds9960: proximity is 0x%02X.\n", proximity);
/* 1000 ms */
apds9960_interface_delay_ms(1000);
}
/* deinit */
(void)apds9960_basic_deinit();
return 0;
#include "driver_apds9960_gesture.h"
uint8_t (*g_gpio_irq)(void) = NULL;
static uint8_t gs_flag;
uint8_t res;
uint32_t i, times;
static void a_gesture_callback(uint8_t type)
{
switch (type)
{
case APDS9960_INTERRUPT_STATUS_GESTURE_LEFT :
{
apds9960_interface_debug_print("apds9960: irq gesture left.\n");
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_RIGHT :
{
apds9960_interface_debug_print("apds9960: irq gesture right.\n");
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_UP :
{
apds9960_interface_debug_print("apds9960: irq gesture up.\n");
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_DOWN :
{
apds9960_interface_debug_print("apds9960: irq gesture down.\n");
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_NEAR :
{
apds9960_interface_debug_print("apds9960: irq gesture near.\n");
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_FAR :
{
apds9960_interface_debug_print("apds9960: irq gesture far.\n");
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_GFOV :
{
apds9960_interface_debug_print("apds9960: irq gesture fifo overflow.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GVALID :
{
apds9960_interface_debug_print("apds9960: irq gesture fifo data.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_CPSAT :
{
apds9960_interface_debug_print("apds9960: irq clear photodiode saturation.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_PGSAT :
{
apds9960_interface_debug_print("apds9960: irq analog saturation.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_PINT :
{
apds9960_interface_debug_print("apds9960: irq proximity interrupt.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_AINT :
{
apds9960_interface_debug_print("apds9960: irq als interrupt.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GINT :
{
break;
}
case APDS9960_INTERRUPT_STATUS_PVALID :
{
break;
}
case APDS9960_INTERRUPT_STATUS_AVALID :
{
apds9960_interface_debug_print("apds9960: irq als valid.\n");
break;
}
default :
{
apds9960_interface_debug_print("apds9960: irq unknown.\n");
break;
}
}
}
times = 3;
/* gpio interrupt init */
g_gpio_irq = apds9960_gesture_irq_handler;
if (gpio_interrupt_init() != 0)
{
g_gpio_irq = NULL;
}
res = apds9960_gesture_init(a_gesture_callback);
if (res != 0)
{
(void)gpio_interrupt_deinit();
g_gpio_irq = NULL;
return 1;
}
gs_flag = 0;
for (i = 0; i < times; i++)
{
if (gs_flag != 0)
{
gs_flag = 0;
/* 1000 ms */
apds9960_interface_delay_ms(100);
break;
}
else
{
/* 1000 ms */
apds9960_interface_delay_ms(100);
continue;
}
}
(void)apds9960_gesture_deinit();
(void)gpio_interrupt_deinit();
g_gpio_irq = NULL;
return 0;
#include "driver_apds9960_interrupt.h"
uint8_t (*g_gpio_irq)(void) = NULL;
static uint8_t gs_flag;
uint8_t res;
uint32_t i, times;
static void a_interrupt_callback(uint8_t type)
{
switch (type)
{
case APDS9960_INTERRUPT_STATUS_GESTURE_LEFT :
{
apds9960_interface_debug_print("apds9960: irq gesture left.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_RIGHT :
{
apds9960_interface_debug_print("apds9960: irq gesture right.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_UP :
{
apds9960_interface_debug_print("apds9960: irq gesture up.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_DOWN :
{
apds9960_interface_debug_print("apds9960: irq gesture down.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_NEAR :
{
apds9960_interface_debug_print("apds9960: irq gesture near.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GESTURE_FAR :
{
apds9960_interface_debug_print("apds9960: irq gesture far.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GFOV :
{
apds9960_interface_debug_print("apds9960: irq gesture fifo overflow.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_GVALID :
{
apds9960_interface_debug_print("apds9960: irq gesture fifo data.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_CPSAT :
{
apds9960_interface_debug_print("apds9960: irq clear photodiode saturation.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_PGSAT :
{
apds9960_interface_debug_print("apds9960: irq analog saturation.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_PINT :
{
uint8_t res;
uint8_t proximity;
/* read proximity */
res = apds9960_interrupt_read_proximity((uint8_t *)&proximity);
if (res != 0)
{
apds9960_interface_debug_print("apds9960: read proximity failed.\n");
}
apds9960_interface_debug_print("apds9960: proximity is 0x%02X.\n", proximity);
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_AINT :
{
uint8_t res;
uint16_t red, green, blue, clear;
/* read rgbc */
res = apds9960_interrupt_read_rgbc((uint16_t *)&red, (uint16_t *)&green, (uint16_t *)&blue, (uint16_t *)&clear);
if (res != 0)
{
apds9960_interface_debug_print("apds9960: read rgbc failed.\n");
return 1;
}
/* output */
apds9960_interface_debug_print("apds9960: red is 0x%04X.\n", red);
apds9960_interface_debug_print("apds9960: green is 0x%04X.\n", green);
apds9960_interface_debug_print("apds9960: blue is 0x%04X.\n", blue);
apds9960_interface_debug_print("apds9960: clear is 0x%04X.\n", clear);
gs_flag = 1;
break;
}
case APDS9960_INTERRUPT_STATUS_GINT :
{
apds9960_interface_debug_print("apds9960: irq gesture interrupt.\n");
break;
}
case APDS9960_INTERRUPT_STATUS_PVALID :
{
break;
}
case APDS9960_INTERRUPT_STATUS_AVALID :
{
break;
}
default :
{
apds9960_interface_debug_print("apds9960: irq unknown.\n");
break;
}
}
}
times = 3;
/* gpio interrupt init */
g_gpio_irq = apds9960_interrupt_irq_handler;
if (gpio_interrupt_init() != 0)
{
g_gpio_irq = NULL;
}
/* run interrupt function */
if (apds9960_interrupt_init(_interrupt_callback, 1,
2000, 1, 150) != 0)
{
(void)gpio_interrupt_deinit();
g_gpio_irq = NULL;
return 1;
}
gs_flag = 0;
for (i = 0; i < times; i++)
{
if (gs_flag != 0)
{
gs_flag = 0;
/* 1000 ms */
apds9960_interface_delay_ms(100);
break;
}
else
{
/* 1000 ms */
apds9960_interface_delay_ms(100);
continue;
}
}
(void)apds9960_interrupt_deinit();
(void)gpio_interrupt_deinit();
g_gpio_irq = NULL;
return 0;
Online-Dokumente: https://www.libdriver.com/docs/apds9960/index.html.
Offline-Dokumente: /doc/html/index.html.
Bitte beachten Sie CONTRIBUTING.md.
Urheberrechte © (c) 2015 - Gegenwart LibDriver Alle Rechte vorbehalten
Die MIT-Lizenz (MIT)
Hiermit wird jeder Person kostenlos die Erlaubnis erteilt, eine Kopie zu erhalten
dieser Software und zugehörigen Dokumentationsdateien (die „Software“) zu behandeln
in der Software ohne Einschränkung, einschließlich, aber nicht beschränkt auf die Rechte
zu verwenden, zu kopieren, zu modifizieren, zusammenzuführen, zu veröffentlichen, zu verteilen, unterzulizenzieren und/oder zu verkaufen
Kopien der Software und Personen, denen die Software gehört, zu gestatten
dazu eingerichtet werden, unter folgenden Bedingungen:
Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen enthalten sein
Kopien oder wesentliche Teile der Software.
DIE SOFTWARE WIRD "WIE BESEHEN" BEREITGESTELLT, OHNE JEGLICHE GEWÄHRLEISTUNG, AUSDRÜCKLICH ODER
STILLSCHWEIGEND, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT,
EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG VON RECHTEN DRITTER. IN KEINEM FALL DARF DAS
AUTOREN ODER URHEBERRECHTSINHABER HAFTEN FÜR JEGLICHE ANSPRÜCHE, SCHÄDEN ODER ANDERE
HAFTUNG, OB AUS VERTRAG, DELIKT ODER ANDERWEITIG, ENTSTEHEND AUS,
AUS ODER IM ZUSAMMENHANG MIT DER SOFTWARE ODER DER VERWENDUNG ODER ANDEREN HANDLUNGEN MIT DER
SOFTWARE.
Bitte senden Sie eine E-Mail an lishifenging@outlook.com.