1. 程式人生 > >STM32F429 使用 TCS34725 顏色感測器的驅動程式

STM32F429 使用 TCS34725 顏色感測器的驅動程式

用到了 TCS34725 顏色感測器,網上百度一圈都沒有發現驅動程式,自己照著 Arduino 的程式和資料手冊寫了下,記錄一下 (~ ̄▽ ̄)~

第一步,先來看看資料手冊,瞭解到 TCS34725 是 I²C 器件,那就好辦了,根據以前寫的 I²C 驅動改一改就好啦 b( ̄▽ ̄)d(具體程式碼貼在後邊)。

Communication of the TCS3472 data is accomplished over a fast, up to 400 kHz, two-wire I²C serial bus. The industry standard I²C bus facilitates easy, direct connection to microcontrollers and embedded processors.
1
然後幹嘛嘞?當然是找器件地址和暫存器地址啦,繼續翻手冊…(⊙_⊙;)…

找到 TCS34725 地址為 0x29 ,各個暫存器的地址如下:

到這裡,發現這貨不僅器件地址是奇數,而且還有個沒有地址的 COMMAND 暫存器,嗯,隱隱感覺肯定有個坑在這裡 ヾ(。 ̄□ ̄)ツ゜゜゜

接下來就可以著手寫程式啦 (o゜▽゜)o☆

首先定義一下用到的引腳:

/*********************************
*TCS34725相關巨集定義
*********************************/
#define TCS_SDA_PIN_NUM       0
#define TCS_SDA_PIN           GPIO_PIN_0
#define TCS_SDA_GPIO          GPIOI
#define TCS_SCL_PIN           GPIO_PIN_1
#define TCS_SCL_GPIO          GPIOI
1
2
3
4
5
6
7
8
然後把之前寫的 I²C 驅動程式粘過來改一下(^-^)V

//IO方向設定
#define TCS_SDA_DIR_IN()     
{TCS_SDA_GPIO->MODER&=~(3<<(TCS_SDA_PIN_NUM*2));TCS_SDA_GPIO>MODER|=0<<TCS_SDA_PIN_NUM*2;}//輸入模式

#define TCS_SDA_DIR_OUT()    
{TCS_SDA_GPIO->MODER&=~(3<<(TCS_SDA_PIN_NUM*2));TCS_SDA_GPIO>MODER|=1<<TCS_SDA_PIN_NUM*2;}//輸出模式

#define TCS_SDA_READ          HAL_GPIO_ReadPin(TCS_SDA_GPIO, TCS_SDA_PIN)
#define TCS_SDA_SET           HAL_GPIO_WritePin(TCS_SDA_GPIO, TCS_SDA_PIN, GPIO_PIN_SET)
#define TCS_SDA_RESET         HAL_GPIO_WritePin(TCS_SDA_GPIO, TCS_SDA_PIN, GPIO_PIN_RESET)
#define TCS_SCL_SET           HAL_GPIO_WritePin(TCS_SCL_GPIO, TCS_SCL_PIN, GPIO_PIN_SET)
#define TCS_SCL_RESET         HAL_GPIO_WritePin(TCS_SCL_GPIO, TCS_SCL_PIN, GPIO_PIN_RESET)

//TCS34725 I2C初始化
void TCS34725_I2C_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure; 
    __HAL_RCC_GPIOI_CLK_ENABLE();   //使能GPIOI時鐘

    GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;  //推輓輸出
    GPIO_Initure.Pull = GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed = GPIO_SPEED_FAST;     //快速 

    GPIO_Initure.Pin = TCS_SDA_PIN;
    HAL_GPIO_Init(TCS_SDA_GPIO, &GPIO_Initure);
    GPIO_Initure.Pin = TCS_SCL_PIN;
    HAL_GPIO_Init(TCS_SCL_GPIO, &GPIO_Initure);

    TCS_SDA_SET;
    TCS_SCL_SET;

    delay_ms(10);
}

//產生I2C起始訊號
void TCS34725_I2C_Start()
{
    TCS_SDA_DIR_OUT();//sda線輸出
    TCS_SDA_SET;
    TCS_SCL_SET;
    delay_us(4);
    TCS_SDA_RESET;//START:when CLK is high,DATA change form high to low 
    delay_us(4);
    TCS_SCL_RESET;//鉗住I2C匯流排,準備傳送或接收資料 
}

//產生I2C停止訊號
void TCS34725_I2C_Stop()
{
    TCS_SDA_DIR_OUT();//sda線輸出
    TCS_SCL_RESET;
    TCS_SDA_RESET;//STOP:when CLK is high DATA change form low to high
    delay_us(4);
    TCS_SCL_SET;
    TCS_SDA_SET;//傳送I2C匯流排結束訊號
    delay_us(4);                                
}

