#include #include #include "com/debug.h" #include "utils/timebase.h" static void send_byte(uint8_t b) { MDSP_SPIx->DR = b; while (!(MDSP_SPIx->SR & SPI_SR_TXE)); } static void set_nss(bool nss) { if (nss) { MDSP_NSS_GPIO->BSRR = MDSP_NSS_PIN; } else { MDSP_NSS_GPIO->BRR = MDSP_NSS_PIN; } } static void send_word(MDSP_Command cmd, uint8_t data) { send_byte(cmd); send_byte(data); } /** * @brief Send a command to n-th chained driver * @param idx Driver index (0, 1, 2 ...) * @param cmd command to send * @param data command argument */ void mdsp_send_command(uint8_t idx, MDSP_Command cmd, uint8_t data) { dbg("Set %d: cmd 0x%02x, data 0x%02x", idx, cmd, data); set_nss(false); while (MDSP_SPIx->SR & SPI_SR_BSY); for (uint8_t i = 0; i < MDSP_CHAIN_COUNT - idx - 1; i++) { send_word(CMD_NOOP, 0); } send_word(cmd, data); for (uint8_t i = 0; i < idx; i++) { send_word(CMD_NOOP, 0); } while (MDSP_SPIx->SR & SPI_SR_BSY); set_nss(false); set_nss(true); } void mdsp_send_command_all(MDSP_Command cmd, uint8_t data) { dbg("Set cmd 0x%02x, data 0x%02x ALL", cmd, data); set_nss(false); while (MDSP_SPIx->SR & SPI_SR_BSY); for (uint8_t i = 0; i < MDSP_CHAIN_COUNT; i++) { send_word(cmd, data); } while (MDSP_SPIx->SR & SPI_SR_BSY); set_nss(false); set_nss(true); } void mdsp_set(uint8_t column, uint8_t bits) { if (column >= MDSP_COLUMN_COUNT) return; mdsp_send_command(column >> 3, CMD_DIGIT0 + (column & 0x7), bits); } void mdsp_clear(void) { for (uint8_t i = 0; i < 8; i++) { mdsp_send_command_all(CMD_DIGIT0+i, 0); } }