|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
开源蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 外部 Flash 读写 y1 P1 U$ ^! G
, d7 a G, p7 E) n' ]4 q+ d( O+ ?- p2 d
) v- d7 \5 v& }1 N+ m0 W
6 ~% R/ n1 Z7 J; J3 u6 p0 ]
" W H4 F. u, n: D% u6 d1 SPI+简介
9 A# k) V* _8 T: R% ^' ]2 h% n2 ^! d: j, x; q$ \- ^
本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。3 K0 h! F) J0 U# T! U# v! T) u
) }2 S1 a" P; R( b9 N
SPI(Serial Peripheral inteRFace),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。
4 h5 e0 Z! X- B) y2 ?" R 该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。% y7 _5 _8 g2 }) \1 q0 R
0 n0 v- W9 @' q8 Y- J k+ M6 w 我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。( G- B$ v) `' T
我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
! t, B4 o( ]1 S
0 l( y7 V* G- [) o2 硬件设计
& \/ f" }+ W: G) t k" e( p3 c1 H* t
本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。0 c% S; r4 [) L, l7 n
: C( M% R% |" |2 h( m R
. L& ^1 J" ^- `图 1; E1 T V6 N0 P2 s
6 b, q8 V3 G1 ~# }2 e6 _1 n) _3 软件设计
- t& E1 i8 v/ ]0 ]
8 Y' a- Y1 w. q G2 X+ Z3 U 要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。
. t% e. z1 e, f* s6 q
; D9 R# r: U x8 X' V, D; _; K; r6 B! B; U, i. }- Q- X6 N; N
% q7 b7 z8 |' T: m
' s) N( b+ W0 u! ?3 ]) h" p3 O: d5 s0 r' X* {8 A6 V
' G# f0 t0 v3 Q+ e9 F
在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。6 _* U. J4 P/ a, o! }: k
% M' _2 p: U* e 然后,我们要进行的是对 SPI 接口的一个初始化。6 k/ @, h) G! K( V9 f
! V5 Y5 C" c( H% U, v' h2 C% V 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)0 N8 u; Y" b) G. Y' ~$ s5 n" N0 f$ O
第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。
; M( }4 e `7 R o8 \' \8 r 第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。/ ]( X8 c/ A, ~2 S3 z7 D
第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。
& e& A/ N: ~7 z; j: B; ^, k 第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。5 D" m1 F+ r) A" P
0 V) ?# l: Y" u( J. I
参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。* C3 R9 w' ]/ J |
最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。
% w; ?8 U- t9 T8 B M$ a0 N% }2 T
以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:
/ g+ A5 m1 T6 C, { int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);
7 _7 d+ ?- j) B int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。
" G% ?, _% p3 @$ x+ J/ ~% a J6 }( _7 z, e
4 实验现象
( M1 Q, s* @' q3 W7 `" n/ N% l P$ `
首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。5 r- r; m/ c+ Q2 w! e- X" B& V
; [( O' Q- N2 `3 K6 F8 J
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。
3 P3 g+ U5 D% p# t6 G5 Z8 i8 ~7 x" z+ D. |
(2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。. S& Q h6 y7 N' G Z1 ^2 Y; T
(3)点击打开串口,4 是串口接收框。
7 ?* Z- `; p1 c1 Y4 E5 `( Y _1 A- t8 c( m+ `9 d
7 n8 n& O, n8 U% C' z8 ]
图 2
! n& W$ y8 j) V, _; O
0 P) r( ~% V3 J" s
: o, W* g L- Y+ ?: W. j' D 配置完串口之后,打开我们提供的代码。
1 q5 H5 v2 R$ I! [9 y1 T- Z4 o% W
(1)点击仿真按键。, e2 P0 y$ Y" f2 T* H
9 {; ?; D4 U7 ]& q1 `, ]0 D" O
) A1 N, q9 M, m2 |5 c6 }: i图 3( B5 y, |3 J1 K% l3 p, R
(2)点击运行代码。4 I1 B( u7 `; f# Q
4 Q) n0 O3 d F1 T) R
" F/ C; _* L9 ` |9 D% U
图 4
, G: h3 W0 Q" c# O9 i+ N 完成之后,就能看到串口调试助手接收框信息如下。
- f9 U# \$ R J0 [. s8 P- |3 u( P
2 p1 @3 u. X1 [: y) _8 W
图 5
9 ]/ X* ~4 o2 j
1 C% M: {; S1 h" a7 n4 T' Q9 h) ^1 Q7 N8 s" z
9 b) Y) W H/ |9 ?* A' l9 f4 o# S
6 _2 w4 w* L( m) e0 O. v
h# \7 ?4 c0 `; p# o! D# s文件下载请点击:
2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf
(727.79 KB, 下载次数: 0)
- }) w8 D( M+ y# I; N
/ H3 `5 ^) c% y: w
. h5 J1 y& S! s9 g# m |
|