Skip to content

Commit

Permalink
S88: added clock frequency setting: 1 .. 250 kHz
Browse files Browse the repository at this point in the history
  • Loading branch information
reinder committed Aug 28, 2024
1 parent aa0bcee commit 47148f1
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 21 deletions.
28 changes: 12 additions & 16 deletions src/s88/s88.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@
namespace S88 {

static bool g_enabled = false;
static uint g_offset;
static pio_sm_config g_config;
static uint16_t g_inputCount;
static absolute_time_t g_nextScan;
static uint g_fifoRead;
static uint g_inputIndex;

#define CLOCK_FREQUENCY 10000

void init()
{
//gpio_init(S88_PIN_POWER);
Expand All @@ -52,35 +52,31 @@ void init()

pio_sm_set_consecutive_pindirs(S88_PIO, S88_SM, S88_PIN_CLOCK, 3, true);

uint offset = pio_add_program(S88_PIO, &s88_program);
pio_sm_config c = s88_program_get_default_config(offset);

sm_config_set_set_pins(&c, S88_PIN_CLOCK, 3);
sm_config_set_sideset_pins(&c, S88_PIN_CLOCK);
sm_config_set_in_pins(&c, S88_PIN_DATA);

sm_config_set_out_shift(&c, true, true, 32); // right shift, autopush
g_offset = pio_add_program(S88_PIO, &s88_program);
g_config = s88_program_get_default_config(g_offset);

float div = (float)clock_get_hz(clk_sys) / (4 * CLOCK_FREQUENCY);
sm_config_set_clkdiv(&c, div);
sm_config_set_set_pins(&g_config, S88_PIN_CLOCK, 3);
sm_config_set_sideset_pins(&g_config, S88_PIN_CLOCK);
sm_config_set_in_pins(&g_config, S88_PIN_DATA);

pio_sm_init(S88_PIO, S88_SM, offset, &c);
sm_config_set_out_shift(&g_config, true, true, 32); // right shift, autopush
}

bool enabled()
{
return g_enabled;
}

void enable(uint8_t moduleCount)
void enable(uint8_t moduleCount, uint8_t clockFrequency)
{
//gpio_put(S88_PIN_POWER, 1);

pio_sm_set_enabled(S88_PIO, S88_SM, false);

pio_sm_clear_fifos(S88_PIO, S88_SM);
const float div = (float)clock_get_hz(clk_sys) / (4 * clockFrequency * 1000);
sm_config_set_clkdiv(&g_config, div);

pio_sm_restart(S88_PIO, S88_SM);
pio_sm_init(S88_PIO, S88_SM, g_offset, &g_config);

pio_sm_set_enabled(S88_PIO, S88_SM, true);

Expand Down
4 changes: 3 additions & 1 deletion src/s88/s88.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ namespace S88 {

constexpr uint8_t moduleCountMin = 1;
constexpr uint8_t moduleCountMax = 16;
constexpr uint8_t clockFrequencyMin = 1; // kHz
constexpr uint8_t clockFrequencyMax = 250; // kHz

void init();
bool enabled();
void enable(uint8_t moduleCount);
void enable(uint8_t moduleCount, uint8_t clockFrequency);
void disable();
void process();

Expand Down
6 changes: 4 additions & 2 deletions src/traintasticcs/messages.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,12 +181,14 @@ struct InitXpressNetOk : MessageNoData
struct InitS88 : Message
{
uint8_t moduleCount;
uint8_t clockFrequency;
Checksum checksum;

constexpr InitS88(uint8_t moduleCount_)
constexpr InitS88(uint8_t moduleCount_, uint8_t clockFrequency_)
: Message(Command::InitS88, sizeof(InitS88) - sizeof(Message) - sizeof(checksum))
, moduleCount{moduleCount_}
, checksum{static_cast<Checksum>(static_cast<uint8_t>(command) ^ length ^ moduleCount)}
, clockFrequency{clockFrequency_}
, checksum{static_cast<Checksum>(static_cast<uint8_t>(command) ^ length ^ moduleCount ^ clockFrequency)}
{
}
};
Expand Down
6 changes: 4 additions & 2 deletions src/traintasticcs/traintasticcs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,17 @@ static void received()
const auto& initS88 = static_cast<const InitS88&>(message);
if(message.size() != sizeof(InitS88) ||
initS88.moduleCount < S88::moduleCountMin ||
initS88.moduleCount > S88::moduleCountMax)
initS88.moduleCount > S88::moduleCountMax ||
initS88.clockFrequency < S88::clockFrequencyMin ||
initS88.clockFrequency > S88::clockFrequencyMax)
{
return send(Error(message.command, ErrorCode::InvalidCommandPayload));
}
if(S88::enabled())
{
return send(Error(message.command, ErrorCode::AlreadyInitialized));
}
S88::enable(initS88.moduleCount);
S88::enable(initS88.moduleCount, initS88.clockFrequency);
return send(InitS88Ok());
}
}
Expand Down

0 comments on commit 47148f1

Please sign in to comment.