
3 changed files with 144 additions and 0 deletions
@ -0,0 +1,11 @@
|
||||
export APPLICATION = periph_spi
|
||||
include ../Makefile.tests_common |
||||
|
||||
BOARD_BLACKLIST := chronos mbed_lpc1768 msb-430 msb-430h native qemu-i386 redbee-econotag telosb \
|
||||
wsn430-v1_3b wsn430-v1_4 z1
|
||||
# all listed boards: no periph_conf.h defined,
|
||||
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
|
||||
include $(RIOTBASE)/Makefile.include |
@ -0,0 +1,8 @@
|
||||
Expected result |
||||
=============== |
||||
You should be presented with the RIOT shell, providing you with commands to initialize a board |
||||
as master or slave, and to send and receive data via SPI. |
||||
|
||||
Background |
||||
========== |
||||
Test for the low-level SPI driver. |
@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Freie Universität Berlin |
||||
* |
||||
* This file is subject to the terms and conditions of the GNU Lesser General |
||||
* Public License v2.1. See the file LICENSE in the top level directory for more |
||||
* details. |
||||
*/ |
||||
|
||||
/**
|
||||
* @ingroup tests |
||||
* @{ |
||||
* |
||||
* @file |
||||
* @brief Low-level SPI driver test application |
||||
* |
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de> |
||||
* |
||||
* @} |
||||
*/ |
||||
|
||||
#include <stdio.h> |
||||
|
||||
#include "shell.h" |
||||
#include "periph/spi.h" |
||||
#include "periph/gpio.h" |
||||
|
||||
#define SHELL_BUFSIZE (128U) |
||||
#define SHELL_BUF (128U) |
||||
|
||||
#define DEV SPI_0 |
||||
#define MODE SPI_CONF_FIRST_RISING |
||||
#define CS GPIO_3 |
||||
|
||||
enum { |
||||
READ = 0, |
||||
WRITE, |
||||
INIT |
||||
} rw; |
||||
|
||||
static volatile int state; |
||||
static char* mem = "Hello Master! abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
||||
|
||||
static const shell_command_t shell_commands[] = { |
||||
{ NULL, NULL, NULL } |
||||
}; |
||||
|
||||
void on_cs(void) |
||||
{ |
||||
spi_transmission_begin(DEV, '3'); |
||||
state = 0; |
||||
rw = INIT; |
||||
} |
||||
|
||||
char on_data(char data) |
||||
{ |
||||
puts ("char"); |
||||
switch (rw) { |
||||
case READ: |
||||
return mem[state++]; |
||||
case WRITE: |
||||
mem[state++] = data; |
||||
return 'o'; |
||||
case INIT: |
||||
if (data == ' ') { |
||||
rw = READ; |
||||
return mem[state++]; |
||||
} else if (data & 0x80) { |
||||
rw = WRITE; |
||||
state = (data & 0x7f); |
||||
return 'W'; |
||||
} else { |
||||
rw = READ; |
||||
state = data; |
||||
return mem[state++]; |
||||
} |
||||
} |
||||
return 'e'; |
||||
} |
||||
|
||||
int shell_getchar(void) |
||||
{ |
||||
return (int)getchar(); |
||||
} |
||||
|
||||
void shell_putchar(int c) |
||||
{ |
||||
putchar((char)c); |
||||
} |
||||
|
||||
int main(void) |
||||
{ |
||||
int res; |
||||
shell_t shell; |
||||
|
||||
puts("\nRIOT SPI Slave test"); |
||||
puts("desc...\n"); |
||||
|
||||
/* initialize the CS line */ |
||||
printf("Initializing the CS line"); |
||||
res = gpio_init_int(CS, GPIO_PULLUP, GPIO_FALLING, on_cs); |
||||
if (res >= 0) { |
||||
puts(" ...[ok]"); |
||||
} |
||||
else { |
||||
puts(" ...[failed]"); |
||||
return -1; |
||||
} |
||||
|
||||
/* initialize the SPI master */ |
||||
printf("Initializing the SPI device"); |
||||
res = spi_init_slave(DEV, MODE, on_data); |
||||
if (res >= 0) { |
||||
puts(" ...[ok]"); |
||||
} |
||||
else { |
||||
puts(" ...[failed]"); |
||||
} |
||||
|
||||
/* run the shell */ |
||||
puts("Starting the shell ...[ok]\n"); /* we trust it... */ |
||||
shell_init(&shell, shell_commands, SHELL_BUFSIZE, shell_getchar, shell_putchar); |
||||
shell_run(&shell); |
||||
|
||||
return 0; |
||||
} |
Loading…
Reference in new issue