找回密码
 注册
关于网站域名变更的通知
查看: 614|回复: 14
打印 上一主题 下一主题

STM32F103ZE 读写SPI问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-16 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
目前手上有开发板(STM32-PZ6806L)及一个指纹模块, 指纹模块是通过SPI进行数据传输, 通过杜邦线对应连结:SPI1_SCK->CLK、SPI1_MISO->MISO、SPI1_MOSI->MOSI、SPI1_NSS->CS、STM3.3V->3.3v、STM32_GND->GND.指纹模块的SPI信息为:SPI 从接口仅支持 CPHA=0, CPOL=0 传输模式, SPI 时钟最高频率可支持到 12MHz,时序如图, 操作部分:
7 T0 n% H5 Q( ?9 c" z& Y' e写 SRAM 空间 命令 0 高地址 低地址 8bit 数据 0 8bit 数据 1 …… ……读 SRAM 空间 命令 1 高地址 低地址 Nop 8bit 数据 0 8bit 数据 1 ……
; s! A& t& z, l+ W! E, v5 R写 SFR 空间 命令 2 高地址 低地址 8bit 数据 0 …… …… ……
$ `; j( @; s# u2 T1 n, n' Q读 SFR 空间 命令 3 高地址 低地址 8bit 数据 0 …… …… ……; i4 M& k8 w. }4 Q
    读图像    命令 4 高地址 低地址 Nop 8bit 数据 0 …… ……+ B, b6 l0 z7 D& p7 s4 E& W& a
代码部分:% @& z1 _$ u' K$ |
void SPI_GPIO_Configuration(void)4 _, y' K- Y9 _0 g0 k4 o
{; r9 [  k" L0 [8 t
        GPIO_InitTypeDef GPIO_InitStructure;
3 T+ w$ N' B& V
7 A/ \) _- C! c9 V7 Y8 L" S( a        /* SPI1: SCK,MOSI复用输出 */
, a' r$ N: V- [8 m        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
( d' _& a9 n5 S( o' h/ V) t        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;4 _' m( H) v& h$ m- H
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;0 f. E' [: R+ N- A8 t0 F/ W
        GPIO_Init(GPIOA, &GPIO_InitStructure);
2 P/ f* U* T7 D8 z& A2 r& i7 |
) l' B& S( G2 ^5 O/ I, c        /* SPI1: MISO浮动输入 */5 m/ p* _5 j  F- l* T
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
1 Y( p# u& t$ @0 {% {' X1 `0 }        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
6 K6 ~" ~- e) y6 f; K9 ]( ]        GPIO_Init(GPIOA, &GPIO_InitStructure);: G2 Z# e# P8 t$ h7 ~
. U3 ?. M% K, b
        /* SPI1: CS推挽输出 */  d" v9 n; O- t  s+ k+ R
        GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;3 s6 o+ Q8 \! I4 V
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
4 k2 t! m0 `( G& k  T        GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);2 j3 g. P: |1 p6 s
}- v; U4 L! G4 @
  l. `5 Y! e% c
void SPI_Configuration(void)
8 g6 O# e* v+ _* o3 }{
; |! n: h! i# `  ?0 ?  \/ {        SPI_InitTypeDef  SPI_InitStructure;
- W. |( C6 U- X7 ^- o* x! ?
; `7 f8 M5 W# e1 z0 D! K' F        /* SPI 初始化定义 */' M% F6 B3 L% a9 G7 C
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
; f3 p- X3 r8 S4 \        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //设置为主 SPI. l' _% m7 \: a8 f2 c: M) ^
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收 8 位帧结构8 E  ]' l3 }, h6 h. G0 }  ?
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                         //时钟空闲为低- ?" B' ^  O! N7 t; v8 Q4 A6 W
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                       //数据捕获于第二个时钟沿; y) ]' t- V& u; v' w' t9 ?
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //软件控制 NSS 信号9 v# b) U5 V8 P; N
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2
, R+ o' v0 q$ W9 k, Q' Q8 D        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始1 u! X- j- [1 B: r9 L: n8 D$ l4 l
        SPI_InitStructure.SPI_CRCPolynomial = 7;                           //定义了用于 CRC值计算的多项式' M& g5 @; k0 G3 m8 [) }* V
        SPI_Init(SPI1, &SPI_InitStructure);
% H& I& N+ H) ?- r* J6 q& C& w4 w2 |$ v
        SPI_Cmd(SPI1, ENABLE);                                             //使能 SPI1
2 s0 ?, L% z( r, F% m}
3 }& ~! {  R* u
( Y5 h& ?6 T+ G+ I) S# X" gvoid SPI_Initializes(void)
2 O8 @' t5 z. t{, U) L& d; Q. i5 I/ T
        SPI_GPIO_Configuration();
+ I8 ?4 L! ~( v9 _: n1 Q+ o. T        SPI_Configuration();6 T1 ?5 q, }, L+ ~: @
}+ L+ z6 @! p8 Q
' k3 [6 `2 j: c# u
uint8_t SPI_WriteReadByte(uint8_t TxData)
' L# v. [. T3 P* S! }4 ^1 [" e+ M{6 p5 t: A* z* {6 V' L* k0 m* ~
        while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);
