你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Firmware Lib在EK_STM32F上的学习体会(SPI/SysTick)

[复制链接]
qazwsx-19104 发布时间:2008-9-3 19:19
SPI Example 1
  I# M' K+ c, @* v' m9 H. [6 E# [* W/ M; G' K8 ~
本例展示了如何实现2个SPI之间的在全双工(full-duplex)模式下通信,通过NSS软件管理,实现了由主向从,接着又从向主发送数据。; p  ^$ l  G# R2 x7 E; D

# M+ a& R- ^) T在本例程中,设置SPI1和SPI2为8bit数据帧,9Mbit/s传输速率。! m; P( o0 w+ `: Y2 }. i
在第一阶段,由主SPI1把SPI1_Buffer_Tx发送到SPI2,由从SPI2把SPI2_Buffer_Tx发送到SPI1。传输完成后,通过比较判断传输是否正确。' z7 B0 M( \/ E: ~1 o
$ k: k' y  Z" G* l5 o8 E- U3 X
由于NSS管脚由软件管理,因此,可以在不改变硬件配置的情况下使SPI1由主变从,而SPI2由从变主。在第二阶段,由从SPI1把SPI1_Buffer_Tx发送到SPI2,由主SPI2把SPI2_Buffer_Tx发送到SPI1。传输完成后,通过比较判断传输是否正确。
# v3 K# c% Y9 ]/ H: \. c7 r2 w7 C  _  U% G; ~' C6 t4 t' Z9 a
在EKSTM32F上,如果以上4个传输都正确,则亮起LED1(LD5),否则亮起LED2(LD4)。
3 a, U" `* M! R0 _) m/ C* Y% X
7 o% G6 q  L- ?SPI Example 2/ h3 x6 q: T5 ^
) n+ i& Q4 D" B( v( b/ I0 F
本例展示了如何实现2个SPI之间的在单工(simplex)模式下通信,通过在主端使用TxE中断,从端使用RxNE中断,实现把数据由主向从发送。
' t& Z% B- N  p1 i/ l" q1 _: m  H7 U& I
在本例程中,设置SPI1和SPI2为8bit数据帧,9Mbit/s传输速率,设置SPI1为主发送端,SPI2为从接收端。授权SPI1的发送缓存为空中断(Tx buffer empty interrupt)和SPI2的接收缓存非空中断(buffer not empty interrupt)。
  E. X* S' l2 H! q5 t7 ]+ s2 E2 c  N; ~" ?4 P
传输开始,在每一个SPI1的TxE中断中,程序把SPI1_Buffer_Tx的数据发送出去,在SPI2的RxNE中断中把数据存放在SPI2_Buffer_Rx。# ?9 z1 J! h, `& V/ R0 d. U. ]# L

3 q. ^$ ?3 p+ |7 `! l传输完成后,通过比较判断传输是否正确。如果正确,则亮起LED1(LD5),否则亮起LED2(LD4)。
  z; w* |7 v( z
0 R  P# H  e% e$ ASPI Example 33 l" x" l* V# T( x8 ]

! L* S. @/ g" J1 v# J! Y本例展示了如何实现2个SPI之间的在全双工(full-duplex)模式下通信,在完成主端从端之间的数据交换后,再传送CRC(Cyclic redundancy check)的值。
8 q/ B9 ^6 E) T8 `6 T
3 p4 ]- e" W2 ?+ y4 ?在本例程中,设置SPI1和SPI2为16bit数据帧,4.5Mbit/s传输速率,设置SPI1为主发送端,SPI2为从接收端,并打开两端的CRC计算功能。
# C( s8 C+ `( V+ g- ?) |1 A; E* k5 X6 j
传送程序为:首先由从SPI2从SPI2_Buffer_Tx向主SPI1发送数据,再由主SPI1从SPI1_Buffer_Tx向从SPI2发送数据,然后检查2边的RxNE旗位看是否成功接收到数据。重复直到全部数据发送完成。在2端传输最后一个字的时候,打开2端的CRC传送。在高速通讯中,用户应当精简这部分代码。SPI1和SPI2接收到的CRC值分别存放在CRC1_Value% H- Y2 f. v# Q5 [
和CRC2_Value中。# ^0 K; ]0 p: `: R

