|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
开源蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 外部 Flash 读写 * @/ ?$ u i7 g1 i+ H) J4 [
8 w, d2 }$ J H6 p2 n5 l' y& z* Z& v9 w2 C6 h% _, F
) v& a$ o# l: Q$ @3 F; O$ ~! L. M
" c- n! T. X# N) c& l# H) z% m! a* t5 P" H3 d
1 SPI+简介- D' p2 h# Z* i7 P
: @- c6 T. o% [6 ]. K1 O
本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。
3 S1 }) l2 O; c l1 y) b' _" s& E2 T t/ v/ }. N
SPI(Serial Peripheral inteRFace),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。
: M* X4 D- `/ m v$ Z5 q 该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。5 }! D% H1 J; z
, \& |; {( U H" ~! h+ l2 g
我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。1 F- O1 v5 t3 w& [ F% U2 M' a
我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
% C8 `5 D; E( z" B5 O. J4 }5 v$ S/ y& Q
2 硬件设计# j* \: ?3 Y' `9 R; v1 u! R* U
r- K6 \) b; c+ U3 v& O9 w 本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。8 H: X$ c4 H) `. J8 B: B8 m; s
# T# G5 _: A# `6 n( Q
f" g# }, `. k3 C% v8 H' N& p
图 13 t# G3 o8 i9 m* L
- @# p. E. o8 p( I
3 软件设计
2 K+ p' q( }- Z b6 R3 k4 C
& C/ X+ ]" N& E3 q& q7 n* ?4 t" |- I3 T 要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。
6 F4 x6 W, ?0 w2 n/ `+ q0 {7 \
6 a9 K3 [8 r6 W5 K+ K/ G
9 D* J- B: N9 _. V" r
' {9 p" R. s( e$ v$ ^
' p) ?* }- K$ i
. i) N7 R6 V- z3 z# a
" P% h& ~; `* ~$ O& O! C5 } 在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。! B' C0 R. q/ p* c7 r. \) B
: }; h! x8 s* Q' m 然后,我们要进行的是对 SPI 接口的一个初始化。
* F2 |9 L1 h& I3 R5 b1 B( M7 O9 M9 v' a8 X q* N% J4 D- Z8 L9 R
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)
. W- T2 W9 q2 m( p0 C1 u 第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。# P) d0 y9 e" f) q0 s7 I& e; a* R
第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。+ |+ V0 Q" q7 l9 K& @9 q+ X% D h
第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。
^; U. V, J# E, k9 q* h 第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。
! m* `2 B: y, a9 V2 H, c3 {9 C, y8 Q
) _- Y7 r6 y {1 d0 Y; I. B4 Q 参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。) ` G2 U J$ h, P+ ~9 A
最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。
! G: g2 `+ B! ^& ^. e- f3 L( V( F5 V: \4 e" [+ r6 Z
以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:
2 Z( G# Q' \" q int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);
' O$ D( G( e T% | int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。% ~: G \3 q# p4 U
2 j% L, _! P0 P* H( J
4 实验现象" E# M, Q) ^7 D4 M' v9 T
3 u% W: }* |; J) J$ c- ^ S
首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。2 g" q- R) {/ t7 @/ J) V* [
. X4 W* Q" S- z( e! D ]5 K3 p
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。
" V# m5 X5 Y u4 B+ F1 L( j& P# A2 y2 w1 v/ X* s$ ?
(2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。
/ V5 C+ ]( g4 s& I4 o (3)点击打开串口,4 是串口接收框。
}: q( n( M& q2 z4 d( K3 F0 ~: _% K8 d; {, L
K+ x# r' ?: o* H& E3 t
图 27 k# x' j; j9 T- k6 D- b
" L0 ^3 R6 ^9 W
: |6 L8 g4 @- ?, I. B0 D6 T& } 配置完串口之后,打开我们提供的代码。
! x6 Y2 @: U. o/ l# [# d! b; N7 v, u7 I5 u B. @* ~. Z3 n
(1)点击仿真按键。
, W1 @# W; _5 l8 s4 a( T8 z/ q1 J& I" m( L
1 b- ^" u. N. ]8 c* v! [- S* G图 3
R# P0 ]9 D% ?4 j5 k (2)点击运行代码。( Z3 Z! @5 n' K
/ h+ q4 T4 g, F) c
. @0 Q0 F" t% O0 f) \' G
图 4( X- v i% ^: F- N: Z
完成之后,就能看到串口调试助手接收框信息如下。
' O" a4 d' g& o- V, L
" S- X: H- O1 b; n$ a1 @$ c
& w4 d3 i! z2 r8 }1 ~图 5* A; t& n: t- Q" W1 Y$ s
$ o( R+ E& R$ f; k5 C. p
- R0 L* j( s, o
; F2 u% z& m8 {; Z V
/ n7 @1 j- T$ `! Y: b Q
' ^# d; b+ Z' u5 X2 ~: X, c: a文件下载请点击:
2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf
(727.79 KB, 下载次数: 0)
- b5 [/ z" W4 R1 c/ @5 @% Z0 Q g
" Q0 h& H! F5 N# U* U8 W; Q( O
. J$ u& z- O( r; M |
|