找回密码
 注册
关于网站域名变更的通知
查看: 619|回复: 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,时序如图, 操作部分:
6 x" s; c! E1 A2 ?  [. h写 SRAM 空间 命令 0 高地址 低地址 8bit 数据 0 8bit 数据 1 …… ……读 SRAM 空间 命令 1 高地址 低地址 Nop 8bit 数据 0 8bit 数据 1 ……) W1 i4 l5 _% h& y% H) F/ w. q
写 SFR 空间 命令 2 高地址 低地址 8bit 数据 0 …… …… ……
( w; Y$ G- C9 o3 ]1 e读 SFR 空间 命令 3 高地址 低地址 8bit 数据 0 …… …… ……4 k4 {( v2 ^' o% E/ I
    读图像    命令 4 高地址 低地址 Nop 8bit 数据 0 …… ……
5 r4 Y, N2 Q9 v; s# I代码部分:
" P" I% R1 ~, H; Xvoid SPI_GPIO_Configuration(void)
1 d, i) v+ ~8 R$ D; k{
  ~2 q" G3 u4 V        GPIO_InitTypeDef GPIO_InitStructure;
# v  c8 u8 I4 d: Z) G* P# ~3 ~( D( O2 ~( s) a' h
        /* SPI1: SCK,MOSI复用输出 */- x9 k( d9 ?2 ?
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
: L7 |! I7 d# z$ T- `3 n4 `        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
5 Q' A( F9 F) ]2 D        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;0 F' ~; Y( ~" r2 B& y' L
        GPIO_Init(GPIOA, &GPIO_InitStructure);$ {, Y9 Y. u# `* B! ^) x4 F+ x# A

' \3 a6 e! R/ r        /* SPI1: MISO浮动输入 */% c/ u/ o. z. y# j  V5 m# H+ f4 c
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
3 d: a0 ^  V! V- S' h  {& n2 R        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;0 v& [  s; F/ P0 _' E1 Y7 h6 d. K
        GPIO_Init(GPIOA, &GPIO_InitStructure);% ~( i$ s4 H0 P) ~* i

+ i* Q, Q. z  ~, g/ u        /* SPI1: CS推挽输出 */
2 ^9 t. f0 O, L- R# s/ y        GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;, H# S% k6 g  J. Q6 q+ f# O  E- [
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;: \1 ?( p3 q$ Z  W$ s9 L( {
        GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);
. ?! G  g4 v- r0 |9 r# o; T}
9 P# ]# d: k, i$ c' m* L1 D- a, X' Q* Q, `& i0 p7 W
void SPI_Configuration(void)
* T. l1 f- @, ]* n2 M  b0 o{0 Z+ }+ F( ~4 H8 u! z/ |/ |# B# N
        SPI_InitTypeDef  SPI_InitStructure;- W: W$ X6 l5 x# F/ Q0 }
+ \5 d% l6 s5 T. ?: g3 {. s$ _$ f- M, B) k6 D
        /* SPI 初始化定义 */: _. L) i/ A* C; H6 _. E
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工% Q6 D. v0 d# z4 C' L
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //设置为主 SPI3 d) W' L- J7 ^9 s3 E
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收 8 位帧结构4 M5 H) B8 g- h7 }* J  I5 q
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                         //时钟空闲为低/ `& ]" o' K# d; D) s; r
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                       //数据捕获于第二个时钟沿% H5 }7 m: B; X7 R4 o- g
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //软件控制 NSS 信号
3 ~; L! o2 u, ~1 C* G2 \* j        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2
  U) \$ W7 Q- L$ d$ K& l0 P        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始" m$ g* [: p0 R* H+ a9 r5 k
        SPI_InitStructure.SPI_CRCPolynomial = 7;                           //定义了用于 CRC值计算的多项式
2 n- @1 S& w8 b. R& s        SPI_Init(SPI1, &SPI_InitStructure);3 [0 w$ U9 A2 ?7 H

( I" p5 Z, U( @2 l        SPI_Cmd(SPI1, ENABLE);                                             //使能 SPI1; Y. P4 W5 P1 P( O
}! C  m& D, Q% k; K- r+ Z
' k8 h/ y( H  w" W2 j
void SPI_Initializes(void)+ S- {, \1 I4 ^' e
{) |8 q7 k% h$ L1 ~) G8 O
        SPI_GPIO_Configuration();
+ l& @/ c8 Y0 K  q5 x        SPI_Configuration();3 ]2 u: R$ |$ z6 ]
}' W: r" I2 I$ g$ d& f  h5 O
$ M5 b6 A# h% X2 |* h: t
uint8_t SPI_WriteReadByte(uint8_t TxData)
0 b' @2 N( ~& G0 Z, j) W{3 H" q! r' v) v2 B5 Q4 j2 Q
        while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);1 T7 d; ?: \; o) Q/ n
        SPI1->DR = TxData;! D6 A! \7 o9 ?6 C" t
