Enable GPIO and SPI

* Fix GPIO/SPI code
* Use buffers in SPI read/write
* Add pin qstrs OMV2
* remove old led files
* Update LCD user examples
This commit is contained in:
iabdalkader 2014-08-10 19:39:19 +02:00
parent 6f7de049b1
commit 12d062d1bc
17 changed files with 299 additions and 294 deletions

View File

@ -143,7 +143,6 @@ OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/, \
ov9650.o \
ov2640.o \
sensor.o \
led.o \
rng.o \
stm32f407_hal_msp.o \
)
@ -184,6 +183,8 @@ OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/py/, \
py_wlan.o \
py_socket.o \
py_select.o \
py_gpio.o \
py_spi.o \
)
ifeq ($(TARGET), OPENMV1)

@ -1 +1 @@
Subproject commit 3dd822a4af2d07aa020b73dbb2fd770748771305
Subproject commit fa1eeeb2d51474016272963083e3b58f6271d59e

View File

@ -9,7 +9,6 @@ SRCS += $(addprefix , \
ov9650.c \
ov2640.c \
sensor.c \
led.c \
rng.c \
stm32f407_hal_msp.c \
)
@ -50,6 +49,8 @@ SRCS += $(addprefix py/, \
py_wlan.c \
py_socket.c \
py_select.c \
py_gpio.c \
py_spi.c \
)
OBJS = $(addprefix $(BUILD)/, $(SRCS:.c=.o))

View File

@ -1,31 +0,0 @@
#include <stm32f4xx_hal.h>
#include "pincfg.h"
#include "led.h"
void led_init(enum led_id id)
{
led_state(id, 1);
}
void led_toggle(enum led_id id)
{
if (id >= 0 && id < LED_MAX) {
/* Invert LED state */
HAL_GPIO_TogglePin(led_pins[id].port, led_pins[id].pin);
}
}
void led_state(enum led_id id, int state)
{
if (id >= 0 && id < LED_MAX) {
#ifdef OPENMV2
if (id == LED_IR) { //IR LED is inverted
state = !state;
}
#endif
HAL_GPIO_WritePin(led_pins[id].port,
led_pins[id].pin, (state)? GPIO_PIN_RESET:GPIO_PIN_SET);
}
}

View File

@ -1,16 +0,0 @@
#ifndef __LED_H__
#define __LED_H__
enum led_id {
LED_RED=0,
LED_GREEN,
LED_BLUE,
#ifdef OPENMV2
LED_IR,
#endif
LED_MAX,
};
void led_init(enum led_id color);
void led_toggle(enum led_id color);
void led_state(enum led_id color, int state);
#endif //__LED_H__

View File

