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

072RB-Nucleo上手之SPI

[复制链接]
woshilee 发布时间:2014-12-16 19:36
本帖最后由 woshilee 于 2014-12-16 19:55 编辑
1 O- e5 d, S5 y) C2 n3 u  H  P+ Q1 v. \* D% |+ }
M0的SPI终于调通了,玩儿M3,M4多了现在玩M0就有了固定的思维模式,老路走不通的话就要找它们之间的不同之处了贴上程序吧2 n: V$ g# P& H* E# ~
#include "stm32f0xx.h"
: c3 p& Y' Z$ g0 p& x: o# d#include "stdio.h"& A( c5 c$ a$ W0 J
uint8_t         getbyte=0;% t; B& S; }6 N5 |
/**
* E& R- x# [* J$ J" K& _  * @brief  Delay
4 s# n. l3 @. g9 S! e  * @param  None
( w/ V& j; i3 u6 \  * @retval None# `7 p3 s4 E. R" k
  */) x/ O- c* Q' y
void delay1ms(unsigned int ms)
9 ]: O$ V2 O- K5 V: J. l+ D{' ^$ N0 [- Y# O8 J5 K" t
    unsigned int i,j;) D! M* A1 {8 c' r/ Y
    for(i=0; i<ms; i++). J0 r$ [  p; N
        for(j=0; j<100; j++);
4 M" i& W" w+ l7 Z# V5 J; V* s}6 \3 b+ _0 B+ n" S0 V% Q& q: F

0 A  X' c' F$ p5 h: O* o/**
3 V+ a6 e9 W7 c  _  * @brief  GPIO Config
0 t: t7 q5 ?: H5 e% S  * @param  None9 g. s2 @5 w# `  g; \5 O' f  I( I
  * @retval None" e1 j; E9 O. h- X
  */9 n5 r7 g$ C  R
void GPIO_Configuration(void)
& {; r3 y" z1 x8 ?& c: }{( B* u' C$ J" c
    GPIO_InitTypeDef        GPIO_InitStructure;
2 d* K: J/ v' p4 g; f  I+ q3 w$ v5 Q4 W! `$ C1 q$ F2 N. ~
    /* Configure  PA5£¬PA7 in output nopull mode */
/ n6 Y: n" y" l# V% X% [3 v    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
- P, c: i6 m* P/ `          GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;' |8 G- m% J* {8 q
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;0 R  }* u( _: W# F
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
( A/ p4 k; b( ~( ~: c          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;" A6 p* m, B" S3 m' l
    GPIO_Init(GPIOA, &GPIO_InitStructure);0 G" x: [, C) O
1 [5 D1 U: p( a; `$ d+ T' a
           8 h$ Z' ]5 ]0 o2 m. q# W
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
) e/ o) \( B- G6 L: K7 f1 W//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
/ T! G5 Y- R% @0 t: ^    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- o9 u. l6 l2 P3 d7 L# X3 L) g    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍ츴ÓÃÊä³ö
5 ]8 ?1 j5 c6 c  z    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" m" i5 e0 ]! E& T  ^, v8 s! y
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//Ðü¿Õ»òÉÏÀ­ÊäÈë+ J0 Q& ~5 o1 u. S3 z# B! L' }6 h
    GPIO_Init(GPIOA, &GPIO_InitStructure);
0 Y. i' k. u3 S! z6 `+ D
" {1 O+ B* g* N' U5 [2 |3 N& [- T6 V7 A8 B
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource4, GPIO_AF_0);
# r- f2 j0 m* ^* d7 a* K; M% x    GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_0);
( k# G$ P" n9 A% d    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6, GPIO_AF_0);8 ~! I$ n: Y$ ~) W
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7, GPIO_AF_0);
3 W) {8 J) ^, H}
% [$ T* C; K6 t7 j' Z9 Dvoid RCC_Configuration(void)
; l) O! _$ s1 D5 u{- \/ A& ?% s9 ^2 ?  U
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);# I# j& I9 s" i" `
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
- `6 X! G2 V, u2 z. T}; @8 T) T; k: \/ B) N
void SPI_Configuration(void)
: h3 |7 [5 |* \6 Q/ w0 {( \{
: N0 |1 n" m7 F$ @! w    SPI_InitTypeDef SPI_InitStructure;1 v1 E' L: q# Q0 n
                SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;         
- D0 r8 v& S  U" I$ T                SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; / f. w* S: g$ `
                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
