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

072RB-Nucleo上手之SPI

[复制链接]
woshilee 发布时间:2014-12-16 19:36
本帖最后由 woshilee 于 2014-12-16 19:55 编辑
+ `) |3 j8 q) s- o  f* m2 W; z5 d$ n! v# m: C/ v& G% G4 }
M0的SPI终于调通了,玩儿M3,M4多了现在玩M0就有了固定的思维模式,老路走不通的话就要找它们之间的不同之处了贴上程序吧
, `1 m( X5 r0 [$ L% Z$ d#include "stm32f0xx.h"
# q) x  M! @0 J, P#include "stdio.h". p5 ~7 Y* [5 ~* s
uint8_t         getbyte=0;/ j" {8 Q1 e" y( h) B# A$ G+ m0 i1 C
/**$ X% k$ @# B3 D# ]# b. `
  * @brief  Delay+ ?! d) A) W  y
  * @param  None7 V  |# }0 t) H6 a
  * @retval None
  C- i9 l; u& _' k3 a' t( v  */: _+ ]9 w4 _, _' w. z: t4 a
void delay1ms(unsigned int ms)! s! f% s0 [7 P+ f& P& P  g# J
{! Z9 Z( U# q0 w( [; ^% d: [
    unsigned int i,j;
) j' z8 }0 v( y$ J* l. c$ S    for(i=0; i<ms; i++)
% {3 }6 ?2 \/ u" z$ M/ ?+ q        for(j=0; j<100; j++);
2 `& `9 o& }- Y/ h6 [/ y}
0 \* x8 c3 b8 I: r+ M+ s  c
: `& f4 K9 E% G6 b  p8 `/**1 @# ]" d4 |4 F' N3 u3 E- t
  * @brief  GPIO Config
: f3 j- i# ?1 S- e2 ?  * @param  None
6 U- m6 L( [$ |  * @retval None% f3 q4 r' F# J6 K
  */
5 {  u+ U8 Y$ H9 D. T3 xvoid GPIO_Configuration(void)
7 ]6 o$ _6 _) ^9 J{
0 f3 \* Z5 S8 y- c# E! {5 G    GPIO_InitTypeDef        GPIO_InitStructure;! f5 [6 R3 f# d' ^. N
+ D3 U! a1 o% d3 Q6 \9 Y
    /* Configure  PA5£¬PA7 in output nopull mode */+ G8 {$ S: c  J  D4 |
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;/ M$ S( k8 k# H% @
          GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;6 s& m3 T- S1 B/ @: l* \5 r, G( v2 d
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& J) d, f- O" L: ]2 I          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
# n  j0 o/ s' G7 c          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;8 x, c9 v/ |: t# z4 N1 D% N+ U8 \1 ?6 ^
    GPIO_Init(GPIOA, &GPIO_InitStructure);  c5 j; X( P0 S0 b2 @) G. j

# k" o* @6 q6 p* |% W           
2 Z+ z5 C9 V5 z- G    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
/ p! _& }, T0 D% G$ c0 j//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
: o* z8 S! ^% K; R% K/ _    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;. U' N) ^2 u5 @& t  M/ F; f# l
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍ츴ÓÃÊä³ö/ j* J2 G, M$ X! K! s
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
% d5 J( U& G" _" v% E. ~" ?0 g    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//Ðü¿Õ»òÉÏÀ­ÊäÈë# j' v+ O$ }5 T+ G9 N# e0 `- v
    GPIO_Init(GPIOA, &GPIO_InitStructure);2 z( {3 r, ]: Q9 k: Q9 m6 d' F
0 K/ p( J6 ~7 {) J* F: x! z
4 n/ I% G0 _- `9 B- |1 p, w
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource4, GPIO_AF_0);
: B' F) r, B4 r9 i" Q    GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_0);, {) e. q! S8 F
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6, GPIO_AF_0);
6 g3 Q) O  j" {8 c! X2 W  P    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7, GPIO_AF_0);
$ P% |; h3 o' M$ t# x) m1 b}. v, d; g. P# `- T6 z' H* _( B
void RCC_Configuration(void)) B2 e; ^: E' @
{3 w" \& P5 B  Q- I% E( p' p
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
) }) M9 d, r% W- U2 P4 ~    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
; E6 b4 ?* i7 h. x, b}
' m' L9 Z9 ^* ^" k! y# k" k# {void SPI_Configuration(void)
3 G- F# A( l+ @* @7 X0 l{
' R: D6 b$ H9 Z6 U. C+ |    SPI_InitTypeDef SPI_InitStructure;6 H! |. I+ n* }4 V: ^
                SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;         ; Y+ u; q4 E5 W5 W: q$ J4 r
                SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 4 K  a! z! N: B5 L* F5 W6 H
                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
$ @6 L* H$ ?2 i& _                SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
: X' i  B2 `0 d7 q* |9 H                SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   : q# Q) @3 l* R: U2 T9 q5 X
                SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
. H$ ]: q7 H. x0 v) P                SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
% V9 F/ T( c( B7 n: b) U                SPI_InitStructure.SPI_CRCPolynomial = 7;                                 5 o) }, m1 p( E$ d" N
                SPI_InitStructure.SPI_Mode = SPI_Mode_Master;* B" M6 \" z9 ^8 K
                SPI_Init(SPI1, &SPI_InitStructure);                                          
( }- G  `0 K- J! i. N                SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
. I5 ^+ s2 Y2 m7 W" y5 d7 b        ! G1 X! G9 G& \+ u8 t
                SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
9 m( g  \  }2 }8 M$ Y( L# F- i        
( }7 p( U8 u5 [- T0 S7 P0 q) W                SPI_Cmd(SPI1, ENABLE); /* SPI enable */. f- {& H! P" z& D5 @6 o5 y  V
        
1 d% v8 `- C, p, J# S}- V& b4 G: ^8 M% g( g& O- e7 G
9 i6 c6 ~/ K/ t3 I1 e' u

9 }$ j" h6 Y1 ~/ [- {. Buint8_t SPI1_ReadWriteByte(uint8_t TxData)+ Z. T0 ^7 t2 S5 q
{               
! e7 x& @8 c# d- n2 m% g        uint8_t RxData = 0;
( ^# c" ~$ W' Y  h& n! ~        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);         //µÈ´ý·¢ËÍ»º³åÇø¿Õ
3 \" P& h: e7 y$ }7 g        SPI_SendData8(SPI1, TxData);                                         //·¢Ò»¸ö×Ö½Ú
& |) r! y  ~- A8 M! H/ W! y        
4 ~; I$ h' ^! G, b0 L  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
( n, T, U) v& [0 ?1 ]' K! k/ ^        RxData = SPI_ReceiveData8(SPI1);//SPI2                                     //·µ»Ø½ÓÊÕµ½µÄÊý¾Ý*/
, W  s6 _; T* q6 M) T        return (uint8_t)RxData;                                    5 I# {  l4 ]6 K7 e
}
* \% r9 Z; P4 k% \  i# g* m" o; B) K: p( P8 W0 i
1 q' }2 i! W3 O$ m; ?' N" U
% i9 s$ v1 L+ L; p5 x) D

