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

072RB-Nucleo上手之SPI

[复制链接]
woshilee 发布时间:2014-12-16 19:36
本帖最后由 woshilee 于 2014-12-16 19:55 编辑 . _; O& K2 b/ b0 Z, R8 {
5 P0 ^  q( L5 j# s5 p
M0的SPI终于调通了,玩儿M3,M4多了现在玩M0就有了固定的思维模式,老路走不通的话就要找它们之间的不同之处了贴上程序吧4 [) U& Y8 `0 [3 _1 p; U
#include "stm32f0xx.h"- n7 f9 f7 u% q3 f* \% `
#include "stdio.h"$ B# v# w% W: p6 V$ u2 F) O# R
uint8_t         getbyte=0;
0 {# b: ~; j1 }- F/**9 `( {1 p4 h- K7 ?
  * @brief  Delay3 G+ ]5 W$ t: H* y. r
  * @param  None
* {% I: ~. t  J$ @8 `- S$ X% @: M- B0 q  * @retval None
, h. e# f! u( s4 T- k  */
& v$ X' ~0 p) n& d5 Kvoid delay1ms(unsigned int ms)
0 M9 r5 E; i: J' ]' F{  M3 O0 }; h. d3 o
    unsigned int i,j;
% X. v8 U+ ^) p7 J6 C9 i/ F# m    for(i=0; i<ms; i++)
3 ]1 |* O1 Y% e: c        for(j=0; j<100; j++);
" k% q1 u6 W! h9 @% y( }) f; L' K0 a}
* j% }2 k- b! O! l* Z  k
+ O9 F1 W+ N/ I* p" b/**, r; S" B+ }9 \+ b* p- |0 y4 X
  * @brief  GPIO Config0 A/ v& T- H6 {8 `# J+ `1 ^% s
  * @param  None2 i6 N- ^& R& v- [1 Z$ _
  * @retval None2 Z6 N, w- u+ ^2 P. x$ a
  */
( ~8 O* Z3 o. s! w- ~, C2 hvoid GPIO_Configuration(void)" T9 G- |2 H9 b( V
{: p& T7 f% _+ n4 x/ I% r/ h
    GPIO_InitTypeDef        GPIO_InitStructure;
, A+ a6 D, r. I5 b# @" O( @* k4 ^7 w. o! N, [0 _0 V; @9 }" l0 y
    /* Configure  PA5£¬PA7 in output nopull mode */) J2 c6 V" Q* D% i1 \% k
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;/ a! ?5 m  ^: e. e5 ^+ }
          GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
' v5 U: x: M# ~7 O4 l5 b          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 `5 F3 W) J9 E  k" Y% Y
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
! U9 G# g7 m+ C* P          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
" b5 y: o5 @8 y$ I  S    GPIO_Init(GPIOA, &GPIO_InitStructure);
. c2 M6 X9 d0 P- X$ L% o5 \* w9 A! g% k+ P3 X- g! }' }) l+ j& Z
           # O4 |5 H. R8 [( b  _% J, A
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;( @6 `# y' F* _5 o
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;. V5 N( y- K5 x3 A
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- x0 d1 K' ]& n( L+ G( s/ R    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍ츴ÓÃÊä³ö
3 F6 Y! A) h8 G/ n) i5 j    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5 }9 E. b% ?# U  ^) P    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//Ðü¿Õ»òÉÏÀ­ÊäÈë
( a+ `# M6 }6 X    GPIO_Init(GPIOA, &GPIO_InitStructure);
8 T4 b5 v0 G: v  K: S2 ~" v8 e/ ~, T% O6 j* G  H5 Y

3 `. N( q4 U* s2 ?( H6 s: M: O5 ]    GPIO_PinAFConfig(GPIOA,GPIO_PinSource4, GPIO_AF_0);) {3 k. m) q0 e: J3 [: E7 v
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_0);- B9 _6 P( P" L  Z, M8 J
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6, GPIO_AF_0);
$ ~( J1 K0 }  m7 }: k; B    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7, GPIO_AF_0);
  g  K: T4 \! J6 x' j5 W3 {}- C) q3 b8 D# A( v% m3 i# G
void RCC_Configuration(void)
( L8 o% p4 r6 P4 h# t- V% l{& x; n8 ^$ F  C" z
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
8 A$ D- t* H2 b- s* K. F    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);  g2 `7 r9 v9 ?- x# H
}
" U2 Y) Y, g0 bvoid SPI_Configuration(void)
' |9 r% O9 d3 E8 @% c( I{$ @5 P( Z, J: n# U& [
    SPI_InitTypeDef SPI_InitStructure;# V' q2 p9 X! J1 e
                SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;         1 j0 _6 U/ [: y$ f+ X, E
                SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 1 z& H: m8 j5 M3 X, m/ h5 D
                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;1 E6 k! q! L$ |% }( Z$ `$ q, T
                SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;" g" M$ S3 Q( x1 ]" |; ^) b7 B
                SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   
# U/ J9 Q$ F  ]: Z& b                SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
5 C8 [6 i9 o0 u. U5 _                SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
7 [3 m; y1 _. t  {' e                SPI_InitStructure.SPI_CRCPolynomial = 7;                                 
0 K: t5 G+ n+ o" U# b( {/ K7 N0 ]                SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+ \# _1 y& P* Q" ~                SPI_Init(SPI1, &SPI_InitStructure);                                          ! \# H9 d. M) Z, A. S4 S* a
                SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
. L' Y) \, p/ D! ~, R* ~        
& H+ K6 y5 r! l3 ^                SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
: K3 s8 ]+ u1 F( }        
5 m4 a1 N) ~$ C9 l& ?/ ^; J                SPI_Cmd(SPI1, ENABLE); /* SPI enable */0 h# Y5 w7 c0 T+ J- \7 d+ I
        + p- T5 F. \3 x- K* l) ]$ n- D
}- D( o7 h+ v0 I2 P2 }

$ {- `* L; X* @5 t7 B) w, y
$ D# O3 s# T" R9 k% X9 ~uint8_t SPI1_ReadWriteByte(uint8_t TxData)
( v& D6 L' J" [! z{               
( k- P) z# S7 \7 I4 x" L  T, o        uint8_t RxData = 0;+ a% O2 z. N# z, B9 A% t3 J
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);         //µÈ´ý·¢ËÍ»º³åÇø¿Õ ) O6 h/ Y+ K5 X2 K' B5 x; e
        SPI_SendData8(SPI1, TxData);                                         //·¢Ò»¸ö×Ö½Ú( @9 u' j$ m% Y! |* h
        ( x- O) L! Q2 E% I9 ~# X* x- e9 C1 A/ Z
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);! G2 k' Z. ]+ K) J. T3 ]
        RxData = SPI_ReceiveData8(SPI1);//SPI2                                     //·µ»Ø½ÓÊÕµ½µÄÊý¾Ý*/: i8 H3 j8 D3 A, H: n0 V0 B
        return (uint8_t)RxData;                                    
- U! b! E6 @7 j4 z, z4 w8 v7 K}
, _! \7 G# {9 ?- f5 X; u; w6 A8 L: s4 K9 o
. Z$ v) @; o. e6 Z% r& g; J+ F: I
7 b' I$ h! h  i% z" m0 M
" g6 K( k7 a! T0 y2 U0 Y$ w8 r% Y
int main(void)
! p/ q( J/ S7 ~& I- ]" Q{
, Y& h9 N5 O) k* Z, s$ E8 ?7 h- z4 n- T
        RCC_Configuration();
+ ^) E/ O0 b: H. b+ `; z        GPIO_Configuration();0 G3 ?6 j  i% T  J9 |$ {
        SPI_Configuration();
( @2 t: R9 S3 x6 e9 L        
1 Z/ T, R& Y/ o3 |( y//    NVIC_Configuration();
3 b- r$ G* v9 d  G0 o$ p        
! G$ V8 t  @0 `) e1 `$ ^
9 q+ L6 ^1 ^7 e  {/ U" e# A& j        while (1)
7 S2 I2 F; H) j: E3 f) o6 G        {7 }  w; E6 T% q, W$ b! i3 I
2 k! v& n+ ^% z1 \- e9 f
          getbyte=SPI1_ReadWriteByte(0x55);! m- `# V- j- E4 l; S
                delay1ms(100);
; Y( c: M' ]) H$ @% r    }
0 j* ]7 ^7 G1 F, O) |}! W  T# ]& e4 @5 F3 T
红色的语句在M3中是没有的,在M0中这个函数的定义如下:
3 p# w1 J  D( j$ q5 ~
! _: w1 g2 b9 l0 E; z0 i/**
6 Q" U# m0 U. q' P6 c$ U  * @brief  Configures the FIFO reception threshold for the selected SPI.4 _0 ?+ M0 B3 x- q+ b* m
  * @param  SPIx: where x can be 1 or 2 to select the SPI peripheral.
4 f1 s, u+ ]! f6 K* f6 E( r+ v. `. x  * @param  SPI_RxFIFOThreshold: specifies the FIFO reception threshold.. e5 r6 a  W8 E
  *   This parameter can be one of the following values:
! X5 W3 w# l7 ?: _1 C+ h  *     @arg SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO % @+ Y. H6 y; N1 u* N/ p) {) g- j7 Q* g
  *          level is greater or equal to 1/2. ( @$ u) {$ j$ |+ Q+ j  u& ]( c; U
  *     @arg SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO ) ^8 \3 y: I9 c- N" I9 _, K: p. W
  *          level is greater or equal to 1/4. # E! L1 `) M" [
  * @retval None
* N" P3 Y1 J5 Y  */: N1 o% `4 F) ?& z6 o4 j' I8 {
void SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold); ?3 o0 ]3 C. L! C, y  a
{" I* a' k2 i/ H1 i$ D; j
  /* Check the parameters */( E( I" \5 }1 P: m7 E
  assert_param(IS_SPI_ALL_PERIPH(SPIx));
; _" O/ o! I: F# b" x, N+ O  assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold));
% b  P3 _0 K+ k% F2 v% K/ \8 i: s) h) X
  /* Clear FRXTH bit */
) c  m! k/ J' B4 P" e" C  SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRXTH);% a& r) L( x, L( R- o3 {- N

$ C/ Z% N. L" l0 f. l3 E  /* Set new FRXTH bit value */
. A( n& v0 m* o: a. x  SPIx->CR2 |= SPI_RxFIFOThreshold;
& [# [6 R3 ?( v. u$ r+ J) s* c}- s8 a( s) b( P6 |* ]& Z9 `0 f4 U

8 }; C7 H8 n7 P! B如果不加这句话的话,肯定会卡在判断RXNE位的地方,因为没有产生这个标志,如果用延时的代替的话是可以发送出去的,但是时序就会有问题,因为发送语句执行后不是立即就完成的。希望大家注意到这一点
# y! M9 R1 C6 E) P  M! `% e
4 Z6 p- e# h: a3 J8 j所有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个字节
0 r+ X& K5 [6 a3 {& R9 [如果发送的是16位数据就要设置SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO   *level is greater or equal to 1/2.就是 32/2=16--》2个字节% K- y. u, g0 p) [
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
3 Q5 j( _4 m3 U9 n8 F谢谢楼主!
8 q- I8 K- i% t7 B) s
我这是应该做的,跟你比就小巫见大巫啦

所属标签

相似分享

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