Advertisement
teplofizik

max44005.c

Oct 19th, 2013
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. //
  2. // MAX44005. Датчик цвета
  3. //
  4.  
  5. #include "max44005.h"
  6. #include "../drivers.h"
  7.  
  8. #define TIMEOUT_DEFAULT 10
  9.  
  10. // Номер модуля i2c в контроллере и адрес устройства
  11. static TI2CDevice Device = { 0x00, 0x88 }; // Модуль 0, адрес 0x88
  12.  
  13. // Устройство готово и отвечает?
  14. static bool       Init;
  15.  
  16. // Таймаут до следующей попытки
  17. static uint32_t   RetryTimeout;
  18.  
  19. // Цвета
  20. static uint8_t    R, G, B; // R G B
  21. static uint32_t   Color;     // 0RGB
  22.  
  23. static void max44005_Reset(void);
  24. static void max44005_WaitStart(TI2CStatus Status, uint8_t * Data, uint8_t Length);
  25.  
  26. // Прочитаны данные цвета
  27. static void max44005_Update(TI2CStatus Status, uint8_t * Data, uint8_t Length)
  28. {
  29.     if(Status != I2C_OK)
  30.     {
  31.         // Попробуем ещё раз
  32.         max44005_Reset();
  33.         return;
  34.     }
  35.    
  36.     // Данные идут с 6 регистра
  37.     R = Data[1]; //  7: R
  38.     G = Data[3]; //  9: G
  39.     B = Data[5]; // 11: B
  40.    
  41.     Color = (R << 16) | (G << 8) | B;
  42. }
  43.  
  44. // Запрос данных из датчика с частотой 5 Гц
  45. static void max44005_Timer(void)
  46. {
  47.     if(Init)
  48.     {
  49.         // Запрос данных
  50.         i2c_Read(&Device, 0x06, 6, &max44005_Update);
  51.     }
  52.     else
  53.     {
  54.         if(RetryTimeout)
  55.         {
  56.             RetryTimeout--;
  57.            
  58.             // Прочитаем данные о цвете (6-12)
  59.             if(!RetryTimeout) i2c_Read(&Device, 0x00, 1, &max44005_WaitStart);
  60.         }
  61.     }
  62. }
  63.  
  64. // Отчёт о записи
  65. static void max44005_Tx(TI2CStatus Status)
  66. {
  67.     if(Status != I2C_OK)
  68.     {
  69.         // Попробуем ещё раз
  70.         max44005_Reset();
  71.         return;
  72.     }
  73.  
  74.     Init = true;
  75. }
  76.  
  77. // Обработчик данных, ожидание включения
  78. static void max44005_WaitStart(TI2CStatus Status, uint8_t * Data, uint8_t Length)
  79. {
  80.     if(Status == I2C_OK)
  81.     {
  82.         if((*Data & (1 << 2)) == 0) // Сбросился бит PWRON?
  83.         {
  84.             // Сконфигурируем
  85.             uint8_t Buffer[2];
  86.            
  87.             Buffer[0] = 0x20; // 0x01, mode: AMB + RGB + IR
  88.             Buffer[1] = 0x4C; // 0x02, res: 8 bit, temp en
  89.            
  90.             i2c_Write(&Device, 0x01, (uint8_t *)&Buffer[0], sizeof(Buffer), &max44005_Tx);
  91.             return;
  92.         }
  93.     }
  94.    
  95.     // Попробуем ещё раз
  96.     max44005_Reset();
  97. }
  98.  
  99. // Сброс
  100. static void max44005_Reset(void)
  101. {
  102.     RetryTimeout = TIMEOUT_DEFAULT;
  103.    
  104.     Init = false;
  105. }
  106.  
  107. // Инициализировать сбор информации от датчика
  108. void max44005_Init(void)
  109. {
  110.     // Начнём процесс
  111.     Init = false;
  112.    
  113.     R = 0;
  114.     G = 0;
  115.     B = 0;
  116.     Color = 0;
  117.    
  118.     // Сначала надо дождаться, когда в 0 регистре флаг PWEON сбросится
  119.     i2c_Read(&Device, 0x00, 1, &max44005_WaitStart);
  120.    
  121.     // Таймер, обновление информации 5 раз в секунду
  122.     timer_AddFunction(5, &max44005_Timer);
  123. }
  124.  
  125. // Цвет
  126. uint32_t max44005_GetColor(void)
  127. {
  128.     return Color;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement