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

072RB-Nucleo上手之SPI

[复制链接]
woshilee 发布时间:2014-12-16 19:36
本帖最后由 woshilee 于 2014-12-16 19:55 编辑 ; A7 \9 Q0 V% k4 T+ y' b- u

$ g1 r! c3 y* @) X$ I8 s% `M0的SPI终于调通了,玩儿M3,M4多了现在玩M0就有了固定的思维模式,老路走不通的话就要找它们之间的不同之处了贴上程序吧
5 l( E8 w6 s5 a/ X6 n. \#include "stm32f0xx.h"
5 P  D8 d& ~  b2 l' f, i#include "stdio.h"
8 J  s/ E2 _, t! r4 P3 C% L; auint8_t         getbyte=0;3 d  M  O, l6 K7 A$ y/ p
/**
; G, ?+ W2 ~1 Y0 q/ W3 h* K( G  * @brief  Delay0 @% Y- N9 s2 t7 g8 v$ C+ q
  * @param  None
0 D6 D2 J5 K) l6 o! O  * @retval None7 s( Y% E1 t/ \4 m; U
  */
& E7 U$ G+ G2 D/ w0 @+ X  @void delay1ms(unsigned int ms)
. H( W+ N# u2 G! y8 N{. O, f) h4 e$ M4 d/ s' B% B- U
    unsigned int i,j;: ?) [" d( D% ~: @5 `+ t
    for(i=0; i<ms; i++)+ x  G0 n3 ~4 o3 h$ r0 B
        for(j=0; j<100; j++);
7 v& m( o# K1 y* Y7 ~3 y( x+ ~& t}3 `$ P8 T4 R" f7 H+ i
. Y4 N0 R: Z  {& M$ |: P  q
/**$ F+ x6 J# [4 {6 a+ ?* u
  * @brief  GPIO Config
; N5 @$ d6 u7 {6 @, t* D0 m' L5 L; Y  * @param  None
7 L9 w4 A% Q  d4 b2 S% D  * @retval None! ~0 y- T# f( v4 j+ G# A" a
  */& }' f$ K# n! i4 u: }6 k
void GPIO_Configuration(void)- Y3 X2 H# i. p. c* |1 e
{
7 w1 Q& i& M- [% V! @+ s    GPIO_InitTypeDef        GPIO_InitStructure;
' Z4 Z. Z3 v4 }3 T8 h% C: O3 G# x; P* M# T& s, e$ b) |9 _
    /* Configure  PA5£¬PA7 in output nopull mode */9 m2 U1 ?! d1 y3 g
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
( [) T5 q$ M, }' r5 X7 O4 \          GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;! [  W. s2 s1 \$ L- R; u1 L' Y
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
. r7 j! f: l3 p          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
2 _" C( E/ L; Z% ~: x; P          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
1 d" _2 u$ x4 r  Y: |    GPIO_Init(GPIOA, &GPIO_InitStructure);
4 A) d' {' _9 d2 P; T! U
  ~8 w& S, @4 o           " @. {& G" w# H8 t- c4 m
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;* Z+ Z$ z5 Y0 i! ~1 r
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;( O; |9 h, X" \5 U+ K# _3 j/ b6 s
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
7 ?9 r" q1 [  w% y% C, S    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍ츴ÓÃÊä³ö
3 a" U2 X8 z1 ^. E    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
* |, |, o4 o2 |# @! A; o    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//Ðü¿Õ»òÉÏÀ­ÊäÈë0 B4 ~7 b3 s# x9 }+ X$ J9 n1 w
    GPIO_Init(GPIOA, &GPIO_InitStructure);
. b5 g# x% f2 C3 N  X# d, X
$ J) R8 s1 g3 o" q  y4 W8 P5 ^5 u  d7 h. b; r2 @" f
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource4, GPIO_AF_0);
8 ]& L, y( g& W* h! G    GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_0);9 ~' F* e/ J& }& m- e
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6, GPIO_AF_0);
' T( j- A  o8 d& G* f6 i5 E    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7, GPIO_AF_0);1 C2 S$ w+ }. r; s5 Q
}
+ G: Z% ?' r% I3 ?( M* ~) evoid RCC_Configuration(void)
% n' o! X, G2 c, a; D{
  G9 x3 L- X8 a* F    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
% `0 W, w. S- m    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);, U8 x' c+ Q5 X' U4 V* A+ u. ]
}. J8 ?2 f* [+ r  |1 r' g
void SPI_Configuration(void)
- |. q; q! k4 U  I$ d{
: f6 W! O) G4 O' x9 I$ z% r    SPI_InitTypeDef SPI_InitStructure;& ?, \. v' t+ \1 j& z
                SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;         
* w% U- L1 j# \8 ~. b/ J" M+ W                SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 5 x4 h4 S7 i5 l; n0 O
                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;/ C6 F' g7 l3 ~( {7 [* v0 ]$ X2 T) W
                SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
$ S% A7 x1 o; A8 l8 [                SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   
* e1 p. U6 [% L/ y- G. }                SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;- R, h, \6 Z( t# D. t# [) r/ Y
                SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
; L* e% i* d5 W. \& t                SPI_InitStructure.SPI_CRCPolynomial = 7;                                 " ?- `2 S% X, c. N5 c; O
                SPI_InitStructure.SPI_Mode = SPI_Mode_Master;8 h! k1 c! e( j9 Q1 E, [# R( h
                SPI_Init(SPI1, &SPI_InitStructure);                                          
' S  W$ U/ |8 t! q' M                SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
  P0 u1 U- q  x" c* m' Q        ' R6 w3 s8 g- s& p* F  ]
                SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);& l- E6 D' _  D$ H6 t
        $ [4 e7 f/ s8 P  j3 S# }: U
                SPI_Cmd(SPI1, ENABLE); /* SPI enable */
, h. ]4 B% u9 z0 x: G, U2 G        
. v( O5 h7 z" n# I8 ~}. b7 i) U, k% r3 t+ j  t$ `
: U0 I, ~8 m# p' i1 n7 T- _
# Y( M) t3 t/ {4 a1 V! g0 \+ A
uint8_t SPI1_ReadWriteByte(uint8_t TxData)$ H3 g4 K6 ]3 [9 p0 I5 {$ X
{                # Q) g$ U, F' |0 G7 R
        uint8_t RxData = 0;: N- }2 z" ^. v2 ~; D# w
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);         //µÈ´ý·¢ËÍ»º³åÇø¿Õ
0 H  N! g3 I. E. }$ Y$ Q        SPI_SendData8(SPI1, TxData);                                         //·¢Ò»¸ö×Ö½Ú# [2 Q  m$ x8 z, |% h# U6 p
        7 |8 V! W6 i" v+ U/ c
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
$ F1 b: H. c4 b" P) C6 n( a        RxData = SPI_ReceiveData8(SPI1);//SPI2                                     //·µ»Ø½ÓÊÕµ½µÄÊý¾Ý*/7 o( U$ O+ F1 ]5 d: U2 G" D5 f
        return (uint8_t)RxData;                                    
# b5 r( ], R& o. A0 k5 ^# v}
2 N$ w1 \4 i+ H) g; w% v2 r+ v5 h/ S' w' O+ f  |
3 a3 |; y5 k* x. w3 E
/ G) j3 }7 T0 g' ]5 t! |! j/ v

* x) ~7 x0 r$ T$ J8 ]/ k3 c# O0 Qint main(void)/ i. z% M$ f4 v2 v
{9 F/ c* W0 G; g, P3 F4 H$ z

5 R* w# k/ D& F) n1 n7 A; m  F        RCC_Configuration();0 A* h9 P/ B% J' S* K% b
        GPIO_Configuration();! a! G; u3 E. O; U
        SPI_Configuration();: F9 L3 h# U7 Y7 `. J; H7 @# b5 p; F
        
9 O1 {- K3 I" g, \1 t5 i//    NVIC_Configuration();4 T5 h" t  E7 P' R2 E! M# S
        , P8 Q" ?# w0 V$ a: G/ D2 C1 y. x

) w& t$ t% ]8 _4 b+ a        while (1)8 w6 `/ J. E" z
        {# \3 L- P9 T! I* h$ _$ k- L

  w& Z8 b6 v3 P& Y5 {          getbyte=SPI1_ReadWriteByte(0x55);* B3 I4 k4 C( r
                delay1ms(100);/ x8 i0 _# n, X+ ^/ U+ Y  K
    }. j( O) o4 z' k$ y/ h
}! z$ ^% F" F) K2 N0 H" }( H
红色的语句在M3中是没有的,在M0中这个函数的定义如下:/ s- E( x1 X$ i, t- G& O
/ {* d% P  C4 V
/**
. U; s* G5 B2 ^  g" S+ l  * @brief  Configures the FIFO reception threshold for the selected SPI.
$ u: i9 w  x" Z; G+ _! R  * @param  SPIx: where x can be 1 or 2 to select the SPI peripheral.
6 h, |+ u* c  Z, K- U/ s% y  * @param  SPI_RxFIFOThreshold: specifies the FIFO reception threshold.
6 ?% Q2 o1 m4 Q# a9 O) E  *   This parameter can be one of the following values:
  _8 o+ n( q( U6 P* Y. N  *     @arg SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO
% v1 X, C# h+ W2 g7 d5 m  *          level is greater or equal to 1/2.
. |4 z' K" G, [! R9 P. n; J  *     @arg SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO ! F# i& Q* _$ _* V6 p
  *          level is greater or equal to 1/4. - I6 V' I1 \& M0 @
  * @retval None
( b7 B- G! z6 y' `$ M  */
1 \  a) {- N/ e( @2 jvoid SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold)
6 p( {% M+ s' E* b$ S7 S{1 F/ Y* U! B6 W& q
  /* Check the parameters */( ?% B2 w; p* U4 O1 @
  assert_param(IS_SPI_ALL_PERIPH(SPIx));( M- U9 ?9 k# |! w( M/ J  q
  assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold));
4 p0 V; n8 c0 y# v0 x+ ?1 q4 A7 v+ ], q: x
  /* Clear FRXTH bit */
+ ~6 l2 a& P  @/ p& ^; J  SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRXTH);
& ~9 _& v+ }) Z  \7 s& ^+ i0 K
# J6 `! w( ~1 r+ c2 C, l  /* Set new FRXTH bit value */0 j6 o* b* O& o; t9 I5 f; k
  SPIx->CR2 |= SPI_RxFIFOThreshold;" v+ C) `5 n. |6 \% N
}
8 ]2 q- Y8 \7 W0 R; M$ L  E- U! d/ d1 [
如果不加这句话的话,肯定会卡在判断RXNE位的地方,因为没有产生这个标志,如果用延时的代替的话是可以发送出去的,但是时序就会有问题,因为发送语句执行后不是立即就完成的。希望大家注意到这一点& y6 A. C6 V, Y! m" E  ]
/ C3 L; {0 w9 z6 U& g% P
所有SPI 数据换都通过32 位的嵌入式FIFO,设置FRXTH 位。 RXFIFO 的阈值必须和对SPIx_DR 寄存器的读访问的字长对齐比如发送的是8位的数据,就要设置SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO   *level is greater or equal to 1/4. 就是32/4=8--》1个字节
+ f  Z& M9 a8 w' [如果发送的是16位数据就要设置SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO   *level is greater or equal to 1/2.就是 32/2=16--》2个字节+ U- o* W# P! u% k5 K6 f2 \
M0-SPI框图.jpg
收藏 1 评论3 发布时间:2014-12-16 19:36

举报

3个回答
沐紫 回答时间:2014-12-17 08:56:09
谢谢楼主!
子曰小玖 回答时间:2014-12-17 09:04:43
好帖子必须顶一个!
woshilee 回答时间:2014-12-17 14:35:28
沐紫 发表于 2014-12-17 08:56
8 }# t' ?+ B9 _谢谢楼主!

' W2 L2 O" X# r我这是应该做的,跟你比就小巫见大巫啦

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版