Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix i2c and spi to compile for Netduino Plus 2 #511

Merged
merged 1 commit into from
Apr 20, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (1)
#define MICROPY_HW_ENABLE_DAC (0)
#define MICROPU_HW_ENABLE_I2C1 (0)
#define MICROPU_HW_ENABLE_SPI1 (0)

// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN (pin_B11)
Expand Down
21 changes: 12 additions & 9 deletions stmhal/i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
#include "genhdr/pins.h"
#include "i2c.h"

#if !defined(MICROPU_HW_ENABLE_I2C1)
#define MICROPY_HW_ENABLE_I2C1 (1)
#endif

I2C_HandleTypeDef I2CHandle1 = {.Instance = NULL};
I2C_HandleTypeDef I2CHandle2 = {.Instance = NULL};

Expand All @@ -32,14 +36,17 @@ void i2c_init(I2C_HandleTypeDef *i2c) {
GPIO_InitStructure.Pull = GPIO_NOPULL; // have external pull-up resistors on both lines

const pin_obj_t *pins[2];
#if MICROPY_HW_ENABLE_I2C1
if (i2c == &I2CHandle1) {
// X-skin: X9=PB6=SCL, X10=PB7=SDA
pins[0] = &pin_B6;
pins[1] = &pin_B7;
GPIO_InitStructure.Alternate = GPIO_AF4_I2C1;
// enable the I2C clock
__I2C1_CLK_ENABLE();
} else {
} else
#endif
if (i2c == &I2CHandle2) {
// Y-skin: Y9=PB10=SCL, Y10=PB11=SDA
pins[0] = &pin_B10;
pins[1] = &pin_B11;
Expand All @@ -54,13 +61,6 @@ void i2c_init(I2C_HandleTypeDef *i2c) {
HAL_GPIO_Init(pins[i]->gpio, &GPIO_InitStructure);
}

// enable the I2C clock
if (i2c == &I2CHandle1) {
__I2C1_CLK_ENABLE();
} else {
__I2C2_CLK_ENABLE();
}

// init the I2C device
i2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
i2c->Init.ClockSpeed = 400000;
Expand Down Expand Up @@ -88,7 +88,10 @@ typedef struct _pyb_i2c_obj_t {
I2C_HandleTypeDef *i2c;
} pyb_i2c_obj_t;

STATIC const pyb_i2c_obj_t pyb_i2c_obj[PYB_NUM_I2C] = {{{&pyb_i2c_type}, &I2CHandle1}, {{&pyb_i2c_type}, &I2CHandle2}};
STATIC const pyb_i2c_obj_t pyb_i2c_obj[PYB_NUM_I2C] = {
{{&pyb_i2c_type}, &I2CHandle1},
{{&pyb_i2c_type}, &I2CHandle2}
};

STATIC mp_obj_t pyb_i2c_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
// check arguments
Expand Down
39 changes: 21 additions & 18 deletions stmhal/spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,22 @@
#include "genhdr/pins.h"
#include "spi.h"

#if !defined(MICROPU_HW_ENABLE_SPI1)
#define MICROPY_HW_ENABLE_SPI1 (1)
#endif

SPI_HandleTypeDef SPIHandle1 = {.Instance = NULL};
SPI_HandleTypeDef SPIHandle2 = {.Instance = NULL};
#if MICROPY_HW_ENABLE_SPI3
SPI_HandleTypeDef SPIHandle3 = {.Instance = NULL};
#endif

void spi_init0(void) {
// reset the SPI handles
memset(&SPIHandle1, 0, sizeof(SPI_HandleTypeDef));
SPIHandle1.Instance = SPI1;
memset(&SPIHandle2, 0, sizeof(SPI_HandleTypeDef));
SPIHandle2.Instance = SPI2;
#if MICROPY_HW_ENABLE_SPI3
memset(&SPIHandle3, 0, sizeof(SPI_HandleTypeDef));
SPIHandle3.Instance = SPI3;
#endif
}

// TODO allow to take a list of pins to use
Expand All @@ -40,32 +40,36 @@ void spi_init(SPI_HandleTypeDef *spi) {
GPIO_InitStructure.Pull = GPIO_PULLUP; // ST examples use PULLUP

const pin_obj_t *pins[4];
#if MICROPY_HW_ENABLE_SPI1
if (spi->Instance == SPI1) {
// X-skin: X5=PA4=SPI1_NSS, X6=PA5=SPI1_SCK, X7=PA6=SPI1_MISO, X8=PA7=SPI1_MOSI
pins[0] = &pin_A4;
pins[1] = &pin_A5;
pins[2] = &pin_A6;
pins[3] = &pin_A7;
GPIO_InitStructure.Alternate = GPIO_AF5_SPI1;
} else if (spi->Instance == SPI2) {
} else
#endif
if (spi->Instance == SPI2) {
// Y-skin: Y5=PB12=SPI2_NSS, Y6=PB13=SPI2_SCK, Y7=PB14=SPI2_MISO, Y8=PB15=SPI2_MOSI
pins[0] = &pin_B12;
pins[1] = &pin_B13;
pins[2] = &pin_B14;
pins[3] = &pin_B15;
GPIO_InitStructure.Alternate = GPIO_AF5_SPI2;
} else
#if MICROPY_HW_ENABLE_SPI3
} else if (spi->Instance == SPI3) {
if (spi->Instance == SPI3) {
pins[0] = &pin_A4;
pins[1] = &pin_B3;
pins[2] = &pin_B4;
pins[3] = &pin_B5;
GPIO_InitStructure.Alternate = GPIO_AF6_SPI3;
} else
#endif
} else {
{
// SPI does not exist for this board
printf("HardwareError: invalid SPI\n");
return;
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "SPI bus does not exist"));
}

for (uint i = 0; i < 4; i++) {
Expand All @@ -78,10 +82,8 @@ void spi_init(SPI_HandleTypeDef *spi) {
__SPI1_CLK_ENABLE();
} else if (spi->Instance == SPI2) {
__SPI2_CLK_ENABLE();
#if MICROPY_HW_ENABLE_SPI3
} else {
} else if (spi->Instance == SPI3) {
__SPI3_CLK_ENABLE();
#endif
}

// init the I2C device
Expand All @@ -100,24 +102,25 @@ void spi_deinit(SPI_HandleTypeDef *spi) {
__SPI1_CLK_DISABLE();
} else if (spi->Instance == SPI2) {
__SPI2_CLK_DISABLE();
#if MICROPY_HW_ENABLE_SPI3
} else {
} else if (spi->Instance == SPI3) {
__SPI3_CLK_DISABLE();
#endif
}
}

/******************************************************************************/
/* Micro Python bindings */

#define PYB_SPI_NUM (2)
#define PYB_NUM_SPI (2)

typedef struct _pyb_spi_obj_t {
mp_obj_base_t base;
SPI_HandleTypeDef *spi;
} pyb_spi_obj_t;

STATIC const pyb_spi_obj_t pyb_spi_obj[PYB_SPI_NUM] = {{{&pyb_spi_type}, &SPIHandle1}, {{&pyb_spi_type}, &SPIHandle2}};
STATIC const pyb_spi_obj_t pyb_spi_obj[PYB_NUM_SPI] = {
{{&pyb_spi_type}, &SPIHandle1},
{{&pyb_spi_type}, &SPIHandle2}
};

STATIC void pyb_spi_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
pyb_spi_obj_t *self = self_in;
Expand Down Expand Up @@ -220,7 +223,7 @@ STATIC mp_obj_t pyb_spi_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const
machine_int_t spi_id = mp_obj_get_int(args[0]) - 1;

// check SPI number
if (!(0 <= spi_id && spi_id < PYB_SPI_NUM)) {
if (!(0 <= spi_id && spi_id < PYB_NUM_SPI)) {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "SPI bus %d does not exist", spi_id + 1));
}

Expand Down