找回密码
 注册
关于网站域名变更的通知
查看: 616|回复: 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,时序如图, 操作部分:
) O0 j% a- p# {" c写 SRAM 空间 命令 0 高地址 低地址 8bit 数据 0 8bit 数据 1 …… ……读 SRAM 空间 命令 1 高地址 低地址 Nop 8bit 数据 0 8bit 数据 1 ……7 C6 F! O( V7 m  O! k
写 SFR 空间 命令 2 高地址 低地址 8bit 数据 0 …… …… ……
6 M. g* `( o+ C4 D, k读 SFR 空间 命令 3 高地址 低地址 8bit 数据 0 …… …… ……/ }; |% C+ E6 N& v
    读图像    命令 4 高地址 低地址 Nop 8bit 数据 0 …… ……
. _7 y# l( V6 t: ?代码部分:
, p$ a% N: o  s, ivoid SPI_GPIO_Configuration(void)
7 q  [$ m) u2 K, N{
  o# Q& j% S/ l% _1 V3 y        GPIO_InitTypeDef GPIO_InitStructure;' L3 \; ]0 h$ L/ X

$ ~0 ^; ]/ M* p: z. R& R# ^1 }2 `        /* SPI1: SCK,MOSI复用输出 */2 p+ Y0 ?+ q& Z+ G8 |  V$ h. h: D
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;8 k* h% [. C. G- W3 d1 f9 c$ u- s
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;& \6 j6 C- I6 r" L$ }# Y# u
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;4 N3 i! l- ^! l" q; `7 t
        GPIO_Init(GPIOA, &GPIO_InitStructure);
% b3 R2 L8 k. N5 D% D( n
8 T9 w: I: \, s* ^0 M2 }) a& e        /* SPI1: MISO浮动输入 */% C& \% y( V$ F- @
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;* U% B& w  }: b: E  a% t
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
7 `& u) W  f5 ?4 x        GPIO_Init(GPIOA, &GPIO_InitStructure);
2 M. M- ]% w5 a% C! i, \; b
9 }* n( V. S9 d; ?9 r) \        /* SPI1: CS推挽输出 */
2 W% E% N# x6 |5 @5 b        GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;5 l: Z3 p" @- o+ ]7 g
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
$ R7 @! @. R% |; L; T: v        GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);
3 a) `5 l0 l$ o: I# c}
% q% f* Q8 a( i2 w
+ u- P0 x/ [& t- A: h( ]void SPI_Configuration(void)
' w6 u, f7 k3 j3 W) ~; A- f{% A+ Q( V2 e& [+ t' y& e4 g
        SPI_InitTypeDef  SPI_InitStructure;6 M. W4 y2 W7 Z# M- |

# @# n; G) f- Z2 s% ]        /* SPI 初始化定义 */, i% `1 n! c& O, Z) C9 f- q& c9 G" o
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
1 P2 f, l6 X- T& c2 b) f3 f        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //设置为主 SPI* E( p4 q& K, h- A& C
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收 8 位帧结构* ?: I( u' j6 h( B* ?8 P
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                         //时钟空闲为低  B# v4 K1 L8 q' f' H
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                       //数据捕获于第二个时钟沿, Y  [* B/ w7 I6 e6 S8 y
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //软件控制 NSS 信号& k( V1 \7 ]9 R7 A% P
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2: l  k2 y. `% X2 M. i
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始( ?9 x- C7 C6 J; V
        SPI_InitStructure.SPI_CRCPolynomial = 7;                           //定义了用于 CRC值计算的多项式
7 t5 ?0 W! j4 a! G# F        SPI_Init(SPI1, &SPI_InitStructure);
: O! C7 @' B3 k$ X' v" g% a7 q& M* y+ j5 [: k/ M
        SPI_Cmd(SPI1, ENABLE);                                             //使能 SPI18 f  f% @' c  t( {
}
& P9 ]' m5 @( E+ |% Q
, o$ H; C' b! V1 C5 l' @7 Q2 q1 Pvoid SPI_Initializes(void)
* k) u8 s1 C- A$ p2 Z; ?+ F7 T! e{
" i" N) i; ?. x) O! s; G        SPI_GPIO_Configuration();5 }  v8 D2 f3 i1 L. P' T7 O
        SPI_Configuration();
& Q4 V2 Q, |" |2 m( n$ ~: J# [; q" I}
$ \' R( u) i! w9 l, j  V$ [8 a
$ s9 x4 r! q4 C( \uint8_t SPI_WriteReadByte(uint8_t TxData), t; N, Y3 A& G
{2 }) p' G6 j  L& @
        while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);
$ w; v* A) O- Y8 u$ l" u# o9 j( N        SPI1->DR = TxData;+ ~- U& W3 r8 X$ f

2 u  X. Y+ t: V( t  w2 M" \4 K        while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);                ) K) \$ I# D+ T7 N- P1 C
        return SPI1->DR;
, r+ a! P- v& v4 n6 d5 p& U}
4 j5 Z' `  c' }9 {% q  y" D7 S- E: P2 G$ z
void SPI_FLASH_BufferRead(u8* pBuffer, int16_t NumByteToRead); R6 Y; l7 z' M$ \* e8 K3 L! z
{- b* X0 A$ I- {1 ?) t' H9 I0 F0 k6 v# h
        u8 cmd = 0x04;
" e! I, r- V  `        while (NumByteToRead--)
$ e. m* R- h$ u% W        {
6 @. V; {# j/ k/ o" n                *pBuffer = SPI_WriteReadByte(cmd);' L, W- x5 Z; N8 p: t' l7 U8 g
                printf("*pBuffer=%x, NumByteToRead= %d \r\n", *pBuffer, NumByteToRead);! k* _! x' }$ i& v0 K: s
                pBuffer++;- m5 q5 g9 |! \+ T4 c" \
        }
5 p5 J% j9 i) m0 p9 s}) z: h: u3 D; V3 G. e0 y
& b, l9 S# W: F9 b- }
* O$ C+ _0 M& l- D. n

. |* X/ }/ k! U# e目前通过调用SPI_FLASH_BufferRead, 打印出来的都是0, 麻烦帮忙看看, 谢谢!
3 A. t8 y/ H( x2 s, W

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 编辑 $ e8 \% V; D6 ~2 _, `7 t# Y. R* x

    6 s5 {2 e$ C# kSTM32     SPI只发送数据?,需要接收数据吗?

    该用户从未签到

    3#
    发表于 2019-10-16 15:29 | 只看该作者
    本帖最后由 行者~ABC 于 2019-10-16 15:31 编辑
    : q- A* A/ a( M! N: E: i) l( Y
    9 o, C/ n4 |( F4 k: t, I- X1   硬件确保无误' [  ~( H: ]1 }9 K
    2  上电后,用示波器测CLK和data的波形看一下0 `6 t0 H5 C4 f2 a5 K6 I; M

    1 K" C. x$ P4 n/ t. l. y
    / K* N0 |2 E" M5 Z, [) v6 a* j$ ^  N6 E# w/ d; [2 ~+ ^

    9 `. F* z- i% _

    点评

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

    该用户从未签到

    4#
    发表于 2019-10-16 15:41 | 只看该作者
    在 SPI2_IRQHandler 中,这样操作:
    4 E) x* k* L- Q% a' G) ~     voidSPI2_IRQHandler(void)1 O% N" v/ e4 Z3 s% N2 [: @1 b
    {
    ' t& F2 u  D: i. r         SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,DISABLE);
    # v9 ]; q. @- Q! M% l+ b# B         if(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==SET)( Z9 ~" u3 j$ Q5 g( ]0 O7 k  X
             {2 E$ m4 o; B) Z
                       buff=SPI_I2S_ReceiveData(SPI2);
    0 r& R: H$ c- v- f4 [- r, L% _
    + \5 Y. H0 P8 m5 p8 y" A9 H! e       SPI_I2S_ClearFlag(SPI2,SPI_I2S_IT_RXNE);
    & x- ]# r7 e7 @( B8 h                 SPI2_WriteByte(buff);     2 B5 k0 p6 a/ B% \7 a* ~/ A5 M
             }
    ; Q! u. S, f7 H' U# Q1 g* W         SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);                                                                           
    . I# c; |2 J3 u1 l! d}   

    该用户从未签到

    5#
     楼主| 发表于 2019-10-16 15:43 | 只看该作者
    行者~ABC 发表于 2019-10-16 15:29$ L0 }. \- M; U7 {# t
    1   硬件确保无误
    6 m# B3 j9 s! q, R/ m% l2  上电后,用示波器测CLK和data的波形看一下
    ( f! q9 R, ]( y* B1 X0 u, e7 e
    麻烦帮忙看下代码部分有问题么?谢谢!5 l3 q9 v: ^4 W* I3 _# |4 V5 b

    点评

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

    该用户从未签到

    6#
    发表于 2019-10-16 15:46 | 只看该作者
    chenpeng30 发表于 2019-10-16 15:43# t1 d+ O$ Q5 n; J2 x3 Q/ \( E
    麻烦帮忙看下代码部分有问题么?谢谢!
    9 R& p* [& B* E% n
    好的,我看一下。

    该用户从未签到

    7#
    发表于 2019-10-16 16:19 | 只看该作者
    SPI程序.rar (3 MB, 下载次数: 4) 6 }/ B( i! m0 p2 W7 S
    0 `# K5 w" W$ s4 L/ E9 q+ V9 I0 k
    这是SPI程序,你对比一下
    - K- |: @! z( ~" y& L, @/ i

    点评

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

    该用户从未签到

    8#
    发表于 2019-10-16 16:21 | 只看该作者
    还有个办法,你在线调试,用JTAG, J, P$ `" u; F4 b. U$ q+ @/ y

    点评

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

    该用户从未签到

    9#
     楼主| 发表于 2019-10-16 16:28 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:21
    $ X, W% z6 o* ]: p! Q" r5 M还有个办法,你在线调试,用JTAG

    9 K8 F8 L; N) g! ?9 ^谢谢, 我现在用的是st-link作为调试的!
    : k+ |! ~0 Z9 u0 q1 T8 t0 Y% E( g

    点评

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

    该用户从未签到

    10#
    发表于 2019-10-16 16:29 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:28# `# v4 S5 t0 h# b8 `# W) r
    谢谢, 我现在用的是st-link作为调试的!

    4 j7 U2 G* O# C( O7 |这个也可以

    该用户从未签到

    11#
     楼主| 发表于 2019-10-16 16:38 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:19
    1 q: x( k$ g$ Q; d/ f4 Z这是SPI程序,你对比一下
    % q: ~) W" D  @0 q
    威望不够, 明天看看能不能赚到8 z) f4 n. P% w* n) ~

    点评

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

    该用户从未签到

    12#
    发表于 2019-10-16 16:42 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:38! b) D8 x! b. f0 a% b8 K2 |4 g
    威望不够, 明天看看能不能赚到

    3 T1 l6 U) l( O5 v我之前威望也少,发帖多了,就有了) M5 q( c  v+ d  ^5 h

    该用户从未签到

    13#
     楼主| 发表于 2019-10-16 17:26 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:38
    " t, ?7 T9 F) {- |% a- I3 i6 r7 J威望不够, 明天看看能不能赚到

    1 B3 U8 E3 |& \STM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的% u3 q5 N- P5 ?) n

    点评

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

    该用户从未签到

    14#
    发表于 2019-10-16 21:18 | 只看该作者
    chenpeng30 发表于 2019-10-16 17:26
      P! F6 Y; u/ _) ~  i4 E5 xSTM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的
    9 Q! i9 S! T# r1 X9 w% h# i
    是的,我给你找的范例就是SPI的,这个你仔细看看。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-26 08:32 , Processed in 0.171875 second(s), 37 queries , Gzip On.

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

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

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