|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
开源蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 外部 Flash 读写 1 p4 A3 j. T6 [8 @8 o+ ]
5 Z* I }' \' S) g" W& j6 |! y7 B7 n! n7 h. g! A! G- M
! g9 ~4 z- w' X. t
% N I" T* G5 E( y0 o( D" |. e. S7 ]
1 SPI+简介/ R9 N+ z; I2 @: n* r/ b
, K& C) [! b9 i' D 本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。2 s# d, V+ y7 k( H5 n
7 m3 ^: I" Z) a. z! |1 d6 C
SPI(Serial Peripheral inteRFace),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。
; P, f* l8 U! K9 x( \ 该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。
& ^5 i2 @1 I0 c M7 l4 ~0 b1 q: V! Y+ A5 j, R; Q
我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。- @( G. T, c& n) ~
我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
# d, w3 J( [, P4 J1 x2 E
/ n3 G0 r9 x, x4 W4 V2 硬件设计
3 u; ^3 }3 ^$ ~& ?2 u8 |8 Z, H' m7 k9 ^; S# V9 d
本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。- y, E* J- l) Z7 F- ^( b
9 Y7 O5 F$ q1 e+ k5 K
; X2 _1 N' g+ C2 x; A$ w
图 1. w7 g" i6 Z3 n# _$ I
& ?/ z! o5 g- o0 f& C" Y3 软件设计
( |0 ?: |; n1 l$ Q- N
- _# |) B2 _2 y* S$ [! T 要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。, D, k( V6 t$ T/ O6 t/ F
( U- J! {6 C& c+ h- H6 S3 Q1 i' F. k+ n8 U8 _$ G7 G! Z
* \% D* S( Q. p% w
5 W6 S! u7 t+ P' v8 Q6 _4 H& K, g
. Y/ H) R$ ]5 E- j& z0 w' D4 J) d- N8 M# d+ |- M, R! F
在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。
8 F* v, X0 y% y
9 @1 C5 s! F" l$ `6 E2 t 然后,我们要进行的是对 SPI 接口的一个初始化。
/ N6 S# N) W- ]+ ^; S" j3 O {9 j# K5 _ m1 Q
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): r# \6 i3 ]6 e7 k; _
第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。
: M" E$ `6 p; t! a 第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。
5 i! e" Y/ x2 v- X( H" v( V* M* ?/ j 第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。* k# } _% i4 {0 K' J, W8 s R% W
第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。! A( f3 V" R& z; g: b& g7 \; L: ?
% Q% O2 N* _6 e) D R1 w- H( i
参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。
5 ?# x' i! A/ Q3 @% [ 最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。
S% k& p% T! r0 ?3 {: G1 _3 Z+ s& t! e2 J5 R# v
以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:) r4 f% h/ @6 S2 L5 d% \6 e
int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);' R7 G( y: z% D0 S
int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。
$ e1 Z- x0 v0 j" P* n4 @1 {! m9 G! k* _& O; l& n- b+ A
4 实验现象
5 b' r+ k+ W* v" S( Z6 T
$ E- n, S5 v) V S4 [' S 首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。
; R# r; f2 n+ l0 m& y3 y& p3 s5 Z& m
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。
/ W( k) g! V" G1 l4 z4 B
- r$ U8 ?% k) I Z1 l (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。
' h/ h% H/ P% _ (3)点击打开串口,4 是串口接收框。
2 t' g/ i! F! N1 l: V; i! C6 a' P p: P. ~' J/ v* M
! ]( C* `- ]3 F
图 2
! s. z7 n7 }8 x5 Z6 N: n" J% d, q1 u: c/ M; c# ]# ]5 q
- K* P8 ]5 [6 g) ~: r
配置完串口之后,打开我们提供的代码。
* e9 k8 k9 P d; A+ T! c$ S. P# g( r* F& N% s
(1)点击仿真按键。
" \: O( | ]' M2 h3 `9 g1 l; U* }' G! L) K+ \
& z! R& V, m* L
图 37 ~9 p; a* @5 e( y4 n
(2)点击运行代码。# V1 ? z. O) j( b. y
6 G R* a3 l. B: |2 }; j; d
( @- s# B7 `% @" U0 I图 4
" Y; i+ |* u L/ I2 W 完成之后,就能看到串口调试助手接收框信息如下。
* h5 T4 ~- X& F: e9 i/ ~/ g: _8 T6 f1 S* a/ V4 ?. V" @9 O- w
' l' R, u# e# u, _# j0 o9 U7 F图 5
& ?1 |- m2 P4 Y8 i3 y& c- ]
5 [1 }, W- q/ \+ D& L! C' y3 Y! W
0 K( ~+ ]& q/ l" e3 ]0 W+ i( p# `5 ~6 v. b# w6 z
T$ {& Z/ @4 j文件下载请点击:
2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf
(727.79 KB, 下载次数: 0)
& x1 p9 n& t9 {
$ S0 n9 @& v% a" m6 ]
# c+ {& V+ l) ]8 j1 B% f' ? |
|