Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // MAX44005. Датчик цвета
- //
- #include "max44005.h"
- #include "../drivers.h"
- #define TIMEOUT_DEFAULT 10
- // Номер модуля i2c в контроллере и адрес устройства
- static TI2CDevice Device = { 0x00, 0x88 }; // Модуль 0, адрес 0x88
- // Устройство готово и отвечает?
- static bool Init;
- // Таймаут до следующей попытки
- static uint32_t RetryTimeout;
- // Цвета
- static uint8_t R, G, B; // R G B
- static uint32_t Color; // 0RGB
- static void max44005_Reset(void);
- static void max44005_WaitStart(TI2CStatus Status, uint8_t * Data, uint8_t Length);
- // Прочитаны данные цвета
- static void max44005_Update(TI2CStatus Status, uint8_t * Data, uint8_t Length)
- {
- if(Status != I2C_OK)
- {
- // Попробуем ещё раз
- max44005_Reset();
- return;
- }
- // Данные идут с 6 регистра
- R = Data[1]; // 7: R
- G = Data[3]; // 9: G
- B = Data[5]; // 11: B
- Color = (R << 16) | (G << 8) | B;
- }
- // Запрос данных из датчика с частотой 5 Гц
- static void max44005_Timer(void)
- {
- if(Init)
- {
- // Запрос данных
- i2c_Read(&Device, 0x06, 6, &max44005_Update);
- }
- else
- {
- if(RetryTimeout)
- {
- RetryTimeout--;
- // Прочитаем данные о цвете (6-12)
- if(!RetryTimeout) i2c_Read(&Device, 0x00, 1, &max44005_WaitStart);
- }
- }
- }
- // Отчёт о записи
- static void max44005_Tx(TI2CStatus Status)
- {
- if(Status != I2C_OK)
- {
- // Попробуем ещё раз
- max44005_Reset();
- return;
- }
- Init = true;
- }
- // Обработчик данных, ожидание включения
- static void max44005_WaitStart(TI2CStatus Status, uint8_t * Data, uint8_t Length)
- {
- if(Status == I2C_OK)
- {
- if((*Data & (1 << 2)) == 0) // Сбросился бит PWRON?
- {
- // Сконфигурируем
- uint8_t Buffer[2];
- Buffer[0] = 0x20; // 0x01, mode: AMB + RGB + IR
- Buffer[1] = 0x4C; // 0x02, res: 8 bit, temp en
- i2c_Write(&Device, 0x01, (uint8_t *)&Buffer[0], sizeof(Buffer), &max44005_Tx);
- return;
- }
- }
- // Попробуем ещё раз
- max44005_Reset();
- }
- // Сброс
- static void max44005_Reset(void)
- {
- RetryTimeout = TIMEOUT_DEFAULT;
- Init = false;
- }
- // Инициализировать сбор информации от датчика
- void max44005_Init(void)
- {
- // Начнём процесс
- Init = false;
- R = 0;
- G = 0;
- B = 0;
- Color = 0;
- // Сначала надо дождаться, когда в 0 регистре флаг PWEON сбросится
- i2c_Read(&Device, 0x00, 1, &max44005_WaitStart);
- // Таймер, обновление информации 5 раз в секунду
- timer_AddFunction(5, &max44005_Timer);
- }
- // Цвет
- uint32_t max44005_GetColor(void)
- {
- return Color;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement