рд░рдВрдЧ рдФрд░ рдкреНрд░рдХрд╛рд╢ рдорд╛рдиреНрдпрддрд╛ APDS-9960 рдХреЗ рд╕рд╛рде

рдЫрд╡рд┐


рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ рд▓реЗрдЦ Habr.com рдкрд░ рдлреНрд▓реИрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдХрд┐ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде, рдПрдХ рдкреНрд░рдХрд╛рд╢ рд╕рдВрд╡реЗрджрдХ рдкрд░ рд╕реВрдЪрдирд╛ рджреАред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬрд╝ рдкрд╛рдИ рдФрд░ рд╣рд╛рд╕рд┐рд▓ рдХреА - APDS-9960 рд╕реЗрдВрд╕рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд RobotDyn рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдореЙрдбреНрдпреВрд▓, рдЬреЛ рд░реЛрд╢рдиреА рдХреЗ рд╕реНрддрд░ рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рднреА рдЬрд╛рдирддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдЦреЛрдЬрдиреЗ рдФрд░ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдерд╛ред


рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкрд╛рдардХреЛрдВ рдХреЛ рдЙрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдпрд╣ рд╕реЗрдВрд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдВрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд░реЛрд╢рдиреА рдХреЗ рд╕реНрддрд░ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


APDS-9960 рдПрд╡рд╛рдЧреЛ рдХрд╛ рдПрдХ рд╕реЗрдВрд╕рд░ рд╣реИ, рдпрд╣ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдбрд┐рдЬрд┐рдЯрд▓ рд╕реЗрдВрд╕рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрдкрдпреЛрдЧреА рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред
рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдирд┐рдХрдЯрддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╢рд╛рд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдП, рдФрд░ рд╡рд╣ рдпрд╣ рднреА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡реЗрд╢ рдкреНрд░рдХрд╛рд╢ рдХреА рддреАрд╡реНрд░рддрд╛ рдХреЛ рдХреИрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд░рдВрдЧ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА - рдкреБрд░рд╛рдиреА STM32VLDISCOVERY рдФрд░ APDS-9960 рдХреА рдорджрдж рд╕реЗ, рд╣рдо рд░реЛрд╢рдиреА рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ рдФрд░ рд▓рд╛рд▓, рд╣рд░реЗ рдФрд░ рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ рдЕрдкрдиреЗ рд╕рднреА рд░рдВрдЧреЛрдВ рдХреА рд╕рдореГрджреНрдзрд┐ рдореЗрдВ рд░рдВрдЧ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдореИрдВ рдкрд╣рд▓реЗ APDS-9960 рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рд▓рд┐рдЦреВрдБред


APDS-9960 рдХрд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд░реЗрдЦ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЫрд╡рд┐


рдЗрд╢рд╛рд░реЗ рдХреА рдкрд╣рдЪрд╛рди


рдПрдкреАрдбреАрдПрд╕ -9960 рдкрд░ рдХрд┐рд╕ рд╣рд╛рд╡рднрд╛рд╡ рдХреА рдкрд╣рдЪрд╛рди рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдкреНрд░рд▓реЗрдЦрди рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:
рдЗрд╢рд╛рд░реЗ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд╛рд░ рджрд┐рд╢рд╛рддреНрдордХ рдлреЛрдЯреЛрдбрд┐рдПрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдПрд▓рдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдкреНрд░рдХрд╛рд╢ (рдЗрдВрдлреНрд░рд╛рд░реЗрдб рд░реЗрдВрдЬ рдореЗрдВ) рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВред


рдЫрд╡рд┐


рдирд┐рдХрдЯрддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп


рдПрдХ рд╣реА рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд╡рд┐рд╡рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдкрд╣рдЪрд╛рди (рдЕрдиреБрдорд╛рди) рддрдВрддреНрд░ рдЗрд╢рд╛рд░реЗ рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд╕рдорд╛рди рд╕рдЯреАрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рд░рдВрдЧ рдкрд╣рдЪрд╛рди рдФрд░ рдкрд░рд┐рд╡реЗрд╢ рдкреНрд░рдХрд╛рд╢ рд╕реНрддрд░ (рд░рдВрдЧ / ALS)


рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд░реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реЗрдВрд╕рд░ рдЙрдкрдпреБрдХреНрдд рдлреЛрдЯреЛрдбрд╛рдпреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рдВрдЧ / рдкреНрд░рдХрд╛рд╢ рд╕реНрддрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ APDS-9960 рдореЗрдВ рдкрд░рд╛рдмреИрдВрдЧрдиреА рдФрд░ рдЕрд╡рд░рдХреНрдд рд╕реАрдорд╛рдУрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИрдВред
рд╕рд░рд▓реАрдХреГрдд, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдлреЛрдЯреЛрдХреЛрдб рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдПрдбреАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрдлрд░ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдбреЗрдЯрд╛ рдХреЛ i2c рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЫрд╡рд┐


рдКрдкрд░ рдХреА рддрд╕реНрд╡реАрд░ рдХреЗ рдЧреНрд░рд╛рдл рд╕реЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВ, рдХрд▓рд░ рд╕реЗрдВрд╕ (RGBC) рдХреА рд╡рд░реНрдгрдХреНрд░рдореАрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢реАрд░реНрд╖ рдмрд╛рдИрдВ рдУрд░ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЧрдИ рд╣реИред


ATOD рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдорд╛рди рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рдлреЛрдЯреЛрдХреЛрдб рдХрд╛ RGBC рд╕рдВрдХреЗрдд рд╕рдВрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╕реНрдкрд╛рд░реНрдХрдлреБрди рдХреЗ рд▓рд┐рдП (рдЙрдирдХреЗ "apds9960.h" рдореЗрдВ) рдпрд╣ рдорд╛рди рдирд┐рд░рдВрддрд░ DEFAULT_ATIME рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 219 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдЬреЛ 103 рдПрдордПрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред


рд▓рд╛рдн 1x рд╕реЗ 64x рддрдХ рд╕рдорд╛рдпреЛрдЬреНрдп рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг AGAIN рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд┐рд░рдВрддрд░ DEFAULT_AGAIN, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЬреЛ 4-рдЧреБрдирд╛ рд▓рд╛рдн рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред


рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ


рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдХреЗрд╡рд▓ APDS-9960 рдореЗрдВ рдХрд▓рд░ / рдПрдПрд▓рдПрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрдб рд▓рд┐рдЦрд╛ред
рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХреЛрдб рдХреЛ рдХреЙрдореНрдкреИрдХреНрдЯ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА; рд╕рднреА рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред


рдЗрд╕рд▓рд┐рдП, рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ (рдбреНрд░рд╛рдЗрдВрдЧ, рдкрд┐рдирдЖрдЙрдЯ рдФрд░ рд╕рд░реНрдХрд┐рдЯ рдЖрд░реЗрдЦ) рдЙрдкрд▓рдмреНрдз рд╣реИрдВред


рдЫрд╡рд┐


рд╣рдорд╛рд░реЗ APDS-9960 рдореЙрдбреНрдпреВрд▓ рдХреЛ STM32VLDISCOVERY рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ


APDS9960 рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП i2c рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП STM32VLDISCOVERY рдХреЗ рд▓рд┐рдП рд╣рдо рдХреНрд░рдорд╢рдГ SCL рдореЙрдбреНрдпреВрд▓ рдкрд┐рди рдХреЛ PB6 рдкрд┐рди, рдФрд░ SDA рдкрд┐рди рдХреЛ PBB рдкрд┐рди рд╕реЗ рдЬреЛрдбрд╝рдХрд░ I2C1 рдмрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рдЬрд▓реА рдФрд░ рдЖрдо рддрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрдВрдЯ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реА рдлрд╝реЛрдЯреЛ рдореЗрдВ рдпрд╣ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЫрд╡рд┐


рдФрд░ рдЕрдм рдереЛрдбрд╝рд╛ рдХреЛрдбред рдЪреВрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╕рднреА рд╕рдВрдЪрд╛рд░ i2c рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ i2c рдХреЗ рд▓рд┐рдП рд░реАрдб / рд░рд╛рдЗрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред


I2C рдХреА рд╢реБрд░реБрдЖрддред


