mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
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:
parent
6f7de049b1
commit
12d062d1bc
@ -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
|
||||
@ -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))
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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__
|
||||
@ -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));
|
||||
|
||||
|
||||
105
src/omv/pincfg.h
105
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__
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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__ */
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
114
src/omv/spi.c
114
src/omv/spi.c
@ -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);
|
||||
}
|
||||
@ -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__ */
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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():
|
||||
|
||||
Loading…
Reference in New Issue
Block a user