REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
lucidac.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3//
4// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
5
6#include <lucidac/lucidac.h>
7#include <utils/mac.h>
8
9#include "teensy/lucidac.h"
10#include <block/teensy/icmd.h>
11#include <chips/SR74HCT595.h>
12#include <chips/TMP127Q1.h>
13
14FLASHMEM platform::LUCIDAC::LUCIDAC() : LUCIDAC(new Teensy_LUCIDAC_HAL()) {}
15
17 4'000'000, MSBFIRST, SPI_MODE2 /* chip expects SPI MODE0, but CLK is inverted on the way */};
18
20 : f_acl_prg(bus::address_from_tuple(CARRIER_MADDR, ACL_PRG_FADDR), true),
21 f_acl_upd(bus::address_from_tuple(CARRIER_MADDR, ACL_UPD_FADDR)),
22 f_acl_clr(bus::address_from_tuple(CARRIER_MADDR, ACL_CRL_FADDR)),
23 f_adc_switcher_prg(bus::address_from_tuple(CARRIER_MADDR, ADC_PRG_FADDR),
24 F_ADC_SWITCHER_PRG_SPI_SETTINGS),
25 f_adc_switcher_sync(bus::address_from_tuple(CARRIER_MADDR, ADC_STROBE_FADDR)),
26 f_adc_switcher_sr_reset(bus::address_from_tuple(CARRIER_MADDR, ADC_RESET_SR_FADDR)),
27 f_adc_switcher_matrix_reset(bus::address_from_tuple(CARRIER_MADDR, ADC_RESET_8816_FADDR)),
28 f_temperature(bus::address_from_tuple(CARRIER_MADDR, TEMPERATURE_FADDR)) {}
29
30FLASHMEM bool platform::Teensy_LUCIDAC_HAL::write_acl(std::array<Teensy_LUCIDAC_HAL::ACL, 8> acl) {
31 uint8_t sr = 0;
32 for (size_t idx = 0; idx < acl.size(); idx++) {
33 if (acl[idx] == ACL::EXTERNAL_) {
34 sr |= 1 << idx;
35 }
36 }
37 if (!f_acl_prg.transfer8(sr))
38 return false;
39 f_acl_upd.trigger();
40 return true;
41}
42
44 f_acl_clr.trigger();
45 f_acl_upd.trigger();
46}
47
48FLASHMEM bool platform::Teensy_LUCIDAC_HAL::write_adc_bus_mux(std::array<int8_t, 8> channels) {
49 // Reset previous connections
50 // It's easier to do a full reset then to remember all previous connections
51 reset_adc_bus_mux();
52 delayNanoseconds(420);
53
54 // Write data to chip
55 for (uint8_t output_idx = 0; output_idx < channels.size(); output_idx++) {
56 if (channels[output_idx] >= 0) {
57 auto cmd = decltype(f_adc_switcher_prg)::chip_cmd_word(channels[output_idx], output_idx);
58 if (!f_adc_switcher_prg.transfer8(cmd))
59 return false;
60 f_adc_switcher_sync.trigger();
61 }
62 }
63 return true;
64}
65
66FLASHMEM void platform::Teensy_LUCIDAC_HAL::reset_adc_bus_mux() { f_adc_switcher_matrix_reset.trigger(); }
void reset_adc_bus_mux() override
Definition lucidac.cpp:66
void reset_acl() override
Definition lucidac.cpp:43
static const SPISettings F_ADC_SWITCHER_PRG_SPI_SETTINGS
Definition lucidac.h:16
bool write_acl(std::array< ACL, 8 > acl) override
Write bits to ACL shift register, from I-block input 24 (first element) to 31 (last element)
Definition lucidac.cpp:30
bool write_adc_bus_mux(std::array< int8_t, 8 > channels) override
Write channel selection to ADC bus muxer.
Definition lucidac.cpp:48
Definition bus.h:21