% c' r" @9 u' p& y: i! r
        while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);               
, C! t! R: s( o! v7 ]7 O+ F* k        return SPI1->DR;# ]) c" Y/ ~$ j# J% t+ ^6 q
}
: T; y% R1 A+ @+ |0 _- z" _: d7 F0 n' y! e: a9 S
void SPI_FLASH_BufferRead(u8* pBuffer, int16_t NumByteToRead)4 }5 B' v1 h% b
{/ u; @8 h! `3 Y
        u8 cmd = 0x04;/ F1 K$ w9 K! N0 N0 |2 y- D
        while (NumByteToRead--)1 {7 e( g5 p' Y. @: j4 v0 E' d; I& Z' R
        {
9 D2 w& a# k7 {# L4 R. d+ j                *pBuffer = SPI_WriteReadByte(cmd);2 C) c9 F/ I4 s7 l" N
                printf("*pBuffer=%x, NumByteToRead= %d \r\n", *pBuffer, NumByteToRead);
* J& B5 {3 ]( x( K; S                pBuffer++;
# d- l+ a! n" s        }
/ N) @- L" Q  q* X}5 a5 `6 f- l1 k- J

9 b* e, G  Y1 c& Y6 i, V" t5 L4 d0 p; Y  k" v' E* G0 C9 \
* G' L+ v; M* N' _
目前通过调用SPI_FLASH_BufferRead, 打印出来的都是0, 麻烦帮忙看看, 谢谢!# l  W+ u, B6 |. S8 q9 L7 v2 ^$ L7 G

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

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

    [LV.1]初来乍到

    2#
    发表于 2019-10-16 15:22 | 只看该作者
    本帖最后由 Heaven_1 于 2019-10-16 15:24 编辑 ! L$ ?  K! k. H* A; G2 N
    , m' U7 K% y, f: }
    STM32     SPI只发送数据?,需要接收数据吗?

    该用户从未签到

    3#
    发表于 2019-10-16 15:29 | 只看该作者
    本帖最后由 行者~ABC 于 2019-10-16 15:31 编辑 $ @+ Q9 c0 }0 H7 S

    0 d$ e) M$ C2 C/ G+ g) [1   硬件确保无误# H) C  W6 T  x5 X
    2  上电后,用示波器测CLK和data的波形看一下
    1 J$ K0 @, y. u7 ~( h- m4 P- h& Z1 f3 h

    # C7 t  Y  T/ q4 X! s
    : p( c( w' f" a3 W
    ' y& k! n4 ?0 G8 t! G2 s

    点评

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

    该用户从未签到

    4#
    发表于 2019-10-16 15:41 | 只看该作者
    在 SPI2_IRQHandler 中,这样操作:1 I1 }6 O# n2 W/ I1 z$ e8 E
         voidSPI2_IRQHandler(void)+ n: \  F4 l. S8 ~# {
    {3 W' F* l& }6 x/ _2 v9 e: f5 I
             SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,DISABLE);
    , l0 L2 X7 A3 D* `7 m         if(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==SET)
    : J+ d; |0 U% W+ P3 \. X/ Z         {
    ( R6 \& u, b% \& W2 q+ }" ^- C                   buff=SPI_I2S_ReceiveData(SPI2);
    8 j# o/ |" o1 X) w
    ! o4 v2 R8 }& Q* [+ y* y$ ]       SPI_I2S_ClearFlag(SPI2,SPI_I2S_IT_RXNE);" O: h5 S! f0 g7 }' s
                     SPI2_WriteByte(buff);     
    4 o2 R. T. C$ @) u# t         }
    $ D! ], |, F3 ?/ X' g         SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);                                                                           
    6 d) g) J$ s+ W8 [! h$ [! \}   

    该用户从未签到

    5#
     楼主| 发表于 2019-10-16 15:43 | 只看该作者
    行者~ABC 发表于 2019-10-16 15:291 x; h1 F! w" e
    1   硬件确保无误9 ], u/ y7 R' L! z/ l
    2  上电后,用示波器测CLK和data的波形看一下
    2 X$ P* z  n* `3 y' x
    麻烦帮忙看下代码部分有问题么?谢谢!. v( e& @! ^9 T) T- N7 _

    点评

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

    该用户从未签到

    6#
    发表于 2019-10-16 15:46 | 只看该作者
    chenpeng30 发表于 2019-10-16 15:43( }5 h# z  w3 I8 _, s1 X" F; a
    麻烦帮忙看下代码部分有问题么?谢谢!
    3 r5 [7 f, S6 E! H' W/ t
    好的,我看一下。

    该用户从未签到

    7#
    发表于 2019-10-16 16:19 | 只看该作者
    SPI程序.rar (3 MB, 下载次数: 4) " W, S1 q$ X" ?! V' P

    ; T. e4 h) Z1 B这是SPI程序,你对比一下
    3 J  m0 G4 k0 k3 [& \

    点评

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

    该用户从未签到

    8#
    发表于 2019-10-16 16:21 | 只看该作者
    还有个办法,你在线调试,用JTAG" ]* R1 m6 N2 W% d2 q8 Z

    点评

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

    该用户从未签到

    9#
     楼主| 发表于 2019-10-16 16:28 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:21& j5 ?9 o4 z2 a5 j+ b6 `7 Y
    还有个办法,你在线调试,用JTAG
      ^5 s9 z3 z6 g
    谢谢, 我现在用的是st-link作为调试的!
    ' B( m& T( T5 E( H3 W

    点评

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

    该用户从未签到

    10#
    发表于 2019-10-16 16:29 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:286 H9 z  f& Z" |  l# Q
    谢谢, 我现在用的是st-link作为调试的!
    & ~) p( |7 T8 n  v/ N3 ]. `% F. K
    这个也可以

    该用户从未签到

    11#
     楼主| 发表于 2019-10-16 16:38 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:19
    ' h/ X8 s$ l6 Q/ K+ G这是SPI程序,你对比一下

    2 H- J$ Y3 t4 G0 B" U5 \9 G威望不够, 明天看看能不能赚到+ [/ |( V1 J9 W$ X) k2 w7 v+ o+ o7 v

    点评

    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
    * r3 l! [" h* w威望不够, 明天看看能不能赚到
    ! x: B) B% b4 z# q1 S
    我之前威望也少,发帖多了,就有了; Z/ d+ o, v/ k% }: p6 _

    该用户从未签到

    13#
     楼主| 发表于 2019-10-16 17:26 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:38. w/ {- y0 S( G7 F4 W7 |  P
    威望不够, 明天看看能不能赚到

    ! H8 A5 D' h6 C1 `4 sSTM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的
    % ?  o9 g) K  \

    点评

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

    该用户从未签到

    14#
    发表于 2019-10-16 21:18 | 只看该作者
    chenpeng30 发表于 2019-10-16 17:26
    " c, `5 M( n1 O( DSTM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的
    5 I' i+ @. G& \% Z
    是的,我给你找的范例就是SPI的,这个你仔细看看。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-19 11:53 , Processed in 0.187500 second(s), 36 queries , Gzip On.

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

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

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