Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
micropython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
micropython
Commits
c5d8ffef
Commit
c5d8ffef
authored
Dec 08, 2015
by
Tobias Badertscher
Committed by
Damien George
Dec 16, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
stmhal: Extend SPI support to fully support all SPI devices on STM32F429.
This includes SPI4, SPI5 and SPI6.
parent
130fde81
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
162 additions
and
12 deletions
+162
-12
stmhal/boards/STM32F429DISC/mpconfigboard.h
stmhal/boards/STM32F429DISC/mpconfigboard.h
+28
-0
stmhal/dma.h
stmhal/dma.h
+18
-0
stmhal/spi.c
stmhal/spi.c
+113
-12
stmhal/spi.h
stmhal/spi.h
+3
-0
No files found.
stmhal/boards/STM32F429DISC/mpconfigboard.h
View file @
c5d8ffef
#include STM32_HAL_H
#define MICROPY_HW_BOARD_NAME "F429I-DISCO"
#define MICROPY_HW_MCU_NAME "STM32F429"
...
...
@@ -29,6 +31,32 @@
#define MICROPY_HW_I2C1_SCL (pin_A8)
#define MICROPY_HW_I2C1_SDA (pin_C9)
// SPI busses
//#define MICROPY_HW_SPI1_NSS (pin_A4)
//#define MICROPY_HW_SPI1_SCK (pin_A5)
//#define MICROPY_HW_SPI1_MISO (pin_A6)
//#define MICROPY_HW_SPI1_MOSI (pin_A7)
#if defined(USE_USB_HS_IN_FS)
// The HS USB uses B14 & B15 for D- and D+
#else
#define MICROPY_HW_SPI2_NSS (pin_B12)
#define MICROPY_HW_SPI2_SCK (pin_B13)
#define MICROPY_HW_SPI2_MISO (pin_B14)
#define MICROPY_HW_SPI2_MOSI (pin_B15)
#endif
//#define MICROPY_HW_SPI4_NSS (pin_E11)
//#define MICROPY_HW_SPI4_SCK (pin_E12)
//#define MICROPY_HW_SPI4_MISO (pin_E13)
//#define MICROPY_HW_SPI4_MOSI (pin_E14)
#define MICROPY_HW_SPI5_NSS (pin_F6)
#define MICROPY_HW_SPI5_SCK (pin_F7)
#define MICROPY_HW_SPI5_MISO (pin_F8)
#define MICROPY_HW_SPI5_MOSI (pin_F9)
//#define MICROPY_HW_SPI6_NSS (pin_G8)
//#define MICROPY_HW_SPI6_SCK (pin_G13)
//#define MICROPY_HW_SPI6_MISO (pin_G12)
//#define MICROPY_HW_SPI6_MOSI (pin_G14)
// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN (pin_A0)
#define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)
...
...
stmhal/dma.h
View file @
c5d8ffef
...
...
@@ -74,12 +74,30 @@
#define DMA_STREAM_SPI1_RX DMA2_Stream2
#define DMA_CHANNEL_SPI1_RX DMA_CHANNEL_3
#define DMA_STREAM_SPI5_RX DMA2_Stream3
#define DMA_CHANNEL_SPI5_RX DMA_CHANNEL_2
#define DMA_STREAM_SDIO_RX DMA2_Stream3
#define DMA_CHANNEL_SDIO_RX DMA_CHANNEL_4
#define DMA_STREAM_SPI4_RX DMA2_Stream3
#define DMA_CHANNEL_SPI4_RX DMA_CHANNEL_5
#define DMA_STREAM_SPI5_TX DMA2_Stream4
#define DMA_CHANNEL_SPI5_TX DMA_CHANNEL_2
#define DMA_STREAM_SPI4_TX DMA2_Stream4
#define DMA_CHANNEL_SPI4_TX DMA_CHANNEL_5
#define DMA_STREAM_SPI6_TX DMA2_Stream5
#define DMA_CHANNEL_SPI6_TX DMA_CHANNEL_1
#define DMA_STREAM_SPI1_TX DMA2_Stream5
#define DMA_CHANNEL_SPI1_TX DMA_CHANNEL_3
#define DMA_STREAM_SPI6_RX DMA2_Stream6
#define DMA_CHANNEL_SPI6_RX DMA_CHANNEL_1
#define DMA_STREAM_SDIO_TX DMA2_Stream6
#define DMA_CHANNEL_SDIO_TX DMA_CHANNEL_4
...
...
stmhal/spi.c
View file @
c5d8ffef
...
...
@@ -68,6 +68,12 @@
// SPI2_RX: DMA1_Stream3.CHANNEL_0
// SPI3_TX: DMA1_Stream5.CHANNEL_0 or DMA1_Stream7.CHANNEL_0
// SPI3_RX: DMA1_Stream0.CHANNEL_0 or DMA1_Stream2.CHANNEL_0
// SPI4_TX: DMA2_Stream4.CHANNEL_5 or DMA2_Stream1.CHANNEL_4
// SPI4_RX: DMA2_Stream3.CHANNEL_5 or DMA2_Stream0.CHANNEL_4
// SPI5_TX: DMA2_Stream4.CHANNEL_2 or DMA2_Stream6.CHANNEL_7
// SPI5_RX: DMA2_Stream3.CHANNEL_2 or DMA2_Stream5.CHANNEL_7
// SPI6_TX: DMA2_Stream5.CHANNEL_1
// SPI6_RX: DMA2_Stream6.CHANNEL_1
typedef
struct
_pyb_spi_obj_t
{
mp_obj_base_t
base
;
...
...
@@ -87,6 +93,15 @@ SPI_HandleTypeDef SPIHandle2 = {.Instance = NULL};
#if defined(MICROPY_HW_SPI3_SCK)
SPI_HandleTypeDef
SPIHandle3
=
{.
Instance
=
NULL
};
#endif
#if defined(MICROPY_HW_SPI4_SCK)
SPI_HandleTypeDef
SPIHandle4
=
{.
Instance
=
NULL
};
#endif
#if defined(MICROPY_HW_SPI5_SCK)
SPI_HandleTypeDef
SPIHandle5
=
{.
Instance
=
NULL
};
#endif
#if defined(MICROPY_HW_SPI6_SCK)
SPI_HandleTypeDef
SPIHandle6
=
{.
Instance
=
NULL
};
#endif
STATIC
const
pyb_spi_obj_t
pyb_spi_obj
[]
=
{
#if defined(MICROPY_HW_SPI1_SCK)
...
...
@@ -104,6 +119,21 @@ STATIC const pyb_spi_obj_t pyb_spi_obj[] = {
#else
{{
&
pyb_spi_type
},
NULL
,
NULL
,
0
,
NULL
,
0
},
#endif
#if defined(MICROPY_HW_SPI4_SCK)
{{
&
pyb_spi_type
},
&
SPIHandle4
,
DMA_STREAM_SPI4_TX
,
DMA_CHANNEL_SPI4_TX
,
DMA_STREAM_SPI4_RX
,
DMA_CHANNEL_SPI4_RX
},
#else
{{
&
pyb_spi_type
},
NULL
,
NULL
,
0
,
NULL
,
0
},
#endif
#if defined(MICROPY_HW_SPI5_SCK)
{{
&
pyb_spi_type
},
&
SPIHandle5
,
DMA_STREAM_SPI5_TX
,
DMA_CHANNEL_SPI5_TX
,
DMA_STREAM_SPI5_RX
,
DMA_CHANNEL_SPI5_RX
},
#else
{{
&
pyb_spi_type
},
NULL
,
NULL
,
0
,
NULL
,
0
},
#endif
#if defined(MICROPY_HW_SPI6_SCK)
{{
&
pyb_spi_type
},
&
SPIHandle6
,
DMA_STREAM_SPI6_TX
,
DMA_CHANNEL_SPI6_TX
,
DMA_STREAM_SPI6_RX
,
DMA_CHANNEL_SPI6_RX
},
#else
{{
&
pyb_spi_type
},
NULL
,
NULL
,
0
,
NULL
,
0
},
#endif
};
void
spi_init0
(
void
)
{
...
...
@@ -120,6 +150,18 @@ void spi_init0(void) {
memset
(
&
SPIHandle3
,
0
,
sizeof
(
SPI_HandleTypeDef
));
SPIHandle3
.
Instance
=
SPI3
;
#endif
#if defined(MICROPY_HW_SPI4_SCK)
memset
(
&
SPIHandle4
,
0
,
sizeof
(
SPI_HandleTypeDef
));
SPIHandle4
.
Instance
=
SPI4
;
#endif
#if defined(MICROPY_HW_SPI5_SCK)
memset
(
&
SPIHandle5
,
0
,
sizeof
(
SPI_HandleTypeDef
));
SPIHandle5
.
Instance
=
SPI5
;
#endif
#if defined(MICROPY_HW_SPI6_SCK)
memset
(
&
SPIHandle6
,
0
,
sizeof
(
SPI_HandleTypeDef
));
SPIHandle6
.
Instance
=
SPI6
;
#endif
}
// TODO allow to take a list of pins to use
...
...
@@ -167,6 +209,39 @@ void spi_init(SPI_HandleTypeDef *spi, bool enable_nss_pin) {
// enable the SPI clock
__SPI3_CLK_ENABLE
();
#endif
#if defined(MICROPY_HW_SPI4_SCK)
}
else
if
(
spi
->
Instance
==
SPI4
)
{
self
=
&
pyb_spi_obj
[
3
];
pins
[
0
]
=
&
MICROPY_HW_SPI4_NSS
;
pins
[
1
]
=
&
MICROPY_HW_SPI4_SCK
;
pins
[
2
]
=
&
MICROPY_HW_SPI4_MISO
;
pins
[
3
]
=
&
MICROPY_HW_SPI4_MOSI
;
GPIO_InitStructure
.
Alternate
=
GPIO_AF5_SPI4
;
// enable the SPI clock
__SPI4_CLK_ENABLE
();
#endif
#if defined(MICROPY_HW_SPI5_SCK)
}
else
if
(
spi
->
Instance
==
SPI5
)
{
self
=
&
pyb_spi_obj
[
4
];
pins
[
0
]
=
&
MICROPY_HW_SPI5_NSS
;
pins
[
1
]
=
&
MICROPY_HW_SPI5_SCK
;
pins
[
2
]
=
&
MICROPY_HW_SPI5_MISO
;
pins
[
3
]
=
&
MICROPY_HW_SPI5_MOSI
;
GPIO_InitStructure
.
Alternate
=
GPIO_AF5_SPI5
;
// enable the SPI clock
__SPI5_CLK_ENABLE
();
#endif
#if defined(MICROPY_HW_SPI6_SCK)
}
else
if
(
spi
->
Instance
==
SPI6
)
{
self
=
&
pyb_spi_obj
[
5
];
pins
[
0
]
=
&
MICROPY_HW_SPI6_NSS
;
pins
[
1
]
=
&
MICROPY_HW_SPI6_SCK
;
pins
[
2
]
=
&
MICROPY_HW_SPI6_MISO
;
pins
[
3
]
=
&
MICROPY_HW_SPI6_MOSI
;
GPIO_InitStructure
.
Alternate
=
GPIO_AF5_SPI6
;
// enable the SPI clock
__SPI6_CLK_ENABLE
();
#endif
}
else
{
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
return
;
...
...
@@ -215,6 +290,24 @@ void spi_deinit(SPI_HandleTypeDef *spi) {
__SPI3_RELEASE_RESET
();
__SPI3_CLK_DISABLE
();
#endif
#if defined(MICROPY_HW_SPI4_SCK)
}
else
if
(
spi
->
Instance
==
SPI4
)
{
__SPI4_FORCE_RESET
();
__SPI4_RELEASE_RESET
();
__SPI4_CLK_DISABLE
();
#endif
#if defined(MICROPY_HW_SPI5_SCK)
}
else
if
(
spi
->
Instance
==
SPI5
)
{
__SPI5_FORCE_RESET
();
__SPI5_RELEASE_RESET
();
__SPI5_CLK_DISABLE
();
#endif
#if defined(MICROPY_HW_SPI6_SCK)
}
else
if
(
spi
->
Instance
==
SPI6
)
{
__SPI6_FORCE_RESET
();
__SPI6_RELEASE_RESET
();
__SPI6_CLK_DISABLE
();
#endif
}
}
...
...
@@ -245,10 +338,18 @@ SPI_HandleTypeDef *spi_get_handle(mp_obj_t o) {
STATIC
void
pyb_spi_print
(
const
mp_print_t
*
print
,
mp_obj_t
self_in
,
mp_print_kind_t
kind
)
{
pyb_spi_obj_t
*
self
=
self_in
;
uint
spi_num
;
if
(
self
->
spi
->
Instance
==
SPI1
)
{
spi_num
=
1
;
}
else
if
(
self
->
spi
->
Instance
==
SPI2
)
{
spi_num
=
2
;
}
else
{
spi_num
=
3
;
}
uint
spi_num
=
1
;
// default to SPI1
if
(
self
->
spi
->
Instance
==
SPI2
)
{
spi_num
=
2
;
}
else
if
(
self
->
spi
->
Instance
==
SPI3
)
{
spi_num
=
3
;
}
#if defined(SPI4)
else
if
(
self
->
spi
->
Instance
==
SPI4
)
{
spi_num
=
4
;
}
#endif
#if defined(SPI5)
else
if
(
self
->
spi
->
Instance
==
SPI5
)
{
spi_num
=
5
;
}
#endif
#if defined(SPI6)
else
if
(
self
->
spi
->
Instance
==
SPI6
)
{
spi_num
=
6
;
}
#endif
if
(
self
->
spi
->
State
==
HAL_SPI_STATE_RESET
)
{
mp_printf
(
print
,
"SPI(%u)"
,
spi_num
);
...
...
@@ -256,12 +357,12 @@ STATIC void pyb_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_ki
if
(
self
->
spi
->
Init
.
Mode
==
SPI_MODE_MASTER
)
{
// compute baudrate
uint
spi_clock
;
if
(
self
->
spi
->
Instance
==
SPI1
)
{
// SPI1 is on APB2
spi_clock
=
HAL_RCC_GetPCLK2Freq
();
}
else
{
if
(
self
->
spi
->
Instance
==
SPI2
||
self
->
spi
->
Instance
==
SPI3
)
{
// SPI2 and SPI3 are on APB1
spi_clock
=
HAL_RCC_GetPCLK1Freq
();
}
else
{
// SPI1, SPI4, SPI5 and SPI6 are on APB2
spi_clock
=
HAL_RCC_GetPCLK2Freq
();
}
uint
log_prescaler
=
(
self
->
spi
->
Init
.
BaudRatePrescaler
>>
3
)
+
1
;
uint
baudrate
=
spi_clock
>>
log_prescaler
;
...
...
@@ -311,12 +412,12 @@ STATIC mp_obj_t pyb_spi_init_helper(const pyb_spi_obj_t *self, mp_uint_t n_args,
if
(
br_prescale
==
0xffffffff
)
{
// prescaler not given, so select one that yields at most the requested baudrate
mp_uint_t
spi_clock
;
if
(
self
->
spi
->
Instance
==
SPI1
)
{
// SPI1 is on APB2
spi_clock
=
HAL_RCC_GetPCLK2Freq
();
}
else
{
if
(
self
->
spi
->
Instance
==
SPI2
||
self
->
spi
->
Instance
==
SPI3
)
{
// SPI2 and SPI3 are on APB1
spi_clock
=
HAL_RCC_GetPCLK1Freq
();
}
else
{
// SPI1, SPI4, SPI5 and SPI6 are on APB2
spi_clock
=
HAL_RCC_GetPCLK2Freq
();
}
br_prescale
=
spi_clock
/
args
[
1
].
u_int
;
}
...
...
stmhal/spi.h
View file @
c5d8ffef
...
...
@@ -27,6 +27,9 @@
extern
SPI_HandleTypeDef
SPIHandle1
;
extern
SPI_HandleTypeDef
SPIHandle2
;
extern
SPI_HandleTypeDef
SPIHandle3
;
extern
SPI_HandleTypeDef
SPIHandle4
;
extern
SPI_HandleTypeDef
SPIHandle5
;
extern
SPI_HandleTypeDef
SPIHandle6
;
extern
const
mp_obj_type_t
pyb_spi_type
;
void
spi_init0
(
void
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment