
SPI Example 1 本例展示了如何实现2个SPI之间的在全双工(full-duplex)模式下通信,通过NSS软件管理,实现了由主向从,接着又从向主发送数据。 在本例程中,设置SPI1和SPI2为8bit数据帧,9Mbit/s传输速率。 在第一阶段,由主SPI1把SPI1_Buffer_Tx发送到SPI2,由从SPI2把SPI2_Buffer_Tx发送到SPI1。传输完成后,通过比较判断传输是否正确。) q' {" E; k2 x: w8 A) l1 [ ; k& ~9 k3 \: Z$ G$ V: l 由于NSS管脚由软件管理,因此,可以在不改变硬件配置的情况下使SPI1由主变从,而SPI2由从变主。在第二阶段,由从SPI1把SPI1_Buffer_Tx发送到SPI2,由主SPI2把SPI2_Buffer_Tx发送到SPI1。传输完成后,通过比较判断传输是否正确。$ m7 `1 g- l: \ N& y( \4 p, `0 Y 3 L0 J) y' P4 q) D0 v! Q% H7 P 在EKSTM32F上,如果以上4个传输都正确,则亮起LED1(LD5),否则亮起LED2(LD4)。, O/ t7 p3 ^/ T$ `+ Z: t * I2 M# i, A V+ P# u, g. i. G d, L1 e SPI Example 2$ h) P$ `, c9 Y% M! C) d/ o# Y. O 本例展示了如何实现2个SPI之间的在单工(simplex)模式下通信,通过在主端使用TxE中断,从端使用RxNE中断,实现把数据由主向从发送。 在本例程中,设置SPI1和SPI2为8bit数据帧,9Mbit/s传输速率,设置SPI1为主发送端,SPI2为从接收端。授权SPI1的发送缓存为空中断(Tx buffer empty interrupt)和SPI2的接收缓存非空中断(buffer not empty interrupt)。 5 j& e0 J! W! A! n- R& V1 _7 H* I 传输开始,在每一个SPI1的TxE中断中,程序把SPI1_Buffer_Tx的数据发送出去,在SPI2的RxNE中断中把数据存放在SPI2_Buffer_Rx。 传输完成后,通过比较判断传输是否正确。如果正确,则亮起LED1(LD5),否则亮起LED2(LD4)。 ' b- p: c. |9 i1 D$ N* S, d SPI Example 3 ( X) c5 J( X* Q+ E. w4 p 本例展示了如何实现2个SPI之间的在全双工(full-duplex)模式下通信,在完成主端从端之间的数据交换后,再传送CRC(Cyclic redundancy check)的值。 在本例程中,设置SPI1和SPI2为16bit数据帧,4.5Mbit/s传输速率,设置SPI1为主发送端,SPI2为从接收端,并打开两端的CRC计算功能。 6 f) \5 }. X2 S; G* ~ 传送程序为:首先由从SPI2从SPI2_Buffer_Tx向主SPI1发送数据,再由主SPI1从SPI1_Buffer_Tx向从SPI2发送数据,然后检查2边的RxNE旗位看是否成功接收到数据。重复直到全部数据发送完成。在2端传输最后一个字的时候,打开2端的CRC传送。在高速通讯中,用户应当精简这部分代码。SPI1和SPI2接收到的CRC值分别存放在CRC1_Value 和CRC2_Value中。4 i# q, j8 e7 | Z& W" b / }" ^: A) a* x3 L$ z% Y! w 最后通过比较判断传输是否正确。如果正确,则亮起LED1(LD5),否则亮起LED2(LD4)。 SPI Example 45 Z$ t! Q$ o' H5 V6 \ e 本例展示了如何实现2个SPI之间的在单工(simplex)模式下通信,主发送端使用polling模式,从接收端使用DMA接收模式,实现把数据由主向从发送。% y8 |& |" E& i, C6 b 在本例程中,设置SPI1和SPI2为8bit数据帧,18Mbit/s传输速率,设置SPI2为主发送端,SPI1为从接收端。设置DMA通道2可由SPI1的Rx请求激活,并把SPI1接收收据传送到SPI1_Buffer_Rx。SPI1和SPI2都设置为双向模式,但主SPI2仅作为发送端,从SPI1仅作为接收端。两端的NSS都由硬件管理。打开SPI2的SS出口可以设置SPI2为主,SPI1为从。 传输开始,每接收到一个数据,SPI1的RxNE请求会激活DMA通道2把SPI1接收收据传送到SPI1_Buffer_Rx。重复知道传输完成。5 i4 i, P+ _9 ^/ ~1 H 最后通过比较判断传输是否正确。如果正确,则亮起LED1(LD5),否则亮起LED2(LD4)。) F0 }1 V7 P( Y3 {: J& d SPI Example 5 本例展示了如何使用SPI固件函数库和相关的SPI Flash驱动来实现与M25P64 FLASH的通信。 & X3 H; ?1 J( K+ f$ R 第一步是读取SPI Flash ID,并把它和预设的ID进行核对,如果匹配则置PC.06为1,否则置PC.07为高。9 X7 m; ], J6 b1 p6 t7 o 7 M/ z1 { G/ t4 J) c1 k 然后,利用驱动程序对目标区域进行擦除,把“main.c”中定义的缓存Tx_Buffer写入,然后再读出,读出的数据存入缓存Rx_Buffer。比较两块缓存判断整个操作正确与否,判断结果放在变量“TransferStatus1”。 之后,对目标区域再进行擦除,检查之前写入数据的区域,判断擦除是否彻底。然后读出所有数据,检查是否为0xFF,0xFF表示这一位数据是经过擦除的。检查结果放在变量“TransferStatus2”中。& B$ w9 @! i# o2 S9 s 设置SPI1为主,8bit字长。设置管脚SPI1_NSS为push-pull输出,用来驱动SPI FLASH片选管脚。 ( W/ q4 o2 \" L6 m( ` 文件“main.c”中定义的FLASH_WriteAddress和FLASH_ReadAddress表示程序开始写和读操作的地址。# {) n: H D7 x v' E$ y & c0 }" u- Q1 q 设置系统时钟为72 MHz,SPI1波特率为18 Mbit/s。 3 F, M. A9 Z# s1 U2 ~3 R 在EKSTM32F上,由于没有安装SPI FLASH,本例无法在不添加相应硬件的情况下运行。& W) ~0 i; x5 D; p: s4 o; T B ; s8 q; @% F- Z5 T3 X" S9 E) N1 [ SysTick Example 1 本例展示了如何设置Cortex-M3的系统定时器SysTick来产生以1毫秒为周期的事项。设置系统时钟为72MHz,SysTick的时钟由AHB时钟提供,为其值HCLK除以8(HCLK/8)。9 q! d8 l, g* F5 L. U 利用SysTick计数器为零事项(SysTick end-of-count event)来实现函数“Delay”。间隔在此函数中定义的时间,改变输出管脚PC.06 – PC. 09的状态,使与他们相连的4个LED闪耀。9 @0 M7 \0 \( g, t4 n; `& R% u N% R; Y3 D 在EKSTM32F,上,改PC.06 – PC.09为PC.04 – PC.07。: ]7 n( {- q' Z' Z$ \2 [ X; r * I% v$ }) E8 E; r% [9 T+ L& _" @7 D 出处:barboon0 [! l4 X! p# A a 0 w7 i6 u& t9 O( C1 k 相关下载: |
2008316151223349.zip
下载32.25 KB, 下载次数: 108
RE:Firmware Lib在EK_STM32F上的学习体会(SPI/SysTick)
RE:Firmware Lib在EK_STM32F上的学习体会(SPI/SysTick)
SPI Example 1 在本例程中,设置SPI1和SPI2为8bit数据帧,9Mbit/s传输速率。; S. C8 k1 \5 S1 \
SPI Example 4 在本例程中,设置SPI1和SPI2为8bit数据帧,18Mbit/s传输速率
两个例子波特率不一样,但范例全是使用 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;也即是4分频,如何得出不同的传输速率呢?
RE:Firmware Lib在EK_STM32F上的学习体会(SPI/SysTick)