EDA365电子论坛网

标题: 【开发教程7】ARM功能手机-SPI教程 [打印本页]

作者: FutureX    时间: 2022-6-18 19:21
标题: 【开发教程7】ARM功能手机-SPI教程
SPI教程
——疯壳·开发板系列

2 N0 J/ N  h. j6 u+ Z& T& h& V3 K* H5 r6 K2 O; v* z9 @
     3 U3 o4 h$ p; c3 ?
    图1; X$ g1 E0 P/ D$ M& V6 J# \

9 {) i$ _# I. c" \- y0 h/ ?- {; u) R, \  o
    第一节SPI Flash硬件电路2 e  E, A' K8 y) h: t  J
& u1 U0 o% e  z- X
    SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的MCU引脚分别为:P00,P03,P05,P06,如下图所示:1 T" l/ m) h! `& Y

! g) c+ H! [/ _. X3 N    " o' t: v2 C) F4 N* E! `2 H0 R3 Z
    图2
$ T% p; S7 V9 n& I' Y- i: X) L( l- L( f+ O1 i  e
8 K: d! z, r! B+ }9 W3 i% |0 h

( N5 P3 y* h1 ^/ h' \1 `$ M    第二节 SPI+寄存器. j5 Z0 T3 ]$ Z* p& V" I! G

" `# C6 d5 }- k) H- V. ~* `& V) }    2.1 SPI+介绍- s& D: e  O* J$ w, e
% o* b$ V4 ?* f7 |0 T/ r& h# ~9 P
    这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。$ ?  X9 c9 W( f9 N; t" d# y
    该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。- O$ l# B# Q* w2 D7 n

% b  P. N( d. n+ ~" R# L% F    2.2 寄存器介绍6 i+ E8 I2 ^/ K$ P0 N
    2.2.1 SPI控制寄存器0$ U% ?4 b7 A$ n/ C1 `% T! X; X1 f

0 ^* T' K: [& `
8 B7 o% u' j1 e! J, R     1 t! B  p- }# H9 P  p! i
    图3  g# J( i" \# O
    15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
% e. F" @0 Q& g* D/ I    14位:SPI中断使能位,’0’表示无效,’1’表示有效;" v/ p7 H) ?7 d7 ?/ y7 ~3 u
    13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;  l) n/ C  ~2 p, a/ _
    12位:返回SPI_DI引脚的状态值;
' R# U$ g1 G/ M    11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;2 K7 v1 O9 |0 N$ m
    10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;
# |% L) A8 E$ D1 _& i8 e    9位:‘0’正常操作,‘1’复位SPI;
4 `9 f# Y  Z9 g) y" F& P$ {) H: L& e    8:7位:SPI数据格式;
5 C/ i% U. S) J& s2 \7 D    6位:SPI工作模式,‘0’为主设备,‘1’为从设备;
# o. G  a& P: m2 A    5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
# M9 P+ }$ O0 M    4:3位:SPI在主模式下的时钟频率选择;
' H. s3 r/ S% r    2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;3 _" y; U9 c% G2 \- g
    1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)% I$ p1 Y2 P7 h- U# W" N
    0位:SPI的开关。3 O6 m. k, X+ L% l
; p$ g. c7 G0 o( |6 K1 i
    2.2.2 SPI接收/发送寄存器0' `2 G- K; x: v4 h2 H  ]3 l
: ~$ g! X% z- m3 l6 R" p" [
   
) x$ n, H  }8 g# k0 g- B    图4+ |% e4 ^: o0 n. [: j0 b
    15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。/ o1 m+ M5 m( ]/ ]- Q

$ X# ^. J& ~& l" @1 ]    2.2.3 SPI接收/发送寄存器1
! w6 |6 ^+ r. w3 j1 Q1 R( k2 E) F
   
