spi-master: functional spi slave on l1 host

Doesn't do much other than reply with an increasing pattern, but at
least the basic wiring is now in place.
This commit is contained in:
Karl Palsson 2018-04-17 22:53:25 +00:00
parent 3ee8c6f8b9
commit 90ce052d82
3 changed files with 29 additions and 29 deletions

View file

@ -1,5 +1,5 @@
BOARD = stm32l1-generic BOARD = host-stm32l1-generic
PROJECT = spi-master-$(BOARD) PROJECT = spi-slave-$(BOARD)
BUILD_DIR = bin-$(BOARD) BUILD_DIR = bin-$(BOARD)
SHARED_DIR = ../../shared SHARED_DIR = ../../shared

View file

@ -52,7 +52,7 @@ static void test_init(void)
{ {
/* Setup SPI parameters. */ /* Setup SPI parameters. */
rcc_periph_clock_enable(hw_details.periph_rcc); rcc_periph_clock_enable(hw_details.periph_rcc);
spi_init_master(hw_details.periph, SPI_CR1_BAUDRATE_FPCLK_DIV_64, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, spi_init_master(hw_details.periph, SPI_CR1_BAUDRATE_FPCLK_DIV_32, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE,
SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST); SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
/* Ignore the stupid NSS pin. */ /* Ignore the stupid NSS pin. */
spi_enable_software_slave_management(hw_details.periph); spi_enable_software_slave_management(hw_details.periph);
@ -64,12 +64,13 @@ static void test_init(void)
static void test_task(void) { static void test_task(void) {
static int i = 0; static int i = 0;
printf("DUT iter %d\n", i++);
gpio_set(hw_details.trigger_port, hw_details.trigger_pin); gpio_set(hw_details.trigger_port, hw_details.trigger_pin);
printf("Test iteration %d\n", i++); gpio_clear(LED_DISCO_GREEN_PORT, LED_DISCO_GREEN_PIN);
spi_xfer(hw_details.periph, 0xaa); spi_xfer(hw_details.periph, 0xaa);
spi_xfer(hw_details.periph, 0x42); spi_xfer(hw_details.periph, 0x42);
spi_xfer(hw_details.periph, 0x69); spi_xfer(hw_details.periph, 0x69);
gpio_set(LED_DISCO_GREEN_PORT, LED_DISCO_GREEN_PIN);
gpio_clear(hw_details.trigger_port, hw_details.trigger_pin); gpio_clear(hw_details.trigger_port, hw_details.trigger_pin);
} }

View file

@ -14,10 +14,6 @@
#include "hw.h" #include "hw.h"
#define LED_DISCO_GREEN_PORT GPIOB
#define LED_DISCO_GREEN_PIN GPIO8
struct hw_detail hw_details = { struct hw_detail hw_details = {
.periph = SPI2, .periph = SPI2,
.periph_rcc = RCC_SPI2, .periph_rcc = RCC_SPI2,
@ -53,26 +49,37 @@ static void test_init(void)
{ {
/* Setup SPI parameters. */ /* Setup SPI parameters. */
rcc_periph_clock_enable(hw_details.periph_rcc); rcc_periph_clock_enable(hw_details.periph_rcc);
spi_init_master(hw_details.periph, SPI_CR1_BAUDRATE_FPCLK_DIV_16, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, /* mostly, this is just "write 0 to cr1" */
SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST); spi_set_slave_mode(hw_details.periph);
/* Ignore the stupid NSS pin. */ spi_send_msb_first(hw_details.periph);
spi_enable_software_slave_management(hw_details.periph); spi_set_dff_8bit(hw_details.periph);
//spi_enable_ss_output(MRF_SPI); spi_set_clock_phase_0(hw_details.periph);
spi_set_nss_high(hw_details.periph); spi_set_clock_polarity_0(hw_details.periph);
spi_set_frf_motorola(hw_details.periph);
/* we're a spi slave, use a CS pin */
spi_disable_software_slave_management(hw_details.periph);
SPI_CR2(hw_details.periph) &= ~SPI_CR2_SSOE;
/* Finally enable the SPI. */ /* Finally enable the SPI. */
spi_enable(hw_details.periph); spi_enable(hw_details.periph);
} }
static void test_task(void) { static void test_task(void) {
static int i = 0; static int i = 0;
printf("Test iteration %d\n", i++); uint32_t spi = hw_details.periph;
gpio_set(hw_details.trigger_port, hw_details.trigger_pin); if (SPI_SR(spi) & SPI_SR_TXE) {
spi_xfer(hw_details.periph, 0xaa); /* ready to load next data in */
spi_xfer(hw_details.periph, 0x42); SPI_DR(spi) = i++;
spi_xfer(hw_details.periph, 0x69); }
gpio_clear(hw_details.trigger_port, hw_details.trigger_pin);
if (SPI_SR(spi) & SPI_SR_RXNE) {
uint8_t data = SPI_DR(spi);
trace_send8(2, data);
}
} }
static void setup(void) static void setup(void)
{ {
printf("hi guys!\n"); printf("hi guys!\n");
@ -98,18 +105,10 @@ int main(void)
}; };
int i, j; int i, j;
rcc_clock_setup_pll(&myclock); rcc_clock_setup_pll(&myclock);
/* green led for ticking */
rcc_periph_clock_enable(RCC_GPIOB);
gpio_mode_setup(LED_DISCO_GREEN_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,
LED_DISCO_GREEN_PIN);
setup(); setup();
while (1) { while (1) {
test_task(); test_task();
gpio_toggle(LED_DISCO_GREEN_PORT, LED_DISCO_GREEN_PIN);
for (i = 0; i < 0x800000; i++) { /* Wait a bit. */
__asm__("NOP");
}
} }
return 0; return 0;
} }