//等待應答訊號到來
//返回值:1,接收應答失敗
//        0,接收應答成功
uint8_t TCS34725_I2C_Wait_ACK()
{
    uint8_t timeOut = 0;

    TCS_SDA_DIR_IN();//SDA設定為輸入  
    TCS_SDA_SET; delay_us(1);
    TCS_SCL_SET; delay_us(1);
    while(TCS_SDA_READ)
    {
        timeOut++;
        if(timeOut > 250)
        {
            TCS34725_I2C_Stop();
            return 1;
        }
    }
    TCS_SCL_RESET;//時鐘輸出0

    return 0;   

//產生ACK應答
void TCS34725_I2C_ACK()
{
    TCS_SCL_RESET;
    TCS_SDA_DIR_OUT();//sda線輸出
    TCS_SDA_RESET;
    delay_us(2);
    TCS_SCL_SET;
    delay_us(2);
    TCS_SCL_RESET;
}

//不產生ACK應答          
void TCS34725_I2C_NACK()
{
    TCS_SCL_RESET;
    TCS_SDA_DIR_OUT();//sda線輸出
    TCS_SDA_SET;
    delay_us(2);
    TCS_SCL_SET;
    delay_us(2);
    TCS_SCL_RESET;
}   

//I2C傳送一個位元組       
void TCS34725_I2C_Send_Byte(uint8_t byte)
{
    uint8_t i = 0;

    TCS_SDA_DIR_OUT();//sda線輸出
    TCS_SCL_RESET;//拉低時鐘開始資料傳輸
    for(i = 0; i < 8; i++)
    {
        ((byte & 0x80) >> 7) == 0x01 ? TCS_SDA_SET : TCS_SDA_RESET;
        byte <<= 1;
        delay_us(2);
        TCS_SCL_SET;
        delay_us(2);
        TCS_SCL_RESET;
        delay_us(2);
    } 

//讀1個位元組,ack=1時,傳送ACK,ack=0,傳送nACK   
uint8_t TCS34725_I2C_Read_Byte(uint8_t ack)
{
    uint8_t i,receive = 0;

    TCS_SDA_DIR_IN();
    for(i = 0; i < 8; i++)
    {
        TCS_SCL_RESET;
        delay_us(2);
        TCS_SCL_SET;
        receive <<= 1;
        if(TCS_SDA_READ) receive++;
        delay_us(1);
    }
    if (!ack) TCS34725_I2C_NACK();//傳送nACK
    else TCS34725_I2C_ACK(); //傳送ACK 

    return receive;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
OK,以上就是最基本 I²C 的驅動程式,下邊就到了第一個重點啦(~ ̄▽ ̄)~,也就是為毛這貨的器件地址是個奇數,我們知道 I²C 的從機地址是 8 bit ,前 7 bit 是器件地址,最後 1 bit 代表是讀操作(1)還是寫操作(0),所以一般來說器件地址應該是偶數。但是,有的廠家給的地址是低 7 bit (例如這貨),所以就會出現奇數的情況,這樣就需要給它左移 1 bit 。

好了,地址的問題解決了,就可以寫讀操作和寫操作的程式了

/***************************************************************************//**
 * @brief Writes data to a slave device.
 *
 * @param slaveAddress - Adress of the slave device.
 * @param dataBuffer - Pointer to a buffer storing the transmission data.
 * @param bytesNumber - Number of bytes to write.
 * @param stopBit - Stop condition control.
 *                  Example: 0 - A stop condition will not be sent;
 *                           1 - A stop condition will be sent.
*******************************************************************************/
void TCS34725_I2C_Write(uint8_t slaveAddress, 
                        uint8_t* dataBuffer,
                        uint8_t bytesNumber, 
                        uint8_t stopBit)
{
    unsigned char i = 0;

    TCS34725_I2C_Start();
    TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x00);    //傳送從機地址寫命令
    TCS34725_I2C_Wait_ACK();
    for(i = 0; i < bytesNumber; i++)
    {
        TCS34725_I2C_Send_Byte(*(dataBuffer + i));
        TCS34725_I2C_Wait_ACK();
    }
    if(stopBit == 1) TCS34725_I2C_Stop();
}

/***************************************************************************//**
 * @brief Reads data from a slave device.
 *
 * @param slaveAddress - Adress of the slave device.
 * @param dataBuffer - Pointer to a buffer that will store the received data.
 * @param bytesNumber - Number of bytes to read.
 * @param stopBit - Stop condition control.
 *                  Example: 0 - A stop condition will not be sent;
 *                           1 - A stop condition will be sent.
*******************************************************************************/
void TCS34725_I2C_Read(uint8_t slaveAddress, 
                        uint8_t* dataBuffer, 
                        uint8_t bytesNumber, 
                        uint8_t stopBit)
{
    unsigned char i = 0;

    TCS34725_I2C_Start();
    TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x01);    //傳送從機地址讀命令
    TCS34725_I2C_Wait_ACK();
    for(i = 0; i < bytesNumber; i++)
    {
        if(i == bytesNumber - 1)
        {
            *(dataBuffer + i) = TCS34725_I2C_Read_Byte(0);//讀取的最後一個位元組傳送NACK
        }
        else
        {
            *(dataBuffer + i) = TCS34725_I2C_Read_Byte(1);
        }
    }
    if(stopBit == 1) TCS34725_I2C_Stop();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
基本驅動通訊搞定,接下來就給跟它嘮嘮嗑兒了,先定義一下暗號 (๑≧∀≦๑) ,暗號摘自 Arduino 下的驅動程式檔案。

#define TCS34725_ADDRESS          (0x29)

#define TCS34725_COMMAND_BIT      (0x80)

#define TCS34725_ENABLE           (0x00)
#define TCS34725_ENABLE_AIEN      (0x10)    /* RGBC Interrupt Enable */
#define TCS34725_ENABLE_WEN       (0x08)    /* Wait enable - Writing 1 activates the wait timer */
#define TCS34725_ENABLE_AEN       (0x02)    /* RGBC Enable - Writing 1 actives the ADC, 0 disables it */
#define TCS34725_ENABLE_PON       (0x01)    /* Power on - Writing 1 activates the internal oscillator, 0 disables it */
#define TCS34725_ATIME            (0x01)    /* Integration time */
#define TCS34725_WTIME            (0x03)    /* Wait time (if TCS34725_ENABLE_WEN is asserted) */
#define TCS34725_WTIME_2_4MS      (0xFF)    /* WLONG0 = 2.4ms   WLONG1 = 0.029s */
#define TCS34725_WTIME_204MS      (0xAB)    /* WLONG0 = 204ms   WLONG1 = 2.45s  */
#define TCS34725_WTIME_614MS      (0x00)    /* WLONG0 = 614ms   WLONG1 = 7.4s   */
#define TCS34725_AILTL            (0x04)    /* Clear channel lower interrupt threshold */
#define TCS34725_AILTH            (0x05)
#define TCS34725_AIHTL            (0x06)    /* Clear channel upper interrupt threshold */
#define TCS34725_AIHTH            (0x07)
#define TCS34725_PERS             (0x0C)    /* Persistence register - basic SW filtering mechanism for interrupts */
#define TCS34725_PERS_NONE        (0b0000)  /* Every RGBC cycle generates an interrupt                                */
#define TCS34725_PERS_1_CYCLE     (0b0001)  /* 1 clean channel value outside threshold range generates an interrupt   */
#define TCS34725_PERS_2_CYCLE     (0b0010)  /* 2 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_3_CYCLE     (0b0011)  /* 3 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_5_CYCLE     (0b0100)  /* 5 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_10_CYCLE    (0b0101)  /* 10 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_15_CYCLE    (0b0110)  /* 15 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_20_CYCLE    (0b0111)  /* 20 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_25_CYCLE    (0b1000)  /* 25 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_30_CYCLE    (0b1001)  /* 30 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_35_CYCLE    (0b1010)  /* 35 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_40_CYCLE    (0b1011)  /* 40 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_45_CYCLE    (0b1100)  /* 45 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_50_CYCLE    (0b1101)  /* 50 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_55_CYCLE    (0b1110)  /* 55 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_60_CYCLE    (0b1111)  /* 60 clean channel values outside threshold range generates an interrupt */
#define TCS34725_CONFIG           (0x0D)
#define TCS34725_CONFIG_WLONG     (0x02)    /* Choose between short and long (12x) wait times via TCS34725_WTIME */
#define TCS34725_CONTROL          (0x0F)    /* Set the gain level for the sensor */
#define TCS34725_ID               (0x12)    /* 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 */
#define TCS34725_STATUS           (0x13)
#define TCS34725_STATUS_AINT      (0x10)    /* RGBC Clean channel interrupt */
#define TCS34725_STATUS_AVALID    (0x01)    /* Indicates that the RGBC channels have completed an integration cycle */
#define TCS34725_CDATAL           (0x14)    /* Clear channel data */
#define TCS34725_CDATAH           (0x15)
#define TCS34725_RDATAL           (0x16)    /* Red channel data */
#define TCS34725_RDATAH           (0x17)
#define TCS34725_GDATAL           (0x18)    /* Green channel data */
#define TCS34725_GDATAH           (0x19)
#define TCS34725_BDATAL           (0x1A)    /* Blue channel data */
#define TCS34725_BDATAH           (0x1B)

#define TCS34725_INTEGRATIONTIME_2_4MS   0xFF   /**<  2.4ms - 1 cycle    - Max Count: 1024  */
#define TCS34725_INTEGRATIONTIME_24MS    0xF6   /**<  24ms  - 10 cycles  - Max Count: 10240 */
#define TCS34725_INTEGRATIONTIME_50MS    0xEB   /**<  50ms  - 20 cycles  - Max Count: 20480 */
#define TCS34725_INTEGRATIONTIME_101MS   0xD5   /**<  101ms - 42 cycles  - Max Count: 43008 */
#define TCS34725_INTEGRATIONTIME_154MS   0xC0   /**<  154ms - 64 cycles  - Max Count: 65535 */
#define TCS34725_INTEGRATIONTIME_240MS   0x9C   /**<  240ms - 100 cycles - Max Count: 65535 */
#define TCS34725_INTEGRATIONTIME_700MS   0x00   /**<  700ms - 256 cycles - Max Count: 65535 */

#define TCS34725_GAIN_1X                 0x00   /**<  No gain  */
#define TCS34725_GAIN_4X                 0x01   /**<  4x gain  */
#define TCS34725_GAIN_16X                0x02   /**<  16x gain */
#define TCS34725_GAIN_60X                0x03   /**<  60x gain */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
發現其中有個 TCS34725_COMMAND_BIT ,而且發現 Arduino 程式碼中只要傳送暫存器地址的地方都有它 (๑°ㅁ°๑)‼,此處必有蹊蹺!翻開我們的葵花寶典,啊不,是資料手冊,居然發現了這個!

寶典告訴我們,若要定址,此 bit 必須置 1 ,也就是說我們在傳送需要操作的暫存器地址時,必需要將 MSB 置為 1 。怪不得你丫兒沒地址,原來哪都有你 (°ー°〃)

知道了這個就好辦了,我們先封裝一下基本的讀寫操作

/***************************************************************************//**
 * @brief Writes data into TCS34725 registers, starting from the selected
 *        register address pointer.
 *
 * @param subAddr - The selected register address pointer.
 * @param dataBuffer - Pointer to a buffer storing the transmission data.
 * @param bytesNumber - Number of bytes that will be sent.
 *
 * @return None.
*******************************************************************************/
void TCS34725_Write(unsigned char subAddr, unsigned char* dataBuffer, unsigned char bytesNumber)
{
    unsigned char sendBuffer[10] = {0, };
    unsigned char byte = 0;

    sendBuffer[0] = subAddr | TCS34725_COMMAND_BIT;
    for(byte = 1; byte <= bytesNumber; byte++)
    {
        sendBuffer[byte] = dataBuffer[byte - 1];
    }
    TCS34725_I2C_Write(TCS34725_ADDRESS, sendBuffer, bytesNumber + 1, 1);
}

/***************************************************************************//**
 * @brief Reads data from TCS34725 registers, starting from the selected
 *        register address pointer.
 *
 * @param subAddr - The selected register address pointer.
 * @param dataBuffer - Pointer to a buffer that will store the received data.
 * @param bytesNumber - Number of bytes that will be read.
 *
 * @return None.
*******************************************************************************/
void TCS34725_Read(unsigned char subAddr, unsigned char* dataBuffer, unsigned char bytesNumber)
{
    subAddr |= TCS34725_COMMAND_BIT;

    TCS34725_I2C_Write(TCS34725_ADDRESS, (unsigned char*)&subAddr, 1, 0);
    TCS34725_I2C_Read(TCS34725_ADDRESS, dataBuffer, bytesNumber, 1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
接下來就可以根據寶典裡對各個暫存器的說明來程式設計了,我就寫了我用到的幾個功能 (๑・ิ-・ิ๑) ,各位看官有需要可以自己補充。廢話不多說,上程式碼:

TCS34725 的 ID 是 0x44 可以根據這個來判斷是否成功連線。

/***************************************************************************//**
 * @brief TCS34725初始化
 *
 * @return ID - ID暫存器中的值
*******************************************************************************/
unsigned char TCS34725_Init(void)
{
    unsigned char status[1] = {0};

    TCS34725_I2C_Init(); 
    TCS34725_Read(TCS34725_ID, status, 1);
    return status[0];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
兩個個主要設定,設定積分時間(ATIME 暫存器)和增益(CONTROL 暫存器)。這個直接和最後獲取到的資料相關,積分時間越長,增益越大,最後獲得值越大,需要根據實際應用情況進行設定。

積分時間的計算如下文所示:

The actual time can be calculated as follows:

ATIME = 256 − Integration Time / 2.4 ms

Inversely, the time can be calculated from the register value as follows:

Integration Time = 2.4 ms × (256 − ATIME)

For example, if a 100-ms integration time is needed, the device needs to be programmed to:

256 − (100 / 2.4) = 256 − 42 = 214 = 0xD6

Conversely, the programmed value of 0xC0 would correspond to:

(256 − 0xC0) × 2.4 = 64 × 2.4 = 154 ms.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************//**
 * @brief TCS34725設定積分時間
 *
 * @return None
*******************************************************************************/
void TCS34725_SetIntegrationTime(uint8_t time)
{
    unsigned char cmd = time;

    TCS34725_Write(TCS34725_ATIME, &cmd, 1);
}
/***************************************************************************//**
 * @brief TCS34725設定增益
 *
 * @return None
*******************************************************************************/
void TCS34725_SetGain(uint8_t gain)
{
    unsigned char cmd = gain;

    TCS34725_Write(TCS34725_CONTROL, &cmd, 1);
}
/***************************************************************************//**
 * @brief TCS34725設定暫存器
 *
 * @return None
*******************************************************************************/
void TCS34725_Setup(void)
{
    TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_240MS);
    TCS34725_SetGain(TCS34725_GAIN_4X);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
器件上電後預設是在睡覺(Sleep 模式),得踹一腳(Enable)才醒(Idle 模式),然後告訴它是等一會幹活還是馬上滾去幹活 (╯﹏╰)b

我這裡讓它直接幹活去了,注意從 Idle 模式退出後,需要 2.4 ms 的時間來進行 RGBC 初始化,所以給個 3 ms 的延時就可以了。幹完一次活後,如果不讓它回去睡覺(Disable),就會自動繼續幹活,開始一個新的迴圈。

/***************************************************************************//**
 * @brief TCS34725使能
 *
 * @return None
*******************************************************************************/
void TCS34725_Enable(void)
{
    unsigned char cmd = TCS34725_ENABLE_PON;

    TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
    delay_ms(3);
    cmd = TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN;
    TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
}
/***************************************************************************//**
 * @brief TCS34725失能
 *
 * @return None
*******************************************************************************/
void TCS34725_Disable(void)
{
    unsigned char cmd = 0x00;

    TCS34725_Read(TCS34725_ENABLE, &cmd, 1);
    cmd = cmd & ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);
    TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
然後我們就可以拿到轉換資料了,這裡我根據自己的需要對 Arduino 的程式碼做了些修改

/***************************************************************************//**
 * @brief TCS34725獲取單個通道資料
 *
 * @return data - 該通道的轉換值
*******************************************************************************/
uint16_t TCS34725_GetChannelData(unsigned char reg)
{
    unsigned char tmp[2] = {0,0};
    uint16_t data = 0;

    TCS34725_Read(reg, tmp, 2);
    data = ((uint16_t)tmp[1] << 8) | tmp[0];

    return data;
}
/***************************************************************************//**
 * @brief TCS34725獲取各個通道資料
 *
 * @return 1 - 轉換完成,資料可用
 *         0 - 轉換未完成,資料不可用
*******************************************************************************/
uint8_t TCS34725_GetRawData(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c)
{
    unsigned char status[1] = {0};

    status[0] = TCS34725_STATUS_AVALID;

    TCS34725_Read(TCS34725_STATUS, status, 1);

    if(status[0] & TCS34725_STATUS_AVALID)
    {
        *c = TCS34725_GetChannelData(TCS34725_CDATAL);  
        *r = TCS34725_GetChannelData(TCS34725_RDATAL);  
        *g = TCS34725_GetChannelData(TCS34725_GDATAL);  
        *b = TCS34725_GetChannelData(TCS34725_BDATAL);
        return 1;
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
好了,到這裡 TCS34725 的驅動程式就完成啦ヽ(=^・ω・^=)丿
--------------------- 
作者:曉風-楊柳 
來源:CSDN 
原文:https://blog.csdn.net/luo_5458/article/details/77993286 
版權宣告:本文為博主原創文章,轉載請附上博文連結!