: F1 `' f1 P# d5 }" [5 x" q    图5
! W3 Z# x. S8 O    15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。
: k$ p* ?( c: A- \5 ^; d) x" }. @) p- _3 c# s5 E6 T& y  R5 \
    2.2.4 SPI清除中断寄存器
8 P  {; w2 I) C" u
$ E9 u% w, d* G    
" j! _8 h8 p- w' e* H% m! q    图6, l  A8 w2 t7 }2 R* ~+ U
    15:0位:写任意值到该寄存器清除SPI的中断标志。% H& A9 r& Q5 J
5 i) U8 |4 N8 r$ E
    2.2.5 SPI控制寄存器1
1 W% U; |: H" x. s4 [( Q. K
1 p/ M) g6 D& X6 B% a & X8 ]6 F3 ]3 g$ y5 u, u$ F& a  F
  
) x. P: X2 a' U    图79 J( |. ]7 O8 }
    15:5位:保留不使用;
, E5 C; |' P; i1 \# V; l    4位:决定在9位模式下的第一位的值;  R6 x  Y8 f( @  g% v9 l
    3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;, _4 F6 z& h* U9 q# t) w
    2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;
$ c! a, z0 V! U* n1 U+ K; _- Q6 A    1:0位:SPI_FIFO模式。
% j$ x7 f: m( N6 P$ y8 p" P  A7 F0 Y% e+ V
    2.3 寄存器配置讲解
1 J* G. g- z. O5 _7 w4 Y& k/ t    #define CLK_PER_REG                (* ( volatile uint16*)0x50000004)4 Z3 S$ k: l( ?' O3 ^
    #define SPI_CTRL_REG                (* ( volatile uint16*)0x50001200)
& _+ O  Y" n0 J. R    #define SPI_RX_TX_REG0              (* ( volatile uint16*)0x50001202). u2 m' \8 v/ K  R+ F3 p- N
    #define SPI_RX_TX_REG1              (* ( volatile uint16*)0x50001204)
8 L2 I; H! J9 [" u. M4 F9 w2 W    #define SPI_CLEAR_INT_REG           (* ( volatile uint16*)0x50001206)8 \4 X+ s1 A* |4 b# Y# W( w
    #define SPI_CTRL_REG1               (* ( volatile uint16*)0x50001208)4 P4 w. \6 U0 D5 P, D
    启动SPI模块的时钟:CLK_PER_REG |= 0x0800;
; t/ \+ z! o& m/ L* U! u    SPI的初始化配置寄存器:
# A7 A) X5 G) i9 G    先关闭SPI, SPI_CTRL_REG =0x8000;
. \4 R4 w; l- A  i    SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;! q3 Q) q6 n6 A
    开SPI, SPI_CTRL_REG | =0x0001;
2 K; d  `! n( A/ ~6 C    发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);
: v  C* B2 E# P' `# M    接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;
9 U/ J/ Y1 T# d
6 m# J2 M7 r7 S, I
( y* W$ I3 Q# \0 Y; z8 N: Z
2 h; l6 w8 \. Z  L$ @5 h    第三节 SPI实验
4 i* ]: m# C8 p3 s+ O" L2 g# q0 H- _/ W
    实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。8 F# w; s1 Z' F# m% w6 J
    使用USB转串模块连接手机蓝牙串口,连接方式如下:
+ j0 z1 J" y( l+ ?# b; |- Z        (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
5 z( ^1 Z. ~% R; p0 }' x+ \! |( K4 K4 {5 S) Y" m* n
   / B: o0 ^  l6 N& X
    图8
+ \7 D3 l+ f. y5 l" U, s5 G) `1 p+ c    (2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:
1 B& _3 ]+ u- i6 k2 W! t/ V. |9 _4 A" ~9 T
     
$ G- s6 ?3 |! X8 x: I9 _# ?    图9
5 E. K; Q2 O$ r/ y    使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:$ y: h0 n! F8 \# c
    (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
4 _5 Z' m3 ?- v0 q0 }5 |' H9 ~4 {4 \; W6 E, }9 B
   " x# k5 h) A1 x% p+ e
    图10. S/ ^3 S, q3 Q/ P
    (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
) `; ^: r' V! s$ {. q' |' Q- ^0 ]# c0 T8 k: q; h/ n
   7 H! v" t9 Z4 @$ F- s; [/ X2 y4 r
    图11% x7 S& M8 v: `* S" _; t! ^1 t
    将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。8 N: A4 E; q- ?2 T7 ^
    SPI实验的Keil工程为spi_flash.uvproj,位于目录:
6 c+ c$ u" r! Y    ..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:; x/ c& [2 Y" q$ s2 g" _; p
. D9 y2 a, e; A  [& n2 N
     ( e4 j9 x3 T) l* l" j3 Z
    图12
6 l0 L; ~7 S+ c$ A! t2 I8 U    打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:
$ _2 u, H( R8 M
" ?% A) T! f( I1 E: Y4 y & K- j1 U" [7 |' f

5 [3 A, i6 G+ D: H% R, ] + S8 T; p% O4 [4 ^5 J
" A6 {4 s, N9 R8 D- f& {6 ~
   
/ D( E. J% r* f( Z    图13, f" g& Z8 B' ?+ f2 D' x: {% T

! F+ Q/ @+ L" k
2 |, w9 o  X# M! \; m! }1 J  }  ^
9 Z" i- |: j+ u- F; [0 I8 v. n    配套资料:http://www.fengke.club
2 q  O' V: }* V5 I6 @6 z/ `    套件地址:http://shop115904315.taobao.com/- V7 M9 ]  e0 R5 q2 h' J, |( e
    文件下载请点击: SPI教程.pdf (1.03 MB, 下载次数: 0) + k2 g1 P1 U$ ~
7 @; U2 ^) @3 [5 \% N

作者: peerless2021    时间: 2022-6-24 10:03
在学校做过这种,嵌入式控制的感觉很有意思




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2