, ~- Q4 Y$ A7 Yint main(void)
0 Q: u1 i8 \, r( X5 T{& k" c% C6 r+ r* U3 E' v

- Q1 @- U9 @0 `+ O2 ]2 H# f4 R. _        RCC_Configuration();
: g. W" M6 z$ K3 P/ ~3 `        GPIO_Configuration();3 z' R2 Y" D4 P
        SPI_Configuration();
$ O/ V# I$ F- [1 ^- t0 i2 _% ^; K        
  S( Q7 F/ e$ G2 Y& l+ T//    NVIC_Configuration();1 y5 j; D$ I5 R4 H+ M+ z5 U
          _, v: i0 \$ w" P4 W% V

; t, B( o$ f- B; A5 u& \        while (1)" z5 W& c4 W* N) r- }* e7 _% {
        {+ G) U  p2 W3 [2 D, ^

# E7 j& j# L1 V- \          getbyte=SPI1_ReadWriteByte(0x55);0 Z0 H# d: ~; p! c1 P$ q6 i+ D1 X
                delay1ms(100);4 |4 n. y* N! Y, G: B* M8 L/ A
    }
/ K. C3 x; _& t( i9 p& c}7 f) S6 x! `$ Z! L
红色的语句在M3中是没有的,在M0中这个函数的定义如下:" v3 m" b  P9 J; @7 R* j" H* m

" c( W$ U/ E  M9 N1 r5 ]( Q" n! u5 i$ |/**
/ L; Z  G. Y5 M9 }& [- k$ ~: F  * @brief  Configures the FIFO reception threshold for the selected SPI.
% t3 C' d6 F# f( ^4 P9 A  * @param  SPIx: where x can be 1 or 2 to select the SPI peripheral.
4 x# C/ c/ {, s$ s7 b% ]  * @param  SPI_RxFIFOThreshold: specifies the FIFO reception threshold.
2 g7 Z- ^. g( ]4 a  *   This parameter can be one of the following values:
1 E" Y2 m2 w; @  *     @arg SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO $ d1 B. U, Q9 j, e2 X+ S
  *          level is greater or equal to 1/2. ; |/ D$ t# b& z$ ?
  *     @arg SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO
3 r8 i1 c1 p& O6 B9 z! q  *          level is greater or equal to 1/4. 1 ?1 ~: Y% j1 S! K8 f
  * @retval None' [3 t" [! l. L) B
  */
. w3 P! [8 J9 M( M) m1 rvoid SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold)- F5 |# q- y; d5 m/ K5 }& O6 A1 s# D
{
0 F7 X; u/ S  x  /* Check the parameters */. u4 k5 [# V; O% p
  assert_param(IS_SPI_ALL_PERIPH(SPIx));8 l3 D  s: U, t) ?/ O5 v
  assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold));. X  h$ ^1 l( |- ~

9 j4 v+ w& u' x# ?* C  /* Clear FRXTH bit */
/ E8 g  z- A& M" A0 H9 h: h! \8 a  SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRXTH);; z% ]' s2 H1 z/ [
; {# c* i7 n4 x
  /* Set new FRXTH bit value */6 _3 S; w; X8 L8 P4 ~0 ~) X2 a
  SPIx->CR2 |= SPI_RxFIFOThreshold;
  N" r, g/ o( ~}
3 ~+ u+ W* S! ]) k
' ~# Y' D' G% O* ?% ]如果不加这句话的话,肯定会卡在判断RXNE位的地方,因为没有产生这个标志,如果用延时的代替的话是可以发送出去的,但是时序就会有问题,因为发送语句执行后不是立即就完成的。希望大家注意到这一点
3 K& o0 f) z3 |' l! y
* \7 d8 B" t! Q! ]( r# l. i所有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个字节) l! {# O7 o4 @7 n/ ]: B
如果发送的是16位数据就要设置SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO   *level is greater or equal to 1/2.就是 32/2=16--》2个字节& g# H( t: p1 L( g/ J7 y, }
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& M& d7 P& M$ s; [- ?
谢谢楼主!
) ^" i' `7 d) D3 L2 h; {
我这是应该做的,跟你比就小巫见大巫啦
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版