EDA365电子论坛网

标题: 【开发教程4】疯壳·开源蓝牙心率防水运动手环-外部 Flash 读写 [打印本页]

作者: FutureX    时间: 2022-7-25 14:20
标题: 【开发教程4】疯壳·开源蓝牙心率防水运动手环-外部 Flash 读写
开源蓝牙心率防水运动手环
——疯壳·智能穿戴开发系列
外部 Flash 读写

$ d7 F6 t7 U: E. T% C
, h) [' y# X4 u$ z+ w: v+ Z) C
; I1 j$ k0 o- S5 i" V/ q. |9 K
, h0 R3 E# m0 \" ]
# [: b. H, O. A+ B! U& x( ~: T2 D. v# e$ @- v
1  SPI+简介
; ~! G+ m9 a( J# j# Y& \
' M$ U# }; u  z# d; H; }' O3 x) {2 ?  本节中,我们将使用 DA14580 自带的 SPI+来进行对外部 Flash 的读写操作。
/ E3 h) Z7 h9 _3 P" h4 g! v
+ [* a0 K' a* g6 f. n  SPI(Serial Peripheral interface),串行外围设备接口,是是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间。! n- S* k0 X' K: q7 `% }
  该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 NSS。
/ W! {, A  o$ x7 m. x$ w$ S: o. \$ w. A# g7 y# J; u* d% K+ c/ n
  我们 DA14580 的这个 SPI+接口支持 SPI 总线的一个子集。这个串行接口在主/从模式可以发送和接受 8、16 或 32 位,并且在主模式可以发送 9 位。SPI+接口有双向的 2*16 位字的 FIFO,功能得到了增强。
8 H# Y! I* \( @' ^  我们这个接口可以工作在主或从模式;有 8、9、16、32 位的操作方式;SPI 控制器的时钟达到 16MHz,SPI 时钟源可以通过编程进行 1、2、4、8 分频;SPI 的时钟线达到 8MHz;支持 SPI 的 0、1、2、3 四种工作模式;SPI——DO 的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
3 Y$ X  W" t6 U6 D; C  Z: J5 c  U. o% d. z, ^) x
2  硬件设计
7 }* M) T# M: P' |- j$ O4 _* t4 `5 u! E
  本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。+ ?6 Z5 d3 L* p5 q; o: O$ ]' C) q) p
( q2 _: J$ g6 I3 V5 \) t
! X! X3 G4 O* Q, r+ \' ^7 ?* W
图 1
7 v  w$ h$ f% J) \( ^" s# s8 z/ n9 J8 _
3  软件设计8 k' s/ [# m1 X; j; ?

7 L9 \4 o8 U+ A# L9 z# K. U; I0 e  要通过 SPI 进行对外部 Flash 的读写操作,我们首先是进行相关时钟引脚的配置,也就是下面的函数 periph_init()。
$ n& w" P, ]8 v
4 V; i7 @" M, e+ u% A1 I, N, j$ }3 {0 e+ y+ u* N1 W7 \7 [; j

. [- E7 W) V4 n; M
4 j( {' A3 E3 b; l
. e( F5 H0 l5 z- k6 r, b, ~5 q" p; K& q' e
  在 periph_init()中,我们完成了 SPI,uart2 的管脚配置,以及对串口 2 进行初始化。
! p# s+ B* w0 d. H- {* `( y- N  m" f& p+ i
  然后,我们要进行的是对 SPI 接口的一个初始化。. r$ D* J1 z! I6 y6 D+ A
  g* `5 b5 O1 `- }- d1 L  w
  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)
/ p+ l+ R+ g& \# \8 @+ G: P  第一个参数 cs_pad_param 是分配给 SPI CS 信号的端口管脚,我们这里用的是 0.3 脚。
$ ~3 C8 Q5 G* j6 n+ F( m' a  第二个参数bitmode 是 SPI 操作的位数,有 8.9.16.32 位操作模式,我们这里用的 8 位,所以填写 SPI_MODE_8BIT。- s+ ~& ?; A1 y: i; Y. _
  第三个参数 role 是用来配置我们 SPI 的工作方式,我们这里用的是主 SPI,因此选择 SPI_ROLE_MASTER。9 B0 g+ u& p% P1 N2 s" Y
  第 四 个 参 数 clk_pol 是 用 来 选 择 SPI 时 钟 空 闲 极 性 , 我 们 用 的 是SPI_CLK_IDLE_POL_LOW,表示串行同步时钟的空闲状态为低电平。4 y0 R& i& Q/ X, A; T  E

7 m9 s/ i: f3 C+ K1 E  参数 pha_mode 是选择 SPI 的采样边沿,我们这里选的是 SPI_PHA_MODE_0。1 o6 |& ^* b3 c9 }- A6 U
  最后两个参数 irq 和 freq 分别是用来配置 SPI 中断和时钟分频。我们选择SPI_MINT_DISABLE 和 SPI_XTAL_DIV_8。
+ L8 K- f8 X  q5 |% a  B" J' C# i, w4 B+ O' v; E" T) y. q/ R
  以上是我们对 SPI 的初始化设置,当然,大家也可以根据自己的需求进行配置。对 SPI 初始化设置完成之后,我们就可以开始读写外部 Flash 了,通过调用:0 o, a  w# m3 z# t9 E. }5 {
  int32_t spi_flash_write_data (uint8_t *wr_data_ptr, uint32_t address, uint32_t size);: J# i0 _" U2 u2 n3 T
  int32_t spi_flash_read_data (uint8_t *rd_data_ptr, uint32_t address, uint32_tsize)。
3 p* A2 t$ _! K2 _* d
5 F8 k5 ^& C8 c- s( n/ N4  实验现象
/ z/ {) J1 L2 `8 A4 g
4 w  e7 V: n8 j3 p" T. g9 X  首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。
$ k$ Y2 C. T) l" n: u9 b. q/ L
  (1)选择串口号,我们图中是 COM1,这个根据实际情况选择。5 G+ K( }3 p5 ~& l: c% n: y1 f

9 N, ~; y6 G# N& P  (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。
  h# u" \2 K6 r7 D$ [1 o: U  (3)点击打开串口,4 是串口接收框。
7 e& n+ G) o* _+ a0 |# t) ~! j" U( d* g
        2 T' L4 ^( k# ]0 @0 f. @
图 2
6 a6 }' K( F) M/ ~9 g% i- _# u2 C8 C/ p' s" Z$ u
! H' \" I  k( }6 j5 _  l. ^
  配置完串口之后,打开我们提供的代码。" d; b" L0 B' s& Y$ Q

0 \2 g! Q4 x8 r  O  (1)点击仿真按键。, Z* E' Z1 ]; g$ ?% G
# z! G: {3 k& P: I$ Q$ ^/ R

2 x3 c9 M9 L# L/ ~% ]2 `! L7 I图 3) J# ?$ V5 C3 g5 B5 u
  (2)点击运行代码。
0 X1 Z1 r, y8 r3 h6 \" g2 c$ ^3 M; X) G: |0 Q4 h1 E0 X* j" v

6 Y  s3 ]6 ^. P/ H: F  g% ]图 4+ J$ F) J- a: ]1 A5 d( o  X
  完成之后,就能看到串口调试助手接收框信息如下。9 V% L1 O( t. J5 _7 \) P. d. i
; \$ ^4 Y8 f# A

, o. q' x. C5 S0 _& V( v# ?图 5# [# U( R5 ]: K$ P6 K6 K2 l

" ~* _" x3 m0 e# Y% L7 {4 [, t; ~% B% S8 k) J, P

1 G6 H  X0 e! P( ?, B
8 p1 q4 E: h9 L$ E: [: M/ L
2 ~# e3 q8 w. W! @4 ~/ `6 G文件下载请点击: 2_(100%开源)蓝牙心率防水运动手环_外部Flash读写.pdf (727.79 KB, 下载次数: 0) - P$ V3 y* x6 A

. D& j7 r! f) ]+ }* g9 m5 S2 h" R9 f7 y" r# C4 g. F1 M





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2