|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
开源蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 外部 Flash 读写 6 ~! g+ | `$ @" S
+ j# l5 f* l- s& f+ l
4 D# w g% z7 m) x/ j
3 s$ ?: h, V9 F. \7 e9 f
2 g! \+ r# P9 B
- f8 _8 T4 R" a, O, J; ]1 SPI+简介1 ~7 X. x* {, d: o! N) c5 Z; V
$ Y- Q5 _# T# B1 b
本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。: u1 V# C: s- x' @
* _ |& i2 D1 L0 ?. L SPI(Serial Peripheral inteRFace),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。8 I2 {7 u) H# B I: A3 Z
该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。) |/ w. I- I' y
+ D2 W" \( c0 R) K. d4 K% B- M 我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。5 t3 h4 C: ] H3 |" c0 C& o& @- I
我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。- l5 T& E6 Y$ e' y+ L8 a$ Q( r
# ]8 |1 ` l1 L) X2 硬件设计' T( `% r( ?! x4 Q7 o) u
( X) r9 o& c/ B+ Y$ d( { c 本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。" I8 j/ v6 l) G2 C7 Q& g
2 z6 [1 n. |* }2 A; ^
/ T. [" ]7 L) h: ^
图 14 h- ^1 M9 ^* q3 S$ _. b
) B4 t8 {' d2 c) P3 软件设计
: A# n' B W" P3 U1 l0 e
! _: V `) O7 ?) M 要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。
4 @ j. Y% j: r/ a! f' o; d7 }( }! h
+ _2 u5 I' G) i6 g+ j9 z5 O' c- y
; L! R0 F% [- c
/ {0 [8 U5 W' c, I4 F2 C2 _
9 o6 K% o6 t+ s6 l' `+ {$ {
! H" r& [) h7 f7 e* m& c! h) s
! V% O0 O+ X: J. C/ V6 {& o K 在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。) ?0 J1 |; g! }% j' b' t
* O( `+ e, C" z: H1 t% L. e7 d 然后,我们要进行的是对 SPI 接口的一个初始化。
) j! s/ c# v( n! G5 t( Z) j y
" P4 F! G) H8 I 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)
& O _# n! Z8 S+ H+ p- h 第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。
" y" I0 s! I. F4 \- s7 y 第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。, v& O% p2 s) |/ P
第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。2 P h. d$ m1 f6 p; g0 o
第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。
& d' {; O0 O9 F3 g
3 f" b# [! |6 p2 v7 Q0 z0 t) m: n! l* V 参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。
5 l3 s/ S/ ?( r9 G) Z3 J$ g 最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。: {' C3 `3 S( K% e
7 g$ V* T2 k/ n 以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:# \9 @: q7 y& I' J9 }
int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);$ H, m) v% J+ m% F
int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。! Z. n d$ Z3 q) ^, G
, v) D/ P$ @: L! ?) s
4 实验现象$ M( Z3 A2 p3 v+ C3 f2 M
8 d5 W. f" f1 V+ ?% ]2 p5 q* z 首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。
* ?9 n1 a1 k1 m$ r E+ J1 L- q0 s5 Y3 G, k/ n! z! L, D
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。
; C0 u/ J3 u4 z6 J2 Y
( w1 ]4 |% G3 z' @! i (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。: k% h- v4 ^1 Z, B# q. i
(3)点击打开串口,4 是串口接收框。
! a' D* Y7 V/ o' K
; g, Q/ i9 Y: B) e- t
3 I n7 P' j# I( ~2 Z图 2; P% p8 `* z; A4 |2 ?2 y% `( B
: J, M! v& f) n& V( Z% L. g0 `: t6 W* P
配置完串口之后,打开我们提供的代码。% ^0 p3 z7 Z2 I
7 Y* j: L$ f6 ]
(1)点击仿真按键。; z) E" J& U1 m4 f
) h; o/ N( W2 ^7 o" l
8 ?3 p/ N7 a' } O
图 3
$ c1 m# O- e, G$ S: k5 i (2)点击运行代码。
5 X O; G6 ]/ Q, K7 K5 t- r
( e8 q: k. W, Q8 ~! u
, T& [5 D1 j. z* V4 q! k, Q
图 4# _$ B0 m. f# b. p1 X6 ]
完成之后,就能看到串口调试助手接收框信息如下。
/ ^6 N% ]" W6 Y5 w S
S& z6 R0 m( q5 A" b6 u) N
, y2 x, y: t5 M
图 56 H0 E, a0 v9 Z) j: Z8 S4 f6 |
( e* i9 o4 e1 ~! P( A2 H$ c2 D# E2 y. B7 a
2 o- F1 ?# i. ~4 S4 a( e3 l1 m2 t( P
6 U1 ?" j% Q4 ~, t5 T! z- b文件下载请点击:
2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf
(727.79 KB, 下载次数: 0)
# R* h: t7 g; r. w8 A( o* w% K, f/ C$ Y4 A, Y; U# Q- K9 o3 m; C/ j3 @6 `9 Y
/ a- m J* c0 \8 w: v |
|