- ^* l( R" u" \最后通过比较判断传输是否正确。如果正确,则亮起LED1(LD5),否则亮起LED2(LD4)。
- x7 k1 x2 d& f5 O! H! m. I1 G! D  _0 h8 W/ {7 x! {# [, m7 Z; e
SPI Example 4
6 I: b; T; m" \3 R# {% ^/ P9 q9 h) W% h- `) l
本例展示了如何实现2个SPI之间的在单工(simplex)模式下通信,主发送端使用polling模式,从接收端使用DMA接收模式,实现把数据由主向从发送。
8 l' c# y  m! {
9 r  K& G$ X# y+ e( ?  x在本例程中,设置SPI1和SPI2为8bit数据帧,18Mbit/s传输速率,设置SPI2为主发送端,SPI1为从接收端。设置DMA通道2可由SPI1的Rx请求激活,并把SPI1接收收据传送到SPI1_Buffer_Rx。SPI1和SPI2都设置为双向模式,但主SPI2仅作为发送端,从SPI1仅作为接收端。两端的NSS都由硬件管理。打开SPI2的SS出口可以设置SPI2为主,SPI1为从。
* p( m, ]: I" g4 b( [1 e+ S3 W( _( _/ d6 q) I) M6 T8 w8 G
传输开始,每接收到一个数据,SPI1的RxNE请求会激活DMA通道2把SPI1接收收据传送到SPI1_Buffer_Rx。重复知道传输完成。: r6 k+ u" }9 V+ Z5 I

8 @% E7 x/ H: N% q最后通过比较判断传输是否正确。如果正确,则亮起LED1(LD5),否则亮起LED2(LD4)。7 a' {" f4 x& x( b
1 i; @: d5 y- c0 N* c7 Z& e# W
SPI Example 5
; ^: c6 _, F( `2 R0 L# Z: s- z" o  H; a5 o) M: ~. l
本例展示了如何使用SPI固件函数库和相关的SPI Flash驱动来实现与M25P64 FLASH的通信。
5 Z. ?" c1 e  {5 Q* g9 t
& w9 U  h; Q1 ~  y, P第一步是读取SPI Flash ID,并把它和预设的ID进行核对,如果匹配则置PC.06为1,否则置PC.07为高。! i6 `# y  G% r

, r, Q  X; H  ]) @  f然后,利用驱动程序对目标区域进行擦除,把“main.c”中定义的缓存Tx_Buffer写入,然后再读出,读出的数据存入缓存Rx_Buffer。比较两块缓存判断整个操作正确与否,判断结果放在变量“TransferStatus1”。$ \; H6 P: h6 U2 s) t
# {8 x( }  \; p- p
之后,对目标区域再进行擦除,检查之前写入数据的区域,判断擦除是否彻底。然后读出所有数据,检查是否为0xFF,0xFF表示这一位数据是经过擦除的。检查结果放在变量“TransferStatus2”中。
6 C+ @/ z) I+ \+ I+ K2 }* i* p- G: A! ~" Z, i7 s8 ~( z: E
设置SPI1为主,8bit字长。设置管脚SPI1_NSS为push-pull输出,用来驱动SPI FLASH片选管脚。0 }1 }. Z' K4 H
" L9 ^, Q+ B) b- y
文件“main.c”中定义的FLASH_WriteAddress和FLASH_ReadAddress表示程序开始写和读操作的地址。& G' @, w. H2 Z

% ?5 L  }' C/ j  F( _" Y+ f设置系统时钟为72 MHz,SPI1波特率为18 Mbit/s。
, x/ {8 p' l6 J) I7 j# `9 R1 N, [4 l7 ^2 G2 q0 G" E
在EKSTM32F上,由于没有安装SPI FLASH,本例无法在不添加相应硬件的情况下运行。
$ x+ q, Q: m* N0 j7 B5 P# E1 H$ }% B7 `" ~/ f
SysTick Example 11 l  O' F2 j; ]4 N3 `/ r
本例展示了如何设置Cortex-M3的系统定时器SysTick来产生以1毫秒为周期的事项。设置系统时钟为72MHz,SysTick的时钟由AHB时钟提供,为其值HCLK除以8(HCLK/8)。
! U  Z8 D) M+ I) g3 w/ T: H" B5 v# z5 S& ]
利用SysTick计数器为零事项(SysTick end-of-count event)来实现函数“Delay”。间隔在此函数中定义的时间,改变输出管脚PC.06 – PC. 09的状态,使与他们相连的4个LED闪耀。
& `  y* p6 J( a) D# R1 O4 |& Z  Y2 y3 N% s3 R, ?* u% }% k0 g0 N
在EKSTM32F,上,改PC.06 – PC.09为PC.04 – PC.07。+ z* \) W; v1 G1 @) W

- l1 z4 v) b5 O. l出处:barboon2 D! }* _% ]! Q  A$ w) [/ k$ V8 V

9 Y) V" r2 r' E' D6 V9 u) q相关下载:  

2008316151223349.zip

下载

32.25 KB, 下载次数: 108

收藏 评论3 发布时间:2008-9-3 19:19

举报

3个回答
LOOKWAY 回答时间:2009-5-20 09:52:54

RE:Firmware Lib在EK_STM32F上的学习体会(SPI/SysTick)

OK
stwuyiyu 回答时间:2010-4-27 18:15:57

RE:Firmware Lib在EK_STM32F上的学习体会(SPI/SysTick)

请问一下:0 O; G, U; M/ I2 W3 i) T
SPI Example 1 在本例程中,设置SPI1和SPI2为8bit数据帧,9Mbit/s传输速率。3 ^, n) _' u' [
SPI Example 4 在本例程中,设置SPI1和SPI2为8bit数据帧,18Mbit/s传输速率
6 p: ^2 j% B+ @5 }; z6 T. p两个例子波特率不一样,但范例全是使用  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;也即是4分频,如何得出不同的传输速率呢?
lucky-92214 回答时间:2010-5-3 00:20:43

RE:Firmware Lib在EK_STM32F上的学习体会(SPI/SysTick)

有空看看,谢谢!

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版