5 }0 v% s- d1 F0 q& t        SPI1->DR = TxData;
# z9 C. h, g; ~& O/ q& v" E# P3 @. ?% z6 P, i3 E
        while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);               
- R- b4 D& m0 T" B        return SPI1->DR;
/ b/ ], B+ J' x, c9 C8 v}0 d* b+ [: R5 r, b$ U# E$ G4 u& g

0 a4 d" u: q5 G8 mvoid SPI_FLASH_BufferRead(u8* pBuffer, int16_t NumByteToRead)
+ U" w% C) A( n{
/ d& R; L4 p" o( E3 x        u8 cmd = 0x04;$ ]- e( ]) R' C( Y4 k. J$ O$ B
        while (NumByteToRead--)! q( c* ~1 h2 T& e- c
        {0 f  a& I) @5 M! T0 g  ]2 E
                *pBuffer = SPI_WriteReadByte(cmd);
5 T$ o, }, w: M, ]) P! j6 O( l+ a                printf("*pBuffer=%x, NumByteToRead= %d \r\n", *pBuffer, NumByteToRead);
( q3 `3 X) v4 I2 r                pBuffer++;
" J, O2 S) U) [        }" ?( A. S# l6 r
}" O1 o; w' k8 r9 i

( n# j  J- c: f) C7 ]. A+ ?! G  R- w

4 ?8 @& e1 ]# W) Y3 v目前通过调用SPI_FLASH_BufferRead, 打印出来的都是0, 麻烦帮忙看看, 谢谢!9 q. t' w# m/ i' Q2 s  e

spi时序.jpg (151.84 KB, 下载次数: 6)

spi时序.jpg
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2019-10-16 15:22 | 只看该作者
    本帖最后由 Heaven_1 于 2019-10-16 15:24 编辑 . R+ m  W  ^0 a5 @, }" j$ Y
    ( S! L: a$ G0 Z( P
    STM32     SPI只发送数据?,需要接收数据吗?

    该用户从未签到

    3#
    发表于 2019-10-16 15:29 | 只看该作者
    本帖最后由 行者~ABC 于 2019-10-16 15:31 编辑
    ! h" }- @/ g0 q3 t1 }. w' p6 m6 O( y6 D8 C# R: Z6 c7 L
    1   硬件确保无误
    $ j4 H- v4 `" k2  上电后,用示波器测CLK和data的波形看一下" V  T1 Y2 u8 m5 a$ k: q

    4 d# B' Q, |; R- f5 N9 g9 _
    9 ^, A1 L; L& W4 K3 _! Y$ p) X4 C
    5 u8 H1 ]; B8 ]& m0 h" ?+ l+ @; s! U# T2 ]) ~5 _. h

    点评

    麻烦帮忙看下代码部分有问题么?谢谢!  详情 回复 发表于 2019-10-16 15:43

    该用户从未签到

    4#
    发表于 2019-10-16 15:41 | 只看该作者
    在 SPI2_IRQHandler 中,这样操作:1 A2 I5 m1 z- O* K+ ~
         voidSPI2_IRQHandler(void)1 y# \5 ]. k% C0 P) P+ A3 c3 w
    {! U9 R, ?0 T7 p* o" d
             SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,DISABLE);
    6 {3 p' N2 q9 o4 v# |         if(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==SET)
    5 [. g. e, B2 H         {( J( e) ~% T8 ~  j% J2 V, S
                       buff=SPI_I2S_ReceiveData(SPI2);
    2 G6 \8 q: @! {/ D. Q  `" |3 h7 L% h% g' E; o& Y) R2 W& ], ^
           SPI_I2S_ClearFlag(SPI2,SPI_I2S_IT_RXNE);
    8 }  C6 s6 l5 z% ~% y6 u                 SPI2_WriteByte(buff);     
    4 g6 q5 G4 ~: Z% A) P) Q0 j6 ?6 E) ^         }
    4 j: P( v2 V: |         SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);                                                                           ( m/ H# i/ F! A( k3 ]0 I' }! E( X
    }   

    该用户从未签到

    5#
     楼主| 发表于 2019-10-16 15:43 | 只看该作者
    行者~ABC 发表于 2019-10-16 15:29
    9 F0 T. a; f* g+ Z# V7 Q8 l1   硬件确保无误
    # n6 `+ L* r2 p1 I- v9 V5 S. s2  上电后,用示波器测CLK和data的波形看一下
    ! p' T+ F+ e$ w) I) w1 G; `& s
    麻烦帮忙看下代码部分有问题么?谢谢!7 k8 y4 l8 s9 f

    点评

    好的,我看一下。  详情 回复 发表于 2019-10-16 15:46

    该用户从未签到

    6#
    发表于 2019-10-16 15:46 | 只看该作者
    chenpeng30 发表于 2019-10-16 15:43( U* K& v+ r2 s5 O
    麻烦帮忙看下代码部分有问题么?谢谢!
    & B* @% U- N! D" I4 K
    好的,我看一下。

    该用户从未签到

    7#
    发表于 2019-10-16 16:19 | 只看该作者
    SPI程序.rar (3 MB, 下载次数: 4) ( X# g; e! S5 o- W7 w, Q) \# _

    - u! y# G) U, W; [这是SPI程序,你对比一下( c0 M2 I5 @- P/ d  G4 i

    点评

    威望不够, 明天看看能不能赚到  详情 回复 发表于 2019-10-16 16:38

    该用户从未签到

    8#
    发表于 2019-10-16 16:21 | 只看该作者
    还有个办法,你在线调试,用JTAG- O+ y, h2 L- ]% \

    点评

    谢谢, 我现在用的是st-link作为调试的!  详情 回复 发表于 2019-10-16 16:28

    该用户从未签到

    9#
     楼主| 发表于 2019-10-16 16:28 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:21
    ) Y0 d* \, H+ \+ p还有个办法,你在线调试,用JTAG
    8 p9 Q8 y  b/ P
    谢谢, 我现在用的是st-link作为调试的!7 g+ a  A4 h  E( ?

    点评

    这个也可以  详情 回复 发表于 2019-10-16 16:29

    该用户从未签到

    10#
    发表于 2019-10-16 16:29 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:28+ a9 _/ L# N5 m
    谢谢, 我现在用的是st-link作为调试的!
    ! }' R* D, c. t" s, ^  N% D4 i6 Y# q
    这个也可以

    该用户从未签到

    11#
     楼主| 发表于 2019-10-16 16:38 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:19: f8 g* R2 q( _" i2 D
    这是SPI程序,你对比一下
    9 [" L# L" \2 v$ }0 X1 a. \
    威望不够, 明天看看能不能赚到
    . E" Z' ~1 {% p, d: C! ~" _

    点评

    STM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的  详情 回复 发表于 2019-10-16 17:26
    我之前威望也少,发帖多了,就有了  详情 回复 发表于 2019-10-16 16:42

    该用户从未签到

    12#
    发表于 2019-10-16 16:42 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:386 W; x% {/ g. Z& k% H
    威望不够, 明天看看能不能赚到
    + e! R% K  T; s+ X8 q
    我之前威望也少,发帖多了,就有了
    * Q- d3 Q' [: _- Z; n) Y

    该用户从未签到

    13#
     楼主| 发表于 2019-10-16 17:26 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:38" F% `  K8 J- `# \0 s
    威望不够, 明天看看能不能赚到
    - H# I/ e) ^+ ]- e& g% c- e  E; u
    STM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的
    ( Y$ ?* g; a  ^1 K

    点评

    是的,我给你找的范例就是SPI的,这个你仔细看看。  详情 回复 发表于 2019-10-16 21:18

    该用户从未签到

    14#
    发表于 2019-10-16 21:18 | 只看该作者
    chenpeng30 发表于 2019-10-16 17:26
    * j$ h5 Z  N) ?' R/ aSTM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的

    : S6 N, w% z3 F( [0 b2 i是的,我给你找的范例就是SPI的,这个你仔细看看。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-28 15:41 , Processed in 0.093750 second(s), 36 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表