Skip to content

Commit 052dbce

Browse files
committed
as7343: Fix channel and status order.
The astatus value was being interpreted as FZ, F2 and F1 causing bizarre readings and all other channels to be shifted one place. Additionally the datasheet has been updated to re-order F5, F7 and F8 to F7, F8, F5, so these channels have been re-ordered accordingly. Note: This will turn sensor output from confusing abject nonsense into what looks like pretty reasonable colour data and fixes #989.
1 parent dfc1875 commit 052dbce

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

drivers/as7343/as7343.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace pimoroni {
3030
i2c->set_bits(address, reg::FIFO_MAP, 0, FIFO_MAP_CH5 | FIFO_MAP_CH4 | FIFO_MAP_CH3 | FIFO_MAP_CH2 | FIFO_MAP_CH1 | FIFO_MAP_CH0 | FIFO_MAP_ASTATUS);
3131

3232
// Set the PON bit
33-
i2c->reg_write_uint8(address, reg::ENABLE, ENABLE_WEN | ENABLE_SMUXEN | ENABLE_SP_EN | ENABLE_PON);
33+
i2c->reg_write_uint8(address, reg::ENABLE, ENABLE_WEN | ENABLE_SP_EN | ENABLE_PON);
3434

3535
return true;
3636
}
@@ -135,10 +135,23 @@ namespace pimoroni {
135135
}
136136
}
137137

138+
void AS7343::start_measurement() {
139+
if(running) return;
140+
i2c->set_bits(address, reg::ENABLE, 0, ENABLE_SMUXEN);
141+
running = true;
142+
}
143+
144+
void AS7343::stop_measurement() {
145+
i2c->set_bits(address, reg::ENABLE, 0, ENABLE_SMUXEN);
146+
running = false;
147+
}
148+
138149
void AS7343::read_fifo(uint16_t *buf) {
139150
uint16_t expected_results = read_cycles * 7;
140151
uint16_t result_slot = 0;
141152

153+
start_measurement();
154+
142155
while (i2c->reg_read_uint8(address, reg::FIFO_LVL) < expected_results) {
143156
sleep_ms(1);
144157
}

drivers/as7343/as7343.hpp

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,36 +49,68 @@ namespace pimoroni {
4949
public:
5050
struct reading {
5151
// Cycle 1
52+
uint16_t c1_astatus = 0; // (c1_astatus >> 8) & 0b10001111
53+
// 0b10000000 = saturated
54+
// 0b00001111 = gain lowest nibble
5255
uint16_t FZ = 0; // 428-480 nm
5356
uint16_t FY = 0; // 534-593 nm
5457
uint16_t FXL = 0; // 593-628 nm
5558
uint16_t NIR = 0; // 849-903 nm
5659

5760
uint16_t c1_vis_tl = 0; // Visible top-left
5861
uint16_t c1_vis_br = 0; // Visible bottom-right
59-
uint16_t c1_astatus = 0; // (c1_astatus >> 8) & 0b10001111
60-
// 0b10000000 = saturated
61-
// 0b00001111 = gain lowest nibble
62+
//uint16_t c1_fd = 0; // This is where flicker detect *would* be
6263

6364
// Cycle 2
65+
uint16_t c2_astatus = 0;
6466
uint16_t F2 = 0; // 408-448 nm
6567
uint16_t F3 = 0; // 448-500 mn
6668
uint16_t F4 = 0; // 500-534 nm
6769
uint16_t F6 = 0; // 618-665 nm
6870

6971
uint16_t c2_vis_tl = 0;
7072
uint16_t c2_vis_br = 0;
71-
uint16_t c2_astatus = 0;
73+
//uint16_t c2_fd = 0;
7274

7375
// Cycle 3
76+
uint16_t c3_astatus = 0;
7477
uint16_t F1 = 0; // 396-408 nm
75-
uint16_t F5 = 0; // 531-594 nm
7678
uint16_t F7 = 0; // 685-715 nm
7779
uint16_t F8 = 0; // 715-766 nm
80+
uint16_t F5 = 0; // 531-594 nm
7881

7982
uint16_t c3_vis_tl = 0;
8083
uint16_t c3_vis_br = 0;
81-
uint16_t c3_astatus = 0;
84+
//uint16_t c3_fd = 0;
85+
86+
float gain(uint8_t cycle) {
87+
uint8_t status = 0;
88+
switch(cycle) {
89+
case 1:
90+
status = c1_astatus & 0xf;
91+
break;
92+
case 2:
93+
status = c2_astatus & 0xf;
94+
break;
95+
case 3:
96+
status = c3_astatus & 0xf;
97+
break;
98+
}
99+
return status ? 1 << (status - 1) : 0.5f;
100+
}
101+
102+
bool saturated(uint8_t cycle) {
103+
switch(cycle) {
104+
case 1:
105+
return c1_astatus & 0x80;
106+
case 2:
107+
return c2_astatus & 0x80;
108+
case 3:
109+
return c3_astatus & 0x80;
110+
default:
111+
return false;
112+
}
113+
}
82114
};
83115

84116

@@ -95,6 +127,8 @@ namespace pimoroni {
95127
uint8_t read_cycles = 1;
96128
uint8_t ch_count = (uint8_t)channel_count::SIX_CHANNEL;
97129

130+
bool running = false;
131+
98132

99133
//--------------------------------------------------
100134
// Constructors/Destructor
@@ -120,6 +154,9 @@ namespace pimoroni {
120154

121155
void get_version(uint8_t &auxid, uint8_t &revid, uint8_t &hwid);
122156

157+
void start_measurement();
158+
void stop_measurement();
159+
123160
reading read();
124161

125162
void read_fifo(uint16_t *buf);

examples/breakout_as7343/as7343_demo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ int main() {
6262
reading.F8
6363
);
6464

65+
printf("Gain: C1: %fx C2: %fx C3: %fx\n", reading.gain(1), reading.gain(2), reading.gain(3));
66+
6567
sleep_ms(1000);
6668
}
6769

0 commit comments

Comments
 (0)