|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
开源蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 外部 Flash 读写
q0 j( G: Q/ P0 E, o2 f# ]$ a& V! p- l5 q3 k
0 U) z" [4 A& x2 l+ m9 ]0 S
$ |4 }% P$ F- V- ^+ N# @- K' O: L* c5 C) D
: |6 w/ E: W( n5 }1 SPI+简介
1 r! {5 g$ c2 s( [- }8 \
! x2 |" S) n6 W6 h9 n3 l5 b 本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。; t/ j- Q8 r: w& _8 C% h8 N
1 J* A* S& w& Y% f0 t& T# N SPI(Serial Peripheral inteRFace),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。
! q4 e9 k; [. f 该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。' v" W7 r9 s: L9 S: J9 }- o7 x
5 M9 t8 [; e | 我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。8 j( J# z- @ K8 @/ V( ~
我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
1 e4 d( ?9 v) n) }, g
* E" n& x- `+ g7 p$ ?2 硬件设计
! R; Z8 o/ \9 t9 s
Y4 n$ @$ m2 Z* O( q 本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。
' i# D+ z5 t2 @9 v9 O
! n% }" @5 z" G! q: X
! ~: }6 O/ ~9 `: |
图 1. v; D0 R- l# M. U
% T; e6 @5 V4 v6 z. T# l) N- M8 w3 软件设计% ]" q8 v( }5 P" e; O8 O
7 a' Q* F& g6 A; r. A1 _- }6 _: w7 s 要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。
! L0 Q6 @/ v8 M X& H1 }5 j, \; C
, m( F$ X; u3 [
) W# L# I+ L! U; D# b: d
) L8 ?: T7 [' d$ i) \
H! o' g. W2 n- {( v2 p# i0 Z
& p; E! o' Y V" G8 c" C+ W! N 在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。: A+ L/ l. M0 w8 L$ j t) B/ p7 J
+ a( {- J) _, ]& G 然后,我们要进行的是对 SPI 接口的一个初始化。* }& v: w; B4 v7 N3 L
' Z: W0 J$ A/ D# h2 s; m3 Z
void spi_init(SPI_Pad_t *cs_pad_param, SPI_Word_Mode_t bitmode, SPI_Role_t role, SPI_Polarity_Mode_t clk_pol, SPI_PHA_Mode_t pha_mode, SPI_MINT_Mode_t irq, SPI_XTAL_Freq_t freq)
4 [4 p* Z6 z# y1 U2 N% O, X% m k# K 第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。
! i+ n6 w$ I4 o/ h 第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。' n7 ~! m0 F- K
第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。: }6 G; e2 k4 H/ e- M. m
第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。
' O# n( F8 p& o% a( y- z
( x; j! A* p, C6 H& T" e- m8 L 参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。, t$ k9 I- U7 E& m
最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。
{. j7 i& U- Q) n! Z# U
7 r$ Y+ W( t" e 以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:
# c: y. K" ]. Z7 Q int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);
# f9 l$ `# b. t" a! I6 s* ] int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。+ \' Q* M B' E5 E: o
- Z! k' t' E m( e# e- f; m8 g& u
4 实验现象0 I' T% @7 }* S) Q1 I& a
: {' z- F' Y4 N+ q 首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。% L9 Y! Q) \4 Y+ o# h$ @6 _. W
9 D( e* Q& ], n4 T
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。% K1 d+ p! n3 ?8 d# T# w. R
, R8 _/ r: H/ I4 m1 z2 C (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。- f4 y9 M K( ^; v& C9 L6 e; ]
(3)点击打开串口,4 是串口接收框。8 ?7 ^/ v- ^6 k% e( d' Z0 G1 s+ f/ o' ]
6 P! ^! s F' l% Z; R
- t4 h6 P! i& g3 [
图 21 \" r# [* y8 |1 \$ @! m- Y
1 h2 z/ ~: c" d3 d% {% U; D1 ?( b( r& k+ t3 B3 h
配置完串口之后,打开我们提供的代码。
$ I" m0 H P3 _( E( {" ?; S$ ?% n- d
! q6 m+ l/ ?( y2 i# k$ c1 p7 s (1)点击仿真按键。" a& M' n1 G6 K- t9 ?
2 J: X4 a3 Z, _& \' k e1 p! g
" Q. G% k+ u: t
图 3
6 A9 J5 K' n5 [; z" _ (2)点击运行代码。
) z9 H. S9 v9 K Q: u# J7 ?
; E4 b' T, M! j- \0 k
5 o% v+ v. Z& w图 4
8 y# q; [- x' }/ s. U M5 x' {1 a' R8 K 完成之后,就能看到串口调试助手接收框信息如下。1 _* w( |/ N1 |; E+ Q9 A
; j1 c" z2 Z- h- G
7 B. h$ v R+ o+ z图 5
: G8 L) n# e2 o) l8 u# P! q: y5 W1 \( P) ]3 e1 L3 W
; c+ \4 B# r5 m
: w, ~% G8 k D
9 D! M- q, }4 S) d+ N文件下载请点击:
2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf
(727.79 KB, 下载次数: 0)
0 Y, h7 ~/ i5 G2 w* A4 h
$ x G" O9 y8 [6 }( n" o* o+ Q( H$ m, f; V) b
|
|