рдкреНрд░рд╛рд░рдВрдн
void I2C1_init(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO , ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_StructInit(&I2C_InitStructure); I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_InitStructure.I2C_OwnAddress1 = 0x01; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } 

рд░рдЬрд┐рд╕реНрдЯрд░ рдкрдврд╝рдирд╛ред


рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдПрдХ рдореВрд▓реНрдп рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд░реЛрд╣
 uint8_t i2c1_read(uint8_t addr) { uint8_t data; while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, addr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)); data = I2C_ReceiveData(I2C1); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); return data; } 

рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд▓рд┐рдЦрдирд╛


рд░рдЬрд┐рд╕реНрдЯрд░ рдореВрд▓реНрдп рд╕рдорд╛рд░реЛрд╣
 void i2c1_write(uint8_t addr, uint8_t data) { I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, addr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, data); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1, ENABLE); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {}; } 

рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрд╣рд▓реЗ рдареАрдХ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░рдВрдЧ рдкрд╣рдЪрд╛рди рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП:


1) ATIME рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм рдореЙрдбреНрдпреВрд▓ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ ATIME рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ 0xFF рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реЗрдВрд╕рд░ рдХреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ - рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдХрдо рд╣реЛрдЧреАред


 i2c1_write(APDS9960_ATIME, DEFAULT_ATIME); 

2) рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣рдордиреЗ x4 (DEFAULT_AGAIN рдХреЗ рдмрд░рд╛рдмрд░ AGN_4X) рдХреЗ рдмрд░рд╛рдмрд░ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХрдВрдЯреНрд░реЛрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рди рд░рдЬрд┐рд╕реНрдЯрд░ (0x8F) рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝реАрд▓реНрдб AGAIN (ALS рдФрд░ рдХрд▓рд░ рдЧреЗрди рдХрдВрдЯреНрд░реЛрд▓) рд╕реЗрдЯ рдХрд┐рдпрд╛ред


 i2c1_write(APDS9960_CONTROL, DEFAULT_AGAIN); 

3) рд╕рдХреНрд╖рдо рд░рдЬрд┐рд╕реНрдЯрд░ рд░рдЬрд┐рд╕реНрдЯрд░ (0x80) рдХреЗ рдПрдИрдПрди рдмрд┐рдЯ рд╕реЗрдЯ рдХрд░рдХреЗ ALS рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
4) рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ PON рдмрд┐рдЯ рд╕реЗрдЯ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ


рдЗрд╕ рддрд░рд╣:


 i2c1_write(APDS9960_ENABLE, (APDS9960_PON | APDS9960_AEN)); 

рд╡рд╣ рдкреВрд░рд╛ рд╕реЗрдЯрдЕрдк рд╣реИред рд╣рдорд╛рд░рд╛ рд╕реЗрдВрд╕рд░ рдХрд╛рдо рдФрд░ рд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рд╕рднреА рд░рдВрдЧреЛрдВ рдХреЛ рдорд╛рдкрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рд░реЛрд╢рдиреА рдХреЗ рд╕реНрддрд░ рдХреЛ рдорд╛рдкреЗрдВ


 Colour_tmpL = i2c1_read(APDS9960_CDATAL); Colour_tmpH = i2c1_read(APDS9960_CDATAH); Colour_Clear = (Colour_tmpH << 8) + Colour_tmpL; 

рдФрд░ рдЕрдм рд╣рдорд╛рд░рд╛ рд╡реНрдпрд╡рд╕рд╛рдп рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдлреВрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рд╣реИ


RGB рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
 //_________________________________________________________________________ // RED color Recognize: Colour_tmpL = i2c1_read(APDS9960_RDATAL); Colour_tmpH = i2c1_read(APDS9960_RDATAH); Colour_Red = (Colour_tmpH << 8) + Colour_tmpL; //_________________________________________________________________________ // GREEN color Recognize: Colour_tmpL = i2c1_read(APDS9960_GDATAL); Colour_tmpH = i2c1_read(APDS9960_GDATAH); Colour_Green = (Colour_tmpH << 8) + Colour_tmpL; //_________________________________________________________________________ // BLUE color Recognize: Colour_tmpL = i2c1_read(APDS9960_BDATAL); Colour_tmpH = i2c1_read(APDS9960_BDATAH); Colour_Blue = (Colour_tmpH << 8) + Colour_tmpL; 

рдФрд░ рдЕрдм рдкреВрд░рд╛ рдХреЛрдб:


main.c
 #include "stm32f10x.h" #define APDS9960_I2C_ADDR 0x39 #define APDS9960_ATIME 0x81 #define APDS9960_CONTROL 0x8F #define APDS9960_ENABLE 0x80 #define APDS9960_CDATAL 0x94 #define APDS9960_CDATAH 0x95 #define APDS9960_RDATAL 0x96 #define APDS9960_RDATAH 0x97 #define APDS9960_GDATAL 0x98 #define APDS9960_GDATAH 0x99 #define APDS9960_BDATAL 0x9A #define APDS9960_BDATAH 0x9B /* Bit fields */ #define APDS9960_PON 0x01 #define APDS9960_AEN 0x02 #define APDS9960_PEN 0x04 #define APDS9960_WEN 0x08 #define APSD9960_AIEN 0x10 #define APDS9960_PIEN 0x20 #define APDS9960_GEN 0x40 #define APDS9960_GVALID 0x01 /* ALS Gain (AGAIN) values */ #define AGAIN_1X 0 #define AGAIN_4X 1 #define AGAIN_16X 2 #define AGAIN_64X 3 #define DEFAULT_ATIME 219 // 103ms #define DEFAULT_AGAIN AGAIN_4X uint8_t Colour_tmpL = 0; uint8_t Colour_tmpH = 0; uint16_t Colour_Clear = 0; uint16_t Colour_Red = 0; uint16_t Colour_Green = 0; uint16_t Colour_Blue = 0; //----------------------------------------------------------------------- void I2C1_init(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO , ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_StructInit(&I2C_InitStructure); I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_InitStructure.I2C_OwnAddress1 = 0x01; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } //----------------------------------------------------------------------- uint8_t i2c1_read(uint8_t addr) { uint8_t data; while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, addr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)); data = I2C_ReceiveData(I2C1); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); return data; } //----------------------------------------------------------------------- void i2c1_write(uint8_t addr, uint8_t data) { I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, addr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, data); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1, ENABLE); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {}; } //----------------------------------------------------------------------- int main() { I2C1_init(); i2c1_write(APDS9960_ATIME, DEFAULT_ATIME); i2c1_write(APDS9960_CONTROL, DEFAULT_AGAIN); i2c1_write(APDS9960_ENABLE, (APDS9960_PON | APDS9960_AEN)); while (1) { Colour_Clear = 0; Colour_Red = 0; Colour_Green = 0; Colour_Blue = 0; //_________________________________________________________________________ // Ambient Light Recognize: Colour_tmpL = i2c1_read(APDS9960_CDATAL); Colour_tmpH = i2c1_read(APDS9960_CDATAH); Colour_Clear = (Colour_tmpH << 8) + Colour_tmpL; //_________________________________________________________________________ // RED color Recognize: Colour_tmpL = i2c1_read(APDS9960_RDATAL); Colour_tmpH = i2c1_read(APDS9960_RDATAH); Colour_Red = (Colour_tmpH << 8) + Colour_tmpL; //_________________________________________________________________________ // GREEN color Recognize: Colour_tmpL = i2c1_read(APDS9960_GDATAL); Colour_tmpH = i2c1_read(APDS9960_GDATAH); Colour_Green = (Colour_tmpH << 8) + Colour_tmpL; //_________________________________________________________________________ // BLUE color Recognize: Colour_tmpL = i2c1_read(APDS9960_BDATAL); Colour_tmpH = i2c1_read(APDS9960_BDATAH); Colour_Blue = (Colour_tmpH << 8) + Colour_tmpL; } } 

рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╣реЗрдбрд░ рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рд╣реИред
рд▓рдЧрд╛рддрд╛рд░, рд╡реИрд╕реЗ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрдкрд╛рд░реНрдХрдлреБрди рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рднрдВрдбрд╛рд░ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣рд╛рдБ рд╕реЗ ред


рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ APDS-9960 рдкрд╕рдВрдж рдерд╛ - рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд, рдпрд╣ рд╢реЛрдз рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдерд╛, рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧреАред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi423847/


All Articles