# ^7 B ^! O3 a- v
测试STM8L050 SPI输出测试" [, J$ j; C2 D
\- P8 ]9 f3 H8 A. p( r' @
一、端口配置:$ |; E9 ^" O8 e$ i- s, ]& z
% P9 G1 G' ?! U; s
使用STM8CubeMX来查看SPI需要的引脚( W; O" \6 z& f: G
- J. p* h0 k B
: m7 l, M! o/ N2 a+ I6 v! Q
二、程序部分
3 O* g6 r- b# {& C+ U6 ^1 _ " [, k) }. R7 e6 B* l
2.1、SPI程序, T- X. l1 `! o) o# M1 p: b
- //spi.c6 M/ p* k5 D2 L# e
- #include "stm8l15x.h"
9 t% X& K# z7 J4 E - $ }* A9 S+ f/ f) M
- void SPI_FLASH_Init(void), [8 c# T7 v6 E1 \: W! P
- {
3 ?: O/ }9 \( x - GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); //SPI_MOSI
& J w. b' L9 H - GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); //SPI_MISO
X3 P/ f' [' { - GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); //SPI_SCK
$ B; e1 V0 G* ^6 K5 ]# { -
! `; Q A( K! M - CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
! V4 G _: [0 n1 ^, ]1 e; B3 q -
0 q- J. C/ ?5 q; X9 v8 ] - SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_4, SPI_Mode_Master,\$ m% C* p' P3 s+ S
- SPI_CPOL_High, SPI_CPHA_2Edge, \
' p; K) B7 w# ]4 |" Z! R - SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
5 b* R4 C/ i0 G, w" P/ }2 ? - : y& y) E9 D0 Q0 Q
- SPI_Cmd(SPI1, ENABLE); /* 使能SPI */4 Z! F3 B( L- D* G
- ) o/ G. I4 P2 k; Z
- /* 配置CS管脚 */
6 I7 l1 W/ _% \4 P - // GPIO_Init(SPI_CS , SPI_Pin_CS, GPIO_Mode_Out_PP_High_Fast);& s9 q5 A p- X. C; b
- // GPIO_WriteBit(SPI_CS, SPI_Pin_CS, SET); /* 拉高不使能外部SPI设备 */
! z& \ B6 C l% V8 C
: ?" n: w" ^* [7 f9 W! I- }
& D: w" t- b% y4 h& g6 m
/ H( L/ S( _7 G* {" K5 a
( z2 n5 w" S9 w5 h9 V- uint8_t SPI_FLASH_SendByte(u8 byte)! y% r' ]- Q6 j7 ?6 w1 Y
- {
; R7 P* N6 n, W' [+ c) Y; b& i - /* Loop while DR register in not emplty */
7 b: s0 W- y$ c% V! [( F8 s - while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);
+ k O9 @7 t4 } - /* Send byte through the SPI1 peripheral */
1 O0 s4 R3 Y) G1 p5 e% p0 q - SPI_SendData(SPI1, byte);. ?* ?" E2 X# o8 @# {
- /* Wait to receive a byte */
! D5 l1 X7 j, W6 J5 Z1 X; C - while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);/ [5 m. r( x% H- |* q2 l
- /* Return the byte read from the SPI bus */+ j5 h4 D4 x! G2 I- N) E
- return SPI_ReceiveData(SPI1);
* i' d! U T6 f$ b) ^+ {* V - }
$ } }: W/ k* ` - //spi.h
4 K. }8 _. e* H! i4 U7 e6 N6 [ - #ifndef __SPI_H
) [. k+ a3 B( L) G0 B# V4 F! h - #define __SPI_H3 u1 @8 R) E, e1 t( s; o
9 ~7 ?# v: b) V" d% h1 J- x# ^- void SPI_FLASH_Init(void);" j z. P9 d _- d3 O
- uint8_t SPI_FLASH_SendByte(u8 byte); v) f& D" ]! \) d4 ^2 \. |3 n/ q
9 O0 g2 U& Y* W7 G" V- #endif * c$ T. {# E& \$ H
复制代码 " G; f1 M3 L/ l# X! m+ b0 E
2.2、主程序/ V4 r$ |0 b- h
- void main(void)
( o! q7 c. `. R8 b - {% K. F1 _ T+ l/ Q6 `2 N: K: ~
5 P4 _1 s6 r, a6 n( u" D9 f s- CLK_Config(); //时钟初始化1 q: ?4 {' T! Y& @. G0 ~) ]
-
& g* ?0 j, X0 b" f* k - Delay(0x2fffff); //延时5S 6 g/ O; q" z6 N- u9 |# w
-
) L0 D( Q4 W( L - //led_init(); //led初始化' g* @1 p2 _- i. t4 R' ?" v
- //swim_init();
' S; J7 k: M% `2 ` - uart_init_halfduplex();
* T; T/ O4 i l. t' u: q; T - : G8 H* X% f% a( w, H# f7 s+ p! b: a7 B
- SPI_FLASH_Init();
: W: C7 V f$ _4 O+ k2 | -
' J) h' |# c$ @4 a - while (1)
' ?# ~8 Q$ `/ ?& E& [% { - {
8 G6 G& t* D5 d- s, I -
6 T: Z. G* _4 A - SPI_FLASH_SendByte(0x55); s% A* z/ @, m2 W+ _
- Delay(0xffff);, ?+ u J1 e% ]7 b( S: b
- }+ z6 f: L" G4 i* o3 F2 v
- }
复制代码 6 X+ Q T! \8 N' A9 v8 M9 B( O
三、执行结果! M$ A! c3 [0 s3 Z
3 @" ]* X- V: Z: T8 U8 |+ i) r9 S
手头上没有SPI通信的器件,使用示波器测试下,SPI_SCK和SPI_MOSI波形:
( b4 {3 M, p) e- k' [# m- | 黄色:SPI_SCK3 E( e3 s ?3 k9 U) t8 b
绿色:SPI_MOSI
; @7 z7 V) p# D2 k' Q SPI发送的数据是0x55
' v& n4 y* H0 a r! u
_0 L; z- F R5 i/ a. G( N; N, z) Y' _9 V5 S1 B
& D9 K3 u) E, }: c% W- P- |& L4 g6 L' U9 X. j: D1 c
2 V- K2 k! P* R3 n
" w: @; h+ E, [
2 [! W# ?5 @& ?/ @4 q& S
5 W' @% Q4 H* W/ c8 E9 `: t, @1 D. N% D, o4 F
8 [% O1 u# d' s$ M; \
/ Z' h* h! T* s2 a9 N: K2 p, j
4 e: b6 r/ x) V. ~
/ R- b" \3 q F% {) m; x
4 r \ P( N. [5 G o, H0 k! S( T6 a+ [% g$ c7 [$ C5 W6 t; L( {7 O4 k
; \- t% X! {8 w' X; ]) K
5 C2 U8 g# W; {8 S8 \
' g! ^. u/ I; u2 `
" W, e$ @) h: a / _; @1 \. F6 W: g
|
STM8CubeMX不能生成代码