|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
开源蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 外部 Flash 读写
* X3 R( z) }2 |/ r0 z0 ?% d) ]. Y Q* B5 V
' o8 O4 K9 @# z: g+ ~
: e/ e/ T4 R% |9 w6 l
- ^7 A5 O) V4 ?$ }* Z, y- m) p( [* f1 X' \2 I( s$ x! U
1 SPI+简介# j" c; L {8 b# }4 Z" d
2 G( p3 c/ K0 U+ U0 c }$ P
本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。& B: A/ v9 p; ]7 \5 B7 V( u
; ]2 i4 N" E6 Y1 i SPI(Serial Peripheral inteRFace),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。
6 D% g9 J+ P# S& S 该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。
! m# V& w( J1 k B! h' R, X% E" {- Y3 ?" h; v) j
我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。
, ^2 V: p/ V9 H5 K5 x 我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。! o: @* @5 a( |; H$ e7 }
5 ~5 {$ Z0 b0 V; v. B9 b6 v2 硬件设计. a* c) k3 x" l/ U* G
6 J9 B- B/ q9 G9 G8 b" E6 K 本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。8 v) w# h8 [" P6 ]$ M1 c' }+ a
3 `9 [+ U, C/ Y; l* W0 ? T
1 r0 l' w' s: d( x7 Q
图 15 H3 d* |6 Z3 \9 @8 @! h
" p% F0 h; T; t' c. C3 软件设计! Q; a$ O8 B, Q. Q4 _
/ ^9 D( V1 X R8 _4 K" A8 o
要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。. G& @/ o" l8 a0 X! _1 P) w5 N
) d: |! \& m4 D6 M k6 v
) |: g! Y/ v. m; _; [" ~
% N5 v1 ~+ P0 i. A6 L# |& x8 B* n; [9 }# v
6 D! {* v) q# L3 ^
在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。+ V5 J. P5 u7 `! H% C, W. R
- ] X$ z5 c* A- m8 c7 d$ o 然后,我们要进行的是对 SPI 接口的一个初始化。
; J" y7 p7 Q) @
7 y6 W! ~! T) _ 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)/ y$ F" P9 p0 U0 ~ Q
第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。4 a% b1 [. w# E Z2 [- j
第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。
' @" k+ k7 V; D& n+ D4 ^, q 第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。5 E# t+ d& h5 ?& | N# U1 j
第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。
1 l% T: d' }# D5 _
! d0 \' \7 m% `; g( ^+ h' }$ W 参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。6 i2 U/ h8 W4 \; ~4 ]8 Q7 [
最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。
# Q% N K% ^' d8 d5 ^+ r& o, @1 g* @; {. R! Q3 F$ u6 D
以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:' X% ^ }' @( ~+ Q* Q, W
int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);
& F# f4 b' M+ c+ ` int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。
8 `, M$ c2 v8 r7 G2 b7 B* Q. H0 S( r$ W. K* B- [% ~, v' \2 U) r
4 实验现象" Q- C, G/ y \4 r7 V# H
" l2 q) X1 o. a4 p, I
首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。
4 z0 E( f. w a l8 p3 l: L0 C# K' n6 Y* B, D$ P6 ]8 ~* o; w5 \) A7 P
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。& b" }# z% d$ Y9 [% j& w
3 F. v7 }% V! e7 T, y' l4 [ (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。& D1 E0 m9 ~ b
(3)点击打开串口,4 是串口接收框。( B& V* L$ G9 c; D
3 i# H9 Y* E. A3 i' k% q4 b6 e
8 W# r* Y% l& h' \; V8 l4 v C: w图 2
! u! Y1 n8 y) ] g' [! i3 [1 q( O& T$ Q; v/ P, {7 S
0 @" h6 `! w# T Z+ w& E+ I7 P( K5 { 配置完串口之后,打开我们提供的代码。 g7 @2 L. ~( g5 P( g
9 ]& x! i% u$ G$ |9 U2 x' |0 [ (1)点击仿真按键。* }( T5 l" K6 @3 D/ W0 D, L
& @/ p9 q% e1 w' F$ ~
8 G8 q/ m# O1 t- ~* t
图 38 z7 s/ }& l2 _" F4 u' D
(2)点击运行代码。
0 L1 r1 C$ u2 q) c! L/ A0 C" v: G
, F$ o- V, _/ R9 t0 V
* ?; W K/ R5 m: g( U) U
图 4
; B1 g$ \- K9 ^" v/ b& g 完成之后,就能看到串口调试助手接收框信息如下。
j3 H; f6 B& ?
$ n% M: N8 w7 M" y4 ^
( W* a; B. I: V- ? P2 H+ H
图 5
# t* x* K4 r6 ?; m
) K1 K, D: N2 w/ i: Z" D% ]# A; s: i9 t2 Q& H$ F
& a ` \# x6 q/ g( E8 X
; T" e* K9 W$ S) d4 R文件下载请点击:
2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf
(727.79 KB, 下载次数: 0)
1 X. V8 O8 u- {- L' I
+ H' w8 J' h# {; M" N) `9 X
" |5 ^" ^/ ^* p: }0 I0 [) o |
|