From 1cc4785ddb6db45452c3f0e91ce4e910c98dd5f1 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Thu, 21 Mar 2024 20:55:41 +0100 Subject: [PATCH] refactor SPI handling and introduce SPI CS, forgotten files --- game-ctrl/disabled/led.c | 55 ++++++++++++++++++++++++++++++++++++++++ game-ctrl/disabled/led.h | 15 +++++++++++ game-ctrl/spi.c | 50 ++++++++++++++++++++++++++++++++++++ game-ctrl/spi.h | 16 ++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 game-ctrl/disabled/led.c create mode 100644 game-ctrl/disabled/led.h create mode 100644 game-ctrl/spi.c create mode 100644 game-ctrl/spi.h diff --git a/game-ctrl/disabled/led.c b/game-ctrl/disabled/led.c new file mode 100644 index 0000000..51ecd31 --- /dev/null +++ b/game-ctrl/disabled/led.c @@ -0,0 +1,55 @@ +#include "led.h" +#include +#include "scheduler.h" +#include + + +void ledGreenOn() { + P1OUT |= BIT0; +} + +void ledGreenOff() { + P1OUT &= ~BIT0; +} + +void ledGreenToggle() { + P1OUT ^= BIT0; +} + +void ledBlueOn() { + P1OUT |= BIT1; +} + +void ledBlueOff() { + P1OUT &= ~BIT1; +} + +void ledBlueToggle() { + P1OUT ^= BIT1; +} + +void ledExec(void *args) { + static uint16_t i = 0; + + if (i == 0) { + ledGreenOff(); + i = 1; + } else { + ledGreenOn(); + i = 0; + } +} + +void ledInit() { + // BIT0: green + // BIT1: blue + P1DIR |= BIT0|BIT1; + + ledGreenOff(); + ledBlueOff(); + + +// schAdd(ledExec, NULL, 0, 500); +} + + diff --git a/game-ctrl/disabled/led.h b/game-ctrl/disabled/led.h new file mode 100644 index 0000000..207797e --- /dev/null +++ b/game-ctrl/disabled/led.h @@ -0,0 +1,15 @@ +#ifndef LED_H_ +#define LED_H_ + + +void ledBlueOff(); +void ledBlueOn(); +void ledBlueToggle(); +void ledGreenOff(); +void ledGreenOn(); +void ledGreenToggle(); + +void ledInit(); +void ledExec(); + +#endif /* LED_H_ */ diff --git a/game-ctrl/spi.c b/game-ctrl/spi.c new file mode 100644 index 0000000..2e236ab --- /dev/null +++ b/game-ctrl/spi.c @@ -0,0 +1,50 @@ +#include +#include "spi.h" + +void spiInit() { + // SPI in master mode + UCB0CTL0 = UCMST; + // SPI timing config + UCB0CTL1 = UCSSEL_3; + // Faster than 8 ends up in strange communication errors + // between the both MCUs. + // With 8 the transfer of a complete 110 pixel canvas takes + // about 720us. + // 8 was still too fast and caused problems. + UCB0BR0 = 16; + UCB0BR1 = 0; + + // BIT5: UCB0CLK + // BIT6: UCB0SOMI + // BIT7: UCB0SIMO + P1SEL |= BIT5 | BIT6 | BIT7; + P1SEL2 |= BIT5 | BIT6 | BIT7; + P1DIR |= BIT5 | BIT7; + + // Device Select Lines: 0: Canvas, 1: Display, 2: Sound + P1DIR |= BIT0 | BIT1 | BIT2; + // Disable all of them + P1OUT |= BIT0 | BIT1 | BIT2; + + // enable SPI module + UCB0CTL1 &= ~UCSWRST; +} + +void spiSendBegin(t_SpiDeviceSelector d) { + uint16_t bit = ((uint16_t[]){ BIT0, BIT1, BIT2 })[d]; + P1OUT &= ~bit; +} + +void spiSendEnd(t_SpiDeviceSelector d) { + while (UCB0STAT & UCBUSY); + uint16_t bit = ((uint16_t[]){ BIT0, BIT1, BIT2 })[d]; + P1OUT |= bit; +} + +void spiSendOctet(uint8_t v) { + // wait for TX buffer empty + while (!(UC0IFG & UCB0TXIFG)); + // load octet into TX buffer + UCB0TXBUF = v; +} + diff --git a/game-ctrl/spi.h b/game-ctrl/spi.h new file mode 100644 index 0000000..9a3efaa --- /dev/null +++ b/game-ctrl/spi.h @@ -0,0 +1,16 @@ +#ifndef _SPI_H_ +#define _SPI_H_ + +#include + + +typedef enum { e_SPI_CANVAS, e_SPI_DISPLAY, e_SPI_SOUND } t_SpiDeviceSelector; + +void spiInit(); +void spiSendBegin(t_SpiDeviceSelector d); +void spiSendEnd(t_SpiDeviceSelector d); +void spiSendOctet(uint8_t v); + + + +#endif // _SPI_H_