@ -29,10 +29,10 @@
#include "ff.h"
#include "mdefs.h"
#include "led.h"
#include "rng.h"
#include "sensor.h"
#include "usbdbg.h"
#include "sdram.h"
#include "py_led.h"
#include "py_time.h"
@ -42,6 +42,8 @@
#include "py_wlan.h"
#include "py_socket.h"
#include "py_select.h"
#include "py_gpio.h"
#include "py_spi.h"
int errno;
static FATFS fatfs0;
@ -117,6 +119,12 @@ STATIC mp_obj_t py_vcp_is_connected(void ) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_vcp_is_connected_obj, py_vcp_is_connected);
extern uint32_t SystemCoreClock;
STATIC mp_obj_t py_cpu_freq(void ) {
return mp_obj_new_int(SystemCoreClock);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_cpu_freq_obj, py_cpu_freq);
static const char fresh_main_py[] =
"# main.py -- put your code here!\n"
"import led, time\n"
@ -159,10 +167,11 @@ static const module_t exported_modules[] ={
{MP_QSTR_sensor, py_sensor_init},
{MP_QSTR_led, py_led_init},
{MP_QSTR_time, py_time_init},
{MP_QSTR_wlan, py_wlan_init},
{MP_QSTR_socket, py_socket_init},
{MP_QSTR_select, py_select_init},
// {MP_QSTR_spi, py_spi_init},
// {MP_QSTR_wlan, py_wlan_init},
// {MP_QSTR_socket, py_socket_init},
// {MP_QSTR_select, py_select_init},
{MP_QSTR_spi, py_spi_init},
{MP_QSTR_gpio, py_gpio_init},
{0, NULL}
};
@ -174,7 +183,16 @@ int main(void) {
- Global MSP (MCU Support Package) initialization
*/
HAL_Init();
#ifdef OPENMV2
if (sdram_init() == false) {
__fatal_error("could not init sdram");
}
#if 0 //SDRAM test
if (sdram_test() == false) {
__fatal_error("sdram test1 failed");
}
#endif
#endif
// basic sub-system init
pendsv_init();
timer_tim3_init();
@ -332,6 +350,7 @@ soft_reset:
mp_store_global(qstr_from_str("vcp_is_connected"), mp_make_function_n(0, py_vcp_is_connected));
mp_store_global(qstr_from_str("Image"), mp_make_function_n(1, py_image_load_image));
mp_store_global(qstr_from_str("HaarCascade"), mp_make_function_n(1, py_image_load_cascade));
mp_store_global(qstr_from_str("cpu_freq"), mp_make_function_n(0, py_cpu_freq));
// mp_store_global(qstr_from_str("info"), mp_make_function_n(0, py_info));
// mp_store_global(qstr_from_str("gc_collect"), mp_make_function_n(0, py_gc_collect));

View File

@ -8,8 +8,8 @@ typedef struct {
} gpio_t;
extern const gpio_t led_pins[];
extern const gpio_t gpio_pins[];
#ifdef OPENMV1
/* LEDs */
#define LED_PORT (GPIOD)
#define LED_RED_PIN (GPIO_PIN_4)
@ -18,6 +18,25 @@ extern const gpio_t led_pins[];
#define LED_ON(gpio) (gpio.port->BSRRH = gpio.pin)
#define LED_OFF(gpio) (gpio.port->BSRRL = gpio.pin)
/* GPIOs */
typedef enum {
GPIO_PA8,
GPIO_PA15,
GPIO_PC9,
GPIO_PC10,
GPIO_PC11,
GPIO_PC12,
GPIO_ID_MAX,
} gpio_id_t;
#define GPIO_PINS_QSTR\
{ MP_OBJ_NEW_QSTR(MP_QSTR_P1), MP_OBJ_NEW_SMALL_INT(GPIO_PC10)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_P2), MP_OBJ_NEW_SMALL_INT(GPIO_PC11)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_P3), MP_OBJ_NEW_SMALL_INT(GPIO_PC12)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_P4), MP_OBJ_NEW_SMALL_INT(GPIO_PA15)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_P5), MP_OBJ_NEW_SMALL_INT(GPIO_PC9 )},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_P6), MP_OBJ_NEW_SMALL_INT(GPIO_PA8 )}
/* SCCB/I2C */
#define SCCB_I2C (I2C1)
#define SCCB_AF (GPIO_AF4_I2C1)
@ -27,6 +46,21 @@ extern const gpio_t led_pins[];
#define SCCB_SCL_PIN (GPIO_PIN_8)
#define SCCB_SDA_PIN (GPIO_PIN_9)
/* SPI */
//TODO fix wlan init first
//#define USR_SPI (SPI3)
//#define USR_SPI_AF (GPIO_AF6_SPI3)
//#define USR_SCLK_PIN (GPIO_PIN_10)
//#define USR_MISO_PIN (GPIO_PIN_11)
//#define USR_MOSI_PIN (GPIO_PIN_12)
//
//#define USR_SCLK_PORT (GPIOC)
//#define USR_MISO_PORT (GPIOC)
//#define USR_MOSI_PORT (GPIOC)
//
//#define USR_SPI_CLK_ENABLE() __SPI3_CLK_ENABLE()
//#define USR_SPI_CLK_DISABLE() __SPI3_CLK_DISABLE()
/* DCMI */
#define DCMI_TIM (TIM1)
#define DCMI_TIM_PIN (GPIO_PIN_9)
@ -134,6 +168,37 @@ extern const gpio_t led_pins[];
#define LED_ON(gpio) (gpio.port->BSRRH = gpio.pin)
#define LED_OFF(gpio) (gpio.port->BSRRL = gpio.pin)
/* GPIOs */
typedef enum {
GPIO_PA2,
GPIO_PA3,
GPIO_PC4,
GPIO_PC5,
GPIO_PD8,
GPIO_PD9,
GPIO_PD12,
GPIO_PD13,
GPIO_PE2,
GPIO_PE3,
GPIO_PE5,
GPIO_PE6,
GPIO_ID_MAX,
} gpio_id_t;
#define GPIO_PINS_QSTR\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA1), MP_OBJ_NEW_SMALL_INT(GPIO_PC4)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA2), MP_OBJ_NEW_SMALL_INT(GPIO_PC5)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA3), MP_OBJ_NEW_SMALL_INT(GPIO_PA3)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA4), MP_OBJ_NEW_SMALL_INT(GPIO_PA2)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA5), MP_OBJ_NEW_SMALL_INT(GPIO_PE6)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA6), MP_OBJ_NEW_SMALL_INT(GPIO_PE5)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA7), MP_OBJ_NEW_SMALL_INT(GPIO_PE3)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA8), MP_OBJ_NEW_SMALL_INT(GPIO_PE2)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB1), MP_OBJ_NEW_SMALL_INT(GPIO_PD8)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB2), MP_OBJ_NEW_SMALL_INT(GPIO_PD9)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB3), MP_OBJ_NEW_SMALL_INT(GPIO_PD12)},\
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB4), MP_OBJ_NEW_SMALL_INT(GPIO_PD13)}
/* SCCB/I2C */
#define SCCB_I2C (I2C2)
#define SCCB_AF (GPIO_AF4_I2C2)
@ -143,6 +208,20 @@ extern const gpio_t led_pins[];
#define SCCB_SCL_PIN (GPIO_PIN_10)
#define SCCB_SDA_PIN (GPIO_PIN_11)
/* SPI */
#define USR_SPI (SPI4)
#define USR_SPI_AF (GPIO_AF5_SPI4)
#define USR_SCLK_PIN (GPIO_PIN_2)
#define USR_MISO_PIN (GPIO_PIN_5)
#define USR_MOSI_PIN (GPIO_PIN_6)
#define USR_SCLK_PORT (GPIOE)
#define USR_MISO_PORT (GPIOE)
#define USR_MOSI_PORT (GPIOE)
#define USR_SPI_CLK_ENABLE() __SPI4_CLK_ENABLE()
#define USR_SPI_CLK_DISABLE() __SPI4_CLK_DISABLE()
/* DCMI */
#define DCMI_TIM (TIM1)
#define DCMI_TIM_PIN (GPIO_PIN_8)
@ -190,27 +269,6 @@ extern const gpio_t led_pins[];
#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET)
#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET)
/* uSD */
#define SD_SPI (SPI2)
#define SD_SPI_AF (GPIO_AF5_SPI2)
#define SD_CD_PIN (GPIO_PIN_1)
#define SD_CS_PIN (GPIO_PIN_1)
#define SD_SCLK_PIN (GPIO_PIN_13)
#define SD_MISO_PIN (GPIO_PIN_2)
#define SD_MOSI_PIN (GPIO_PIN_3)
#define SD_CD_PORT (GPIOC)
#define SD_CS_PORT (GPIOC)
#define SD_SCLK_PORT (GPIOB)
#define SD_MISO_PORT (GPIOC)
#define SD_MOSI_PORT (GPIOC)
#define SD_SPI_CLK_ENABLE() __SPI2_CLK_ENABLE()
#define SD_SPI_CLK_DISABLE() __SPI2_CLK_DISABLE()
#define SD_SELECT() HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_RESET)
#define SD_DESELECT() HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_SET)
/* Wlan */
#define WLAN_SPI SPI3
#define WLAN_SPI_AF (GPIO_AF6_SPI3)
@ -240,5 +298,8 @@ extern const gpio_t led_pins[];
#define __WLAN_DISABLE() HAL_GPIO_WritePin(WLAN_EN_PORT, WLAN_EN_PIN, GPIO_PIN_RESET)
#define SD_CD_PIN (GPIO_PIN_4)
#define SD_CD_PORT (GPIOD)
#endif //OPENMV1
#endif //__PINCFG_H__

View File

@ -1,35 +1,7 @@
#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_spi.h>
#include <stm32f4xx_gpio.h>
#include <libmp.h>
#include "py_assert.h"
#include "mp.h"
#include "pincfg.h"
#include "py_gpio.h"
typedef enum {
GPIO_PC9,
GPIO_PC10,
GPIO_PC11,
GPIO_PC12,
GPIO_PA8,
GPIO_PA15,
GPIO_ID_MAX,
} gpio_id_t;
typedef struct {
GPIO_TypeDef* port;
uint32_t pin;
} gpio_t;
/* GPIOs */
static const gpio_t gpio_constants[] = {
{GPIOC, GPIO_Pin_9 },
{GPIOC, GPIO_Pin_10},
{GPIOC, GPIO_Pin_11},
{GPIOC, GPIO_Pin_12},
{GPIOA, GPIO_Pin_8 },
{GPIOA, GPIO_Pin_15},
{NULL, 0}
};
#include "py_assert.h"
typedef struct _py_gpio_obj_t {
mp_obj_base_t base;
@ -38,13 +10,13 @@ typedef struct _py_gpio_obj_t {
static mp_obj_t py_gpio_low(py_gpio_obj_t *gpio)
{
GPIO_ResetBits(gpio->info->port, gpio->info->pin);
HAL_GPIO_WritePin(gpio->info->port, gpio->info->pin, GPIO_PIN_RESET);
return mp_const_none;
}
static mp_obj_t py_gpio_high(py_gpio_obj_t *gpio)
{
GPIO_SetBits(gpio->info->port, gpio->info->pin);
HAL_GPIO_WritePin(gpio->info->port, gpio->info->pin, GPIO_PIN_SET);
return mp_const_none;
}
@ -73,14 +45,13 @@ static const mp_obj_type_t py_gpio_type = {
static void gpio_init(const gpio_t *gpio)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure the GPIO pin */
GPIO_InitStructure.GPIO_Pin = gpio->pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(gpio->port, &GPIO_InitStructure);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = gpio->pin;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(gpio->port, &GPIO_InitStructure);
}
mp_obj_t py_gpio_new(mp_obj_t id_obj)
@ -89,10 +60,10 @@ mp_obj_t py_gpio_new(mp_obj_t id_obj)
py_gpio_obj_t *gpio_obj=mp_const_none;
if (id < GPIO_ID_MAX) {
gpio_init(&gpio_constants[id]);
gpio_init(&gpio_pins[id]);
gpio_obj = m_new_obj(py_gpio_obj_t);
gpio_obj->base.type = &py_gpio_type;
gpio_obj->info = &gpio_constants[id];
gpio_obj->info = &gpio_pins[id];
}
return gpio_obj;
}
@ -101,12 +72,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_gpio_new_obj, py_gpio_new);
static const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_gpio) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_P1), MP_OBJ_NEW_SMALL_INT(GPIO_PC10)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_P2), MP_OBJ_NEW_SMALL_INT(GPIO_PC11)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_P3), MP_OBJ_NEW_SMALL_INT(GPIO_PC12)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_P4), MP_OBJ_NEW_SMALL_INT(GPIO_PA15)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_P5), MP_OBJ_NEW_SMALL_INT(GPIO_PC9 )},
{ MP_OBJ_NEW_QSTR(MP_QSTR_P6), MP_OBJ_NEW_SMALL_INT(GPIO_PA8 )},
GPIO_PINS_QSTR,
{ MP_OBJ_NEW_QSTR(MP_QSTR_GPIO), (mp_obj_t)&py_gpio_new_obj },
};
@ -120,9 +86,6 @@ const mp_obj_module_t py_gpio_module = {
const mp_obj_module_t *py_gpio_init()
{
/* Enable GPIO clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
/* no init required */
return &py_gpio_module;
}

View File

@ -1,6 +1,32 @@
#include "mp.h"
#include "led.h"
#include "pincfg.h"
#include "py_led.h"
void led_init(enum led_id id)
{
led_state(id, 1);
}
void led_toggle(enum led_id id)
{
if (id >= 0 && id < LED_MAX) {
/* Invert LED state */
HAL_GPIO_TogglePin(led_pins[id].port, led_pins[id].pin);
}
}
void led_state(enum led_id id, int state)
{
if (id >= 0 && id < LED_MAX) {
#ifdef OPENMV2
if (id == LED_IR) { //IR LED is inverted
state = !state;
}
#endif
HAL_GPIO_WritePin(led_pins[id].port,
led_pins[id].pin, (state)? GPIO_PIN_RESET:GPIO_PIN_SET);
}
}
static mp_obj_t py_led_on(mp_obj_t led_id) {
led_state(mp_obj_get_int(led_id), 1);
return mp_const_none;

View File

@ -1,4 +1,17 @@
#ifndef __PY_LED_H__
#define __PY_LED_H__
enum led_id {
LED_RED=0,
LED_GREEN,
LED_BLUE,
#ifdef OPENMV2
LED_IR,
#endif
LED_MAX,
};
void led_init(enum led_id color);
void led_toggle(enum led_id color);
void led_state(enum led_id color, int state);
const mp_obj_module_t *py_led_init();
#endif /* __PY_LED_H__ */

View File

@ -1,47 +1,66 @@
#include <libmp.h>
#include "mp.h"
#include "pincfg.h"
#include "spi.h"
#include "py_assert.h"
#include "py_spi.h"
#include "imlib.h"
#include "py_assert.h"
#include "py_image.h"
#include "imlib.h"
#define SPI_TIMEOUT (500) /* in ms */
static SPI_HandleTypeDef SPIHandle;
static mp_obj_t py_spi_read()
static inline uint8_t spi_xfer(uint8_t out)
{
return mp_obj_new_int(spi_read());
}
static mp_obj_t py_spi_write(mp_obj_t c)
{
spi_write(mp_obj_get_int(c));
return mp_const_true;
}
static mp_obj_t py_spi_write_image(mp_obj_t image_obj)
{
struct image *image;
/* get image pointer */
image = (struct image*) py_image_cobj(image_obj);
uint16_t *pixels = (uint16_t*)image->data;
for (int j=0;j<image->h;j++) {
for (int i=0;i<image->w;i++) {
uint16_t c = pixels[j*image->w+i];
spi_write(c);
spi_write(c>>8);
}
if (HAL_SPI_TransmitReceive(&SPIHandle, &out, &out, 1, SPI_TIMEOUT) != HAL_OK) {
//BREAK();
}
return mp_const_none;
return out;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_spi_read_obj, py_spi_read);
static machine_int_t py_spi_read(mp_obj_t obj)
{
mp_buffer_info_t bufinfo;
if (MP_OBJ_IS_INT(obj)) {
bufinfo.len = mp_obj_get_int(obj);
bufinfo.typecode = 'B';
mp_obj_str_builder_start(&mp_type_bytes, bufinfo.len, (byte**)&(bufinfo.buf));
} else {
mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_WRITE);
}
if (HAL_SPI_Receive(&SPIHandle, bufinfo.buf, bufinfo.len, SPI_TIMEOUT) != HAL_OK) {
return -1;
}
return bufinfo.len;
}
static machine_int_t py_spi_write(mp_obj_t obj)
{
byte buf[1];
mp_buffer_info_t bufinfo;
if (MP_OBJ_IS_INT(obj)) {
buf[0] = mp_obj_get_int(obj);
bufinfo.buf = buf;
bufinfo.len = 1;
bufinfo.typecode = 'B';
} else {
mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_READ);
}
if (HAL_SPI_Transmit(&SPIHandle, bufinfo.buf, bufinfo.len, SPI_TIMEOUT) != HAL_OK) {
return -1;
}
return bufinfo.len;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_spi_read_obj, py_spi_read);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_spi_write_obj, py_spi_write);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_spi_write_image_obj, py_spi_write_image);
static const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_spi) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_read), (mp_obj_t)&py_spi_read_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_write), (mp_obj_t)&py_spi_write_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_write_image), (mp_obj_t)&py_spi_write_image_obj },
};
STATIC MP_DEFINE_CONST_DICT(globals_dict, globals_dict_table);
@ -54,7 +73,29 @@ static const mp_obj_module_t py_spi_module = {
const mp_obj_module_t *py_spi_init()
{
/* Init spi */
spi_init();
/* SPI configuration */
SPIHandle.Instance = USR_SPI;
SPIHandle.Init.Mode = SPI_MODE_MASTER;
SPIHandle.Init.Direction = SPI_DIRECTION_2LINES;
SPIHandle.Init.DataSize = SPI_DATASIZE_8BIT;
SPIHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
SPIHandle.Init.CLKPhase = SPI_PHASE_1EDGE;
SPIHandle.Init.NSS = SPI_NSS_SOFT;
SPIHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
SPIHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
SPIHandle.Init.TIMode = SPI_TIMODE_DISABLED;
SPIHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
SPIHandle.Init.CRCPolynomial = 7;
/* Initialize the user SPI */
if (HAL_SPI_Init(&SPIHandle) != HAL_OK) {
/* Initialization Error */
return NULL;
}
uint8_t buf[1];
/* dummy read */
HAL_SPI_Receive(&SPIHandle, buf, sizeof(buf), SPI_TIMEOUT);
return &py_spi_module;
}

View File

@ -1,7 +1,7 @@
#include <mp.h>
#include <cc3k.h>
#include <stm32f4xx_hal.h>
#include "led.h"
#include "py_led.h"
#define IS_WLAN_SEC(sec) \
(sec>WLAN_SEC_UNSEC && sec<=WLAN_SEC_WPA2)
#define MAX_PACKET_LENGTH (1024)

View File

@ -1,114 +0,0 @@
#include <stdint.h>
#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_spi.h>
#include <stm32f4xx_gpio.h>
#include "spi.h"
#define GPIO_SPI_AF GPIO_AF_SPI3
#define GPIO_PIN_CS GPIO_Pin_15
#define GPIO_PIN_SCLK GPIO_Pin_10
#define GPIO_PIN_MISO GPIO_Pin_11
#define GPIO_PIN_MOSI GPIO_Pin_12
#define GPIO_SOURCE_SCLK GPIO_PinSource10
#define GPIO_SOURCE_MISO GPIO_PinSource11
#define GPIO_SOURCE_MOSI GPIO_PinSource12
#define GPIO_PORT_CS GPIOA
#define GPIO_PORT_SCLK GPIOC
#define GPIO_PORT_MISO GPIOC
#define GPIO_PORT_MOSI GPIOC
#define GPIO_CLK_CS RCC_AHB1Periph_GPIOA
#define GPIO_CLK_SCLK RCC_AHB1Periph_GPIOC
#define GPIO_CLK_MISO RCC_AHB1Periph_GPIOC
#define GPIO_CLK_MOSI RCC_AHB1Periph_GPIOC
#define SPIx SPI3
#define SPIx_CLK RCC_APB1Periph_SPI3
#define SPIx_CLK_CMD RCC_APB1PeriphClockCmd
#define GPIO_CLK_CMD RCC_AHB1PeriphClockCmd
void spi_init()
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable SPI clock */
SPIx_CLK_CMD(SPIx_CLK, ENABLE);
/* Enable GPIO clocks */
GPIO_CLK_CMD(GPIO_CLK_CS | GPIO_CLK_SCLK | GPIO_CLK_MISO | GPIO_CLK_MOSI, ENABLE);
/* Connect SPI pins to AF */
GPIO_PinAFConfig(GPIO_PORT_SCLK, GPIO_SOURCE_SCLK, GPIO_SPI_AF);
GPIO_PinAFConfig(GPIO_PORT_MISO, GPIO_SOURCE_MISO, GPIO_SPI_AF);
GPIO_PinAFConfig(GPIO_PORT_MOSI, GPIO_SOURCE_MOSI, GPIO_SPI_AF);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/* SPI MISO pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_MISO;
GPIO_Init(GPIO_PORT_MISO, &GPIO_InitStructure);
/* SPI MOSI pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_MOSI;
GPIO_Init(GPIO_PORT_MOSI, &GPIO_InitStructure);
/* SPI SCK pin configuration */
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_SCLK;
GPIO_Init(GPIO_PORT_SCLK, &GPIO_InitStructure);
/* SPI configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPIx, &SPI_InitStructure);
SPI_CalculateCRC(SPIx, DISABLE);
SPI_Cmd(SPIx, ENABLE);
/* drain SPI */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
/* dummy read */
SPI_I2S_ReceiveData(SPIx);
}
uint8_t spi_read()
{
/* Send byte through the SPI */
SPI_I2S_SendData(SPIx, 0xFF);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
/* Read byte from the SPI */
return SPI_I2S_ReceiveData(SPIx);
}
uint8_t spi_write(uint8_t b)
{
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI */
SPI_I2S_SendData(SPIx, b);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
/* Read byte from the SPI */
return SPI_I2S_ReceiveData(SPIx);
}

