From 12d062d1bcddaa308a59a956a672c1c068b7be5e Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Sun, 10 Aug 2014 19:39:19 +0200 Subject: [PATCH] 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 --- src/Makefile | 3 +- src/micropython | 2 +- src/omv/Makefile | 3 +- src/omv/led.c | 31 ---------- src/omv/led.h | 16 ----- src/omv/main.c | 31 ++++++++-- src/omv/pincfg.h | 105 ++++++++++++++++++++++++++------- src/omv/py/py_gpio.c | 67 +++++---------------- src/omv/py/py_led.c | 28 ++++++++- src/omv/py/py_led.h | 13 ++++ src/omv/py/py_spi.c | 105 +++++++++++++++++++++++---------- src/omv/py/py_wlan.c | 2 +- src/omv/spi.c | 114 ------------------------------------ src/omv/spi.h | 7 --- src/omv/stm32f407_hal_msp.c | 54 ++++++++++++++++- usr/examples/lcd.py | 4 +- usr/lib/lcd.py | 8 +-- 17 files changed, 299 insertions(+), 294 deletions(-) delete mode 100644 src/omv/led.c delete mode 100644 src/omv/led.h delete mode 100644 src/omv/spi.c delete mode 100644 src/omv/spi.h diff --git a/src/Makefile b/src/Makefile index 0612dbe20..8c48251a3 100755 --- a/src/Makefile +++ b/src/Makefile @@ -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) diff --git a/src/micropython b/src/micropython index 3dd822a4a..fa1eeeb2d 160000 --- a/src/micropython +++ b/src/micropython @@ -1 +1 @@ -Subproject commit 3dd822a4af2d07aa020b73dbb2fd770748771305 +Subproject commit fa1eeeb2d51474016272963083e3b58f6271d59e diff --git a/src/omv/Makefile b/src/omv/Makefile index 272ce9bfa..8d7561a9e 100644 --- a/src/omv/Makefile +++ b/src/omv/Makefile @@ -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)) diff --git a/src/omv/led.c b/src/omv/led.c deleted file mode 100644 index 096867a08..000000000 --- a/src/omv/led.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#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); - } -} - - diff --git a/src/omv/led.h b/src/omv/led.h deleted file mode 100644 index 16aab441c..000000000 --- a/src/omv/led.h +++ /dev/null @@ -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__ diff --git a/src/omv/main.c b/src/omv/main.c index cf770aa26..2022089d0 100644 --- a/src/omv/main.c +++ b/src/omv/main.c @@ -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)); diff --git a/src/omv/pincfg.h b/src/omv/pincfg.h index ccd8a7811..d8b25cf8c 100644 --- a/src/omv/pincfg.h +++ b/src/omv/pincfg.h @@ -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__ diff --git a/src/omv/py/py_gpio.c b/src/omv/py/py_gpio.c index 0cb148fe9..415611a4d 100644 --- a/src/omv/py/py_gpio.c +++ b/src/omv/py/py_gpio.c @@ -1,35 +1,7 @@ -#include -#include -#include -#include -#include -#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; } diff --git a/src/omv/py/py_led.c b/src/omv/py/py_led.c index 515c967e4..f05aed9e9 100644 --- a/src/omv/py/py_led.c +++ b/src/omv/py/py_led.c @@ -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; diff --git a/src/omv/py/py_led.h b/src/omv/py/py_led.h index ef54b108d..af67f7bd1 100644 --- a/src/omv/py/py_led.h +++ b/src/omv/py/py_led.h @@ -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__ */ diff --git a/src/omv/py/py_spi.c b/src/omv/py/py_spi.c index f993625d6..b013157e1 100644 --- a/src/omv/py/py_spi.c +++ b/src/omv/py/py_spi.c @@ -1,47 +1,66 @@ -#include +#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;jh;j++) { - for (int i=0;iw;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; } diff --git a/src/omv/py/py_wlan.c b/src/omv/py/py_wlan.c index 2e16fe4c7..7bad29f66 100644 --- a/src/omv/py/py_wlan.c +++ b/src/omv/py/py_wlan.c @@ -1,7 +1,7 @@ #include #include #include -#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) diff --git a/src/omv/spi.c b/src/omv/spi.c deleted file mode 100644 index cd9412575..000000000 --- a/src/omv/spi.c +++ /dev/null @@ -1,114 +0,0 @@ -#include -#include -#include -#include -#include -#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); -} diff --git a/src/omv/spi.h b/src/omv/spi.h deleted file mode 100644 index 9ebb38055..000000000 --- a/src/omv/spi.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __SPI_H__ -#define __SPI_H__ -#include -void spi_init(); -uint8_t spi_read(); -uint8_t spi_write(uint8_t b); -#endif /* __SPI_H__ */ diff --git a/src/omv/stm32f407_hal_msp.c b/src/omv/stm32f407_hal_msp.c index f248842f2..86fda700b 100644 --- a/src/omv/stm32f407_hal_msp.c +++ b/src/omv/stm32f407_hal_msp.c @@ -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); } } diff --git a/usr/examples/lcd.py b/usr/examples/lcd.py index 83892db7f..ce91da284 100644 --- a/usr/examples/lcd.py +++ b/usr/examples/lcd.py @@ -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) \ No newline at end of file + lcd.write_image(image) diff --git a/usr/lib/lcd.py b/usr/lib/lcd.py index 0d922ab11..c924af142 100644 --- a/usr/lib/lcd.py +++ b/usr/lib/lcd.py @@ -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():