REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
functions.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
4
5#include <bus/functions.h>
6
8
9void functions::TriggerFunction::trigger(uint32_t pulse_length_ns) const {
10 bus::address_function(address);
11 bus::activate_address();
12
13 delayNanoseconds(pulse_length_ns);
14 digitalWriteFast(bus::PIN_CSEL, LOW);
15
16 delayNanoseconds(2 * 42);
17
18 delayNanoseconds(pulse_length_ns);
19 digitalWriteFast(bus::PIN_CSEL, HIGH);
20
21 bus::deactivate_address();
22}
23
24functions::DataFunction::DataFunction(bus::addr_t address, uint8_t alt_function_idx,
25 const SPISettings &spiSettings)
27 alt_function_address(bus::replace_function_idx(address, alt_function_idx)),
28 use_csel(alt_function_idx == 0xff),
29 spi_settings(spiSettings) {}
30
32 /*
33 * HACK: Do two-step addressing to circumvent hardware limitations,
34 * see lucidac/hardware/dimm-template-rev1/-/issues/2
35 *
36 * For each block, we have to define an unused (or practically no-op) address that
37 * gets addressed first to assert the correct MSELECT signal, before we address
38 * the actual address. Otherwise, the SPI mode can not be correctly set.
39 * Each block requires different addresses. See the issue for background info.
40 */
41
42 if (!use_csel) {
43 bus::address_function(alt_function_address);
44 bus::activate_address();
45 bus::address_function(address);
46 bus::spi.beginTransaction(spi_settings);
47 delayNanoseconds(200);
48 bus::activate_address();
49 } else {
50 bus::address_function(address);
51 bus::spi.beginTransaction(spi_settings);
52 delayNanoseconds(200);
53 bus::activate_address();
54 }
55 delayNanoseconds(200);
56 digitalWriteFast(bus::PIN_CSEL, LOW);
57 delayNanoseconds(200);
58}
59
61 delayNanoseconds(20);
62 digitalWriteFast(bus::PIN_CSEL, HIGH);
63 delayNanoseconds(200);
64 bus::deactivate_address();
65 bus::spi.endTransaction();
66}
67
68void functions::DataFunction::transfer(const void *mosi_buf, void *miso_buf, size_t count) const {
70 bus::spi.transfer(mosi_buf, miso_buf, count);
72}
73
74uint8_t functions::DataFunction::transfer8(uint8_t data_in) const {
76 auto ret = bus::spi.transfer(data_in);
78 return ret;
79}
80
81uint16_t functions::DataFunction::transfer16(uint16_t data_in) const {
83 auto ret = bus::spi.transfer16(data_in);
85 return ret;
86}
87
90 auto ret = bus::spi.transfer32(data_in);
92 return ret;
93}
94
void end_communication() const
Definition functions.cpp:60
static SPIClass & get_raw_spi()
Definition functions.cpp:95
uint16_t transfer16(uint16_t data_in) const
Definition functions.cpp:81
const SPISettings & spi_settings
Definition functions.h:54
uint8_t transfer8(uint8_t data_in) const
Definition functions.cpp:74
void begin_communication() const
Definition functions.cpp:31
DataFunction(bus::addr_t address, uint8_t alt_function_idx, const SPISettings &spiSettings)
Definition functions.cpp:24
void transfer(const void *mosi_buf, void *miso_buf, size_t count) const
Definition functions.cpp:68
uint32_t transfer32(uint32_t data_in) const
Definition functions.cpp:88
bus::addr_t alt_function_address
Definition functions.h:50
Function(bus::addr_t address)
Definition functions.cpp:7
const bus::addr_t address
Definition functions.h:23
Function(bus::addr_t address)
Definition functions.cpp:7
void trigger(uint32_t pulse_length_ns=200) const
Definition functions.cpp:9
uint32_t
Definition flasher.cpp:195
Definition bus.h:21
SPIClass & spi
Definition bus.cpp:10