|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
开源蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 外部 Flash 读写
* @7 m. b: ^8 l
) ]! [7 J" I0 K; p4 R2 b- P+ x; X# x. V5 \. i/ ^
6 M0 O( I1 b! Z" i2 g' J
" v k* X9 M: |8 r% V. Y: V2 D/ J8 R0 I+ K5 S
1 SPI+简介
7 A. t1 Z" P& b* I0 W: @; s" v" q0 X* ]% W6 G2 E
本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。5 Z5 L; X) o; h: ~) Z
. {1 ]. e' }" m- k4 C SPI(Serial Peripheral inteRFace),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。. Y6 k' R! \. W2 i: ^ J
该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。
1 F+ Q$ }7 r9 {
1 ~4 D. O! u$ a7 H 我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。
* W8 t/ L& l% s- ] 我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
7 o2 h$ i8 h. C" R1 @. ]. I" ]
2 硬件设计, Y0 e# i6 F, N! h( @7 q
1 [& C. v, I& E: ] 本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。# j* I: \# z" w x
( ?5 d1 E- x1 K/ o
( ~" ~) r3 E7 B5 k
图 1/ g' h; Q2 f- b0 W* C' T
8 }' s/ S# l9 P/ r5 H3 软件设计7 f4 x" R3 d4 V2 I, Q# Y+ A
6 _" U4 ?6 ^, N 要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。, V8 l% Q9 E! l- ~
! z" `# i' G- {' P7 i
# S+ l- u$ i* I8 e K# x
! i+ }6 y2 I' o( i; W+ O5 z
& S4 A( u9 y' v2 u; i" O+ p& t
. @0 Z- {6 q8 J$ F! k" O
在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。, o, o1 Z( |; t- F; }
5 |. a7 F" [9 O" i& U2 c( W 然后,我们要进行的是对 SPI 接口的一个初始化。( C1 O, g- ~+ x* ?5 z. o
% P7 T. C" V6 O4 F- M j7 N
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)7 } z! F) L/ ` e" `: ]0 c
第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。
( T1 O0 c E/ }3 f0 j* u 第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。6 Q: ~$ P) L4 G6 F
第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。+ w7 g/ R4 c, _ W4 R" t
第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。
+ Y, y1 I6 R/ ^6 h5 B+ ]. g7 g: Q3 a: e2 F+ ~( s, i
参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。
; X6 o ^/ Q/ P, o* G% F9 U- ? 最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。
3 ^2 Q# f# [. c0 @- ? j: E2 v# v
! U. P6 t6 U/ k. ^ 以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:% F7 o7 [, P/ [0 O* c) L0 h
int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);
3 X9 B6 B4 X( P, _ int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。
: x. b* U! k$ q( W7 E) i, O
8 ~; t* R2 m! ^) P4 实验现象
; u$ k( h$ N# a/ ?; ]! b! v; H" v: z4 y1 g% B- }
首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。% _, b: b# }2 N
" b! V8 A: x' q
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。1 q& {! w7 \1 Y4 @2 D8 I' P
6 y. M4 a0 W; _8 W (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。. P9 {& w2 O) K; O
(3)点击打开串口,4 是串口接收框。
- @8 d. t( y, Y" M% [' V7 V4 q: }7 B, h
* w# K+ b \" J, W4 B4 p4 w1 D
图 2* [ C8 r7 P5 n- t
2 I5 }# _7 w9 k/ c0 Y' u; {; q4 P0 h$ o" d; x
配置完串口之后,打开我们提供的代码。
- R& [& T" v* W+ @; J$ t0 k, @; \$ [8 @/ A9 M
(1)点击仿真按键。1 v7 [8 n1 B( U, _: t) _( G4 B
& r* u5 m) d* f% Q4 X
' t% u* \ a8 i2 L+ \% R6 N图 3) @* H6 |1 i3 J' ~4 F! a' j( n
(2)点击运行代码。/ |) p* ]% ~. T- q
, b. K& ? R( d3 a7 B+ s C
5 k1 }- P4 g- D1 A# l6 l图 49 x" f& G) ?8 p, _( O: G! f L
完成之后,就能看到串口调试助手接收框信息如下。
2 D" K% c5 f2 f3 R0 X! N( {: c% S
8 p8 ^' k# e7 a5 X* T- K* k0 Y3 ]! I
图 5, a t- `( ]5 L8 \! \! X% |4 {
5 V) Q* x8 x+ O _2 I
* _, i& q. d3 e
$ w2 p2 A. n) }9 R8 H* [4 }; ]/ k
* E4 z+ f3 m' m- J, R
文件下载请点击:
2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf
(727.79 KB, 下载次数: 0)
+ ?% E4 G9 \' v+ C3 J* f0 P
8 Q7 j4 T) a8 L X: V6 x# V# j! z; |* H& n. x
|
|