5 E6 K/ d( K6 }6 ~# \! N                SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
5 e. {" N& j% W+ U5 e: P4 Z                SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   
' ^* t  z7 A$ x. i4 I                SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;( t% p1 A+ O5 S+ a) J' I
                SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
4 O, l: j1 t& f% ^, R                SPI_InitStructure.SPI_CRCPolynomial = 7;                                 
5 g. W1 _# m4 l" Y" {- v                SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
* L5 M8 t9 h& d+ t  ^: Q                SPI_Init(SPI1, &SPI_InitStructure);                                          4 @4 U" }5 o% R% U
                SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
6 i* q0 H( |/ t3 q7 ?' M! R, V        $ C: O8 b/ |+ T- o5 g4 j
                SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);1 J2 k( m: Z5 g' E/ `( J8 {
        
4 O# B+ U/ p+ K& d                SPI_Cmd(SPI1, ENABLE); /* SPI enable */' s, k( s# r1 c& [+ p  W
        
: y2 J/ G* ~) P& S; ?6 h- [' o6 \}
0 g2 U# f* K  q1 T: x8 s: v8 J
! d4 H7 a) o0 E3 X- M" E( O
  y% v# a  F1 v7 ?uint8_t SPI1_ReadWriteByte(uint8_t TxData)* e  Y9 ]1 a) v  u4 J  F/ @
{               
. `9 e& c1 X& G$ I* B) {9 C        uint8_t RxData = 0;; L0 b% d7 |0 O" A% m% J) E5 C# z
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);         //µÈ´ý·¢ËÍ»º³åÇø¿Õ . l7 _* n! K. R! B
        SPI_SendData8(SPI1, TxData);                                         //·¢Ò»¸ö×Ö½Ú2 u! u4 w: B+ w; I& ]+ G
        ; c$ H1 V: y- G, Z
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);& H2 ^  d- h. e: q2 L! j' @* ~' E
        RxData = SPI_ReceiveData8(SPI1);//SPI2                                     //·µ»Ø½ÓÊÕµ½µÄÊý¾Ý*/
! ^2 Q/ h. z% J        return (uint8_t)RxData;                                    3 R7 ~; E1 H8 _% R
}
( {: q+ D) y( A* x% P4 e+ A- x2 w9 C: A: J; W  d: t2 }
2 S- g0 D$ X4 a# ^2 g$ l) g

) _; u4 I  T8 N# q  R( y6 ^/ U& I% t' H% K/ B6 m
int main(void)
6 v( D) v! d- c/ C2 ?{
! f. _- m, z% B0 I3 N8 d/ B
% `1 ?/ V( s/ j( P        RCC_Configuration();- G% L( u' V4 s/ F- I# l
        GPIO_Configuration();
$ v, \, ]' D! x/ Z        SPI_Configuration();
, D7 `/ Z$ Q$ d- m        
5 l* d/ G4 T3 ~& X8 f; P8 R//    NVIC_Configuration();
. Z2 k. q. F# K+ A' r+ f. }! _        
) {# b, d% _9 o& u5 m( z2 o3 c! \8 M0 n
        while (1)7 @5 l* t4 J) f  ^: Y8 O' ?3 r
        {5 Q; A8 w* ]. y- a

' q6 V$ G0 `7 R          getbyte=SPI1_ReadWriteByte(0x55);+ r. {) ]" m( _+ a, f& _
                delay1ms(100);
+ n* C8 {1 J3 j; R    }" _; D/ E+ O( O$ g6 D
}
: R  k: c& r" f6 J  Q红色的语句在M3中是没有的,在M0中这个函数的定义如下:% A3 N, ?6 N3 `7 s: {% J& I
/ I5 L: e2 [* \8 v2 d2 a7 e( g
/**
& w* U' Q0 s& y7 p  * @brief  Configures the FIFO reception threshold for the selected SPI.
5 g5 Z3 r& t9 P4 L8 i- W# V! o9 Z- {  * @param  SPIx: where x can be 1 or 2 to select the SPI peripheral.1 A5 ~8 l/ f: L* v; O) `
  * @param  SPI_RxFIFOThreshold: specifies the FIFO reception threshold.0 \# o: m& K8 d. h0 q2 B
  *   This parameter can be one of the following values:
8 W9 Y8 V# r) h  *     @arg SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO
$ J# @8 `) O" [) v/ N  *          level is greater or equal to 1/2. / m4 M% d9 m% G2 {( Y& B. @! W2 E
  *     @arg SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO / Z2 v5 p2 t, _' p2 p0 y( w
  *          level is greater or equal to 1/4.
+ o* Q* g4 l' w8 j# q9 ^- {$ W; W  * @retval None0 ^, q* q" ^% M9 {
  */1 A5 ~0 ^3 Q& c
void SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold)8 Z; \% l6 R  F3 I; e! D5 f
{
4 ]* ^( p9 j/ G5 E0 }% h  /* Check the parameters */* r: p  p, t7 _: ], S9 J
  assert_param(IS_SPI_ALL_PERIPH(SPIx));7 S1 d1 m7 j- t/ Z5 q. ?
  assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold));, u( e# R( ^# B8 x' ~* _. C

' y  M8 |1 k; M, Y5 H8 P& d( {  /* Clear FRXTH bit */
) u' N4 M# l& U1 j  SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRXTH);
& ^: Q1 o0 x! |$ }$ Y* d
9 T3 a0 l" g0 d* K2 P  /* Set new FRXTH bit value */
' V8 L8 l8 H+ q- ?8 F# [7 H  SPIx->CR2 |= SPI_RxFIFOThreshold;& T' @& L) V1 i) H
}* r  W: j7 a9 T. ?+ e' e

* {8 |5 v# [' L如果不加这句话的话,肯定会卡在判断RXNE位的地方,因为没有产生这个标志,如果用延时的代替的话是可以发送出去的,但是时序就会有问题,因为发送语句执行后不是立即就完成的。希望大家注意到这一点) l' B  [6 G0 w7 d; Q
8 [: J; e6 r1 C0 E
所有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个字节
$ [( t; D7 ^( M7 i: _  v9 E如果发送的是16位数据就要设置SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO   *level is greater or equal to 1/2.就是 32/2=16--》2个字节
, g( U- @  K0 A% A# K, a
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:564 _5 d, M5 T2 ^
谢谢楼主!

# w$ D# o! g6 x6 a1 n我这是应该做的,跟你比就小巫见大巫啦
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版