View File

@ -1,7 +0,0 @@
#ifndef __SPI_H__
#define __SPI_H__
#include <stdint.h>
void spi_init();
uint8_t spi_read();
uint8_t spi_write(uint8_t b);
#endif /* __SPI_H__ */

View File

@ -11,6 +11,35 @@ const gpio_t led_pins[] = {
#endif
};
/* GPIOs */
#ifdef OPENMV1
const gpio_t gpio_pins[] = {
{GPIOA, GPIO_PIN_8 },
{GPIOA, GPIO_PIN_15},
{GPIOC, GPIO_PIN_9 },
{GPIOC, GPIO_PIN_10},
{GPIOC, GPIO_PIN_11},
{GPIOC, GPIO_PIN_12},
{NULL, 0}
};
#else
const gpio_t gpio_pins[] = {
{GPIOA, GPIO_PIN_2 },
{GPIOA, GPIO_PIN_3 },
{GPIOC, GPIO_PIN_4 },
{GPIOC, GPIO_PIN_5 },
{GPIOD, GPIO_PIN_8 },
{GPIOD, GPIO_PIN_9 },
{GPIOD, GPIO_PIN_12},
{GPIOD, GPIO_PIN_13},
{GPIOE, GPIO_PIN_2 },
{GPIOE, GPIO_PIN_3 },
{GPIOE, GPIO_PIN_5 },
{GPIOE, GPIO_PIN_6 },
{NULL, 0}
};
#endif
/* DCMI GPIOs */
static const gpio_t dcmi_pins[] = {
{DCMI_D0_PORT, DCMI_D0_PIN},
@ -88,8 +117,6 @@ void HAL_MspInit(void)
GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(SD_CD_PORT, &GPIO_InitStructure);
}
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
@ -159,6 +186,7 @@ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_InitStructure;
#ifdef OPENMV1
if (hspi->Instance == SD_SPI) {
/* Enable clock */
SD_SPI_CLK_ENABLE();
@ -185,7 +213,9 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
/* De-select the Card: Chip Select high */
SD_DESELECT();
} else if (hspi->Instance == WLAN_SPI) {
} else
#endif
if (hspi->Instance == WLAN_SPI) {
/* Enable clock */
WLAN_SPI_CLK_ENABLE();
@ -227,6 +257,24 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
/* Deselect the CC3K CS */
WLAN_DESELECT();
} else if (hspi->Instance == USR_SPI) {
/* Enable clock */
USR_SPI_CLK_ENABLE();
/* Configure SPI GPIOs */
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Alternate = USR_SPI_AF;
GPIO_InitStructure.Pin = USR_SCLK_PIN;
HAL_GPIO_Init(USR_SCLK_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = USR_MOSI_PIN;
HAL_GPIO_Init(USR_MOSI_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = USR_MISO_PIN;
HAL_GPIO_Init(USR_MISO_PORT, &GPIO_InitStructure);
}
}

View File

@ -1,6 +1,6 @@
import sensor, imlib, lcd
import lcd, sensor
lcd.init()
lcd.clear(0xFF)
while (True):
image = sensor.snapshot()
lcd.write_image(image)
lcd.write_image(image)

View File

@ -1,9 +1,9 @@
import spi, gpio
from time import sleep
rst = gpio.GPIO(gpio.PA8)
rs = gpio.GPIO(gpio.PC9)
cs = gpio.GPIO(gpio.PA15)
rst = gpio.GPIO(gpio.PA1)
rs = gpio.GPIO(gpio.PA2)
cs = gpio.GPIO(gpio.PA7)
def reset():
rst.low()
@ -33,7 +33,7 @@ def write_image(image):
write_command(0x2C)
cs.low()
rs.high()
spi.write_image(image)
spi.write(image)
cs.high()
def init():