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:
parent
3ee8c6f8b9
commit
90ce052d82
3 changed files with 29 additions and 29 deletions
|
|
@ -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
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue