3 k7 w0 j: }6 a
测试STM8L050 SPI输出测试6 r& f' J7 ^3 C& M# P$ @* }/ s
; E4 }4 D( R1 }1 J* \
一、端口配置: I( P& e! k& }+ }9 N/ E( E
' V( X4 l$ Z5 g& l2 {; p 使用STM8CubeMX来查看SPI需要的引脚
( j# Y# f' g5 M
! v1 l$ F! B' L1 ` H7 m) z$ [
2 ~9 J# r8 q* ^2 j* S# P. e
二、程序部分
6 H) |# j* O1 h: U3 V. ~, K+ l , Z' I8 K9 `1 ~1 c
2.1、SPI程序
" ]+ ?9 w, H# b6 G9 U2 b- //spi.c
; y- w: |" w+ ~( @7 ^ - #include "stm8l15x.h"
6 z! h; i/ Y( F: E! R6 \ - - |# a8 B1 x0 a: ~7 }
- void SPI_FLASH_Init(void)
! b) O# \. p+ A - { . d/ \* x* v u& }
- GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); //SPI_MOSI
9 i$ D$ L }5 s: b2 @) F7 H - GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); //SPI_MISO
E0 x5 a: h+ G* H - GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); //SPI_SCK
# u1 @& I- B3 W _ - ( M M/ B; S- ~5 }/ m& n4 Q
- CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);# I: d: U" V, N, V* \
- + n4 g, |9 ^) h" t5 v
- SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_4, SPI_Mode_Master,\
" \9 {/ a U7 J# {8 Y' F - SPI_CPOL_High, SPI_CPHA_2Edge, \
3 I# U2 q! Q' {( T* n8 E- W+ \ - SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);6 O& p, ^! X6 I
-
8 m. j: r+ d* G) C) K1 E, p6 N9 u - SPI_Cmd(SPI1, ENABLE); /* 使能SPI */
+ }8 |0 X* F( R+ ?7 @ v3 p - , z7 ^$ k- O. q% C1 m" l9 @8 `
- /* 配置CS管脚 */
! H' A* n3 e% P {3 Q' T - // GPIO_Init(SPI_CS , SPI_Pin_CS, GPIO_Mode_Out_PP_High_Fast);
( `) k' D- R4 ~; Z% p9 r - // GPIO_WriteBit(SPI_CS, SPI_Pin_CS, SET); /* 拉高不使能外部SPI设备 */
5 D" h3 K% Q: s4 T
- p% k. ~/ B: C5 Z+ t7 [- }' J5 M% K. P7 E1 r
- " T5 v. ^9 M! [- ^4 Y6 ?
+ n$ D# A6 R8 U0 U/ X7 H% e4 q- uint8_t SPI_FLASH_SendByte(u8 byte). I* m" N; i6 F
- {7 Q# d$ \! O! w! L
- /* Loop while DR register in not emplty */
0 u% s( \6 @: K4 x - while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);' B2 S) B+ }, G9 W
- /* Send byte through the SPI1 peripheral */
( ^- i8 J# z7 `/ Z: b; {! Y - SPI_SendData(SPI1, byte);
+ Q, \8 B; q+ p4 [5 Y& `/ z) `; a - /* Wait to receive a byte */
1 }1 i2 \- e! k/ \7 ~ - while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);1 }2 d; O7 S) a; t; c
- /* Return the byte read from the SPI bus */
. }! n) J& f* r) X0 Q - return SPI_ReceiveData(SPI1); / f' a2 k8 \2 w! C( |, c+ A
- }/ B6 ]& j# t" p9 n
- //spi.h, y5 e2 c5 w$ h; R& B, d% r
- #ifndef __SPI_H0 W0 W) X1 @5 w/ \+ t
- #define __SPI_H6 _5 h# D* P3 X* Q4 ~" L! k, g9 Q
- # R3 L4 l5 v! k! N! O7 S) r- M% B
- void SPI_FLASH_Init(void);3 S4 X: v% ~0 }- I
- uint8_t SPI_FLASH_SendByte(u8 byte);8 R7 z0 [$ |1 ~6 a; ?9 o, h
- ' d8 x0 w* H# D( q
- #endif , K; z; H4 K( X4 X1 G) |6 t9 a
复制代码 " A: D1 H d: C" @
2.2、主程序
s0 |! [5 i/ D" a- void main(void)
, Q" S& w0 r$ j5 M. d3 Q/ C8 C - {
7 N! d6 X- ]) Y! x& f. m) o
3 ], a# Q( g0 I; q- CLK_Config(); //时钟初始化
3 {3 g! ?4 B9 {5 d/ H3 b+ R -
# l# R6 u+ k/ I% D) b - Delay(0x2fffff); //延时5S
. n8 F( m X! R, ~ -
% D F! C) ?5 F$ p% t+ {1 i1 Y. M - //led_init(); //led初始化
' D8 [2 P. E/ L% n% {& W0 m0 T - //swim_init();
0 B! g' }7 i/ `1 w1 i, H - uart_init_halfduplex();3 r$ A3 b! n* ?" n
- + p/ u G3 W. T1 F
- SPI_FLASH_Init();: g$ J% m- i% J! `+ N0 a( X
- 7 R0 k; Z6 {1 b: f
- while (1)
3 f4 P0 f M- ? - {
: _* x+ z0 a6 T: B3 }# G - ! I/ W' k3 M% g5 p& c
- SPI_FLASH_SendByte(0x55);
J4 u p& P' H4 Z; h) [8 Z - Delay(0xffff); a" x6 K" g$ o' p4 X
- }
; W( S3 o7 p/ O; g1 F1 k - }
复制代码
! ]! r# {/ m3 i 三、执行结果
; {' {' x q0 I, x5 L6 N }. C: d) v7 E6 M" r
: V5 k/ d8 S0 @! C 手头上没有SPI通信的器件,使用示波器测试下,SPI_SCK和SPI_MOSI波形:* O% f, g) [1 K" e6 v
黄色:SPI_SCK
$ a- |2 w- @/ l& e) K9 A 绿色:SPI_MOSI+ m8 H1 ?8 B0 h% m9 P, _
SPI发送的数据是0x557 P& I0 v" @5 o) y
( f# v! ]$ U& _ }1 Q D* g% Y6 A% G0 k9 F
9 I* D# [0 z* D% r% g5 n5 c/ u
q- x: M8 x4 I0 C6 o& P; f, b! M& ~. d$ B1 e- g
9 f) P) ?5 u/ j7 |
, n( Z3 G6 Q+ @! w9 ^. u3 @7 l2 N6 k6 Z
; z3 F3 y# u# j; U9 ^
( i4 L) T2 @7 W5 E
; _) x4 e9 s, M( y$ i3 p0 w+ f8 M6 b
4 a+ S) B4 \! `4 f6 D
- z6 D$ H9 y' f7 _* E2 @
+ H( x+ Z, W' z v/ j( l
" `: }* C( B$ Y! H. @9 H) b# }# ^! U( a y! a: G# A/ Y
5 Z& O$ X& {) N& b/ a
$ O P8 ~) j/ m. q4 Z9 ]
; x1 D' G' s n2 C, {# {( D3 c* E% r0 n
% h) z3 K8 b" _2 U" x |
STM8CubeMX不能生成代码