找回密码
 注册
关于网站域名变更的通知
查看: 646|回复: 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,时序如图, 操作部分:
$ Z8 p; n7 ]. Z6 l  V) a写 SRAM 空间 命令 0 高地址 低地址 8bit 数据 0 8bit 数据 1 …… ……读 SRAM 空间 命令 1 高地址 低地址 Nop 8bit 数据 0 8bit 数据 1 ……
: I, s/ T0 l6 ]) G写 SFR 空间 命令 2 高地址 低地址 8bit 数据 0 …… …… ……- e' G1 M' x+ ]
读 SFR 空间 命令 3 高地址 低地址 8bit 数据 0 …… …… ……
0 ^! w+ _" r! b    读图像    命令 4 高地址 低地址 Nop 8bit 数据 0 …… ……1 X9 p% T9 E! _- T
代码部分:+ ]# }3 F# M: f
void SPI_GPIO_Configuration(void)
' T3 [# j* d. Y{/ w- ]5 n* \9 |& s+ o8 \; m3 U7 `* u' \
        GPIO_InitTypeDef GPIO_InitStructure;7 M5 n* {# A+ E( I6 _# M
9 \3 c& Z& a9 Q1 h6 z$ _5 b
        /* SPI1: SCK,MOSI复用输出 */- B4 ]+ l, v/ C1 I
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;8 m5 N2 k4 X4 A) v* C7 N2 B$ ^) f
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;& ^* i5 A$ D0 r( Q! s! W, b5 Y" n
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  X* S: I$ {% F! E' A/ V6 u        GPIO_Init(GPIOA, &GPIO_InitStructure);7 }% L, Q3 T: ?9 c; I! Y4 c0 u

3 m' s$ @, N" i9 Z        /* SPI1: MISO浮动输入 */
2 J9 O. `4 G) n& {1 f& r        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;: V' [2 A! Y9 ?2 t# e
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  E3 d( M' l) s  K
        GPIO_Init(GPIOA, &GPIO_InitStructure);
+ a) k$ g0 F2 c! q' H/ B5 a& e. k5 T: [' _/ S# `
        /* SPI1: CS推挽输出 */! L1 p5 o7 ^( k" W" Y
        GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;! X5 f; j  a1 T% \0 c
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
) F6 u; G5 P8 d! q        GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);
7 ?; P; X1 G  Q; d4 Q  n, V6 X}: Y# t+ ]" _! p3 c. u  o  M
: _$ x0 C6 t6 }) u7 t$ V
void SPI_Configuration(void)) G8 x7 c+ k5 m1 U' A
{
( W6 ?9 W7 W$ @        SPI_InitTypeDef  SPI_InitStructure;" h. \! n3 a9 r$ n) Y

& C3 s7 b$ U. a        /* SPI 初始化定义 */
4 e, r4 ~- W8 ^# a        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
, S2 z7 J( L' ~2 M1 A' p        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //设置为主 SPI
! H' \( d& ~# A* n) g. k        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收 8 位帧结构5 _, ~: s, y% e! M' ~
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                         //时钟空闲为低) m: O1 k9 P- [9 h$ A
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                       //数据捕获于第二个时钟沿
0 O# N% J- ~1 g/ R: H3 U        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //软件控制 NSS 信号/ m. k: g9 o: j4 B' M, ]6 t  `
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2
  n( C' E. J6 T2 f5 n: Q3 r6 c0 C9 ^        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始5 z" V8 i5 S2 k1 ?% M+ ]
        SPI_InitStructure.SPI_CRCPolynomial = 7;                           //定义了用于 CRC值计算的多项式
8 y4 U- m$ S4 m1 P        SPI_Init(SPI1, &SPI_InitStructure);
. V0 v8 n6 Z# B' O9 \9 H3 X9 K, O+ F. ]* c+ D5 T* @2 d
        SPI_Cmd(SPI1, ENABLE);                                             //使能 SPI1
. t, m1 k) y, ?/ B9 }# `) D}! X2 n8 S! E6 I+ }
4 C* a8 Q- A0 H
void SPI_Initializes(void)  w9 T% A) S) P! P
{
3 p) |& X9 F5 M2 N# z: ^        SPI_GPIO_Configuration();/ F& ^* a: V3 a
        SPI_Configuration();6 W5 k: L5 D% ]
}# [- S: h% o% E5 L& q

* y$ Y3 t4 y5 i: z5 E8 R# {; `2 Buint8_t SPI_WriteReadByte(uint8_t TxData)
% S* w3 I: g8 \{; C$ ~! j( H  F2 Z3 f/ k& _
        while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);" H, I  t& U7 M  r( a9 g# C6 ~. ]: M
        SPI1->DR = TxData;* X0 {1 p! q# A4 a6 `) \2 E# t
6 j# p* H0 f1 H, E1 `% e+ s
        while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);                - Z0 t, j; Y$ w" w
        return SPI1->DR;4 a2 e$ C1 ^; J* d: z+ e) O5 {
}
0 N" p! H+ A9 n- l( y9 l$ s  y; u. s6 }" d3 [9 Y  j
void SPI_FLASH_BufferRead(u8* pBuffer, int16_t NumByteToRead)) x/ z2 z7 `) q8 M% [5 ]; t6 y
{2 O4 U) E" }, R# y$ E8 z5 n3 Z
        u8 cmd = 0x04;5 y# d2 K  R' \. w4 y, n
        while (NumByteToRead--)
7 Z5 l, u9 C4 T" E2 G6 v' `        {
4 f3 j& {* ^: B3 j                *pBuffer = SPI_WriteReadByte(cmd);$ U! W) K* D" r4 ~+ s
                printf("*pBuffer=%x, NumByteToRead= %d \r\n", *pBuffer, NumByteToRead);
  [4 s( {: i! i) R7 W! L                pBuffer++;
/ b9 _0 f2 H! _) J% Z5 Z        }
* ~2 j9 w4 b2 _3 n  {}: [, C; O2 G4 t" y5 s0 h( x

8 T$ J# V* v( f4 P- e
- l" \* l5 U( t  d5 T
8 J+ C4 f! D0 A2 F! `0 s& w& r目前通过调用SPI_FLASH_BufferRead, 打印出来的都是0, 麻烦帮忙看看, 谢谢!
" \& T8 x; g3 c* i% h( F6 T

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 编辑
    - D5 ^0 _9 Z& L" I( f. v. v  L8 D# H
    4 A7 i# \* ?; O9 h5 lSTM32     SPI只发送数据?,需要接收数据吗?

    该用户从未签到

    3#
    发表于 2019-10-16 15:29 | 只看该作者
    本帖最后由 行者~ABC 于 2019-10-16 15:31 编辑 1 ~  _+ d! P0 @( A3 e
    - y4 W/ E, v  M0 J
    1   硬件确保无误+ ^$ K* N! @2 |7 @, T% O
    2  上电后,用示波器测CLK和data的波形看一下% z% x4 {0 G/ _- }2 P' F$ U
    9 m. A' e/ t+ E8 d9 G. \8 }
    1 ~% ~$ }& B! n2 p" a) m+ K
    - S$ X7 B0 m4 \: ?1 X

    4 ^" S1 J1 B8 u  C" j

    点评

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

    该用户从未签到

    4#
    发表于 2019-10-16 15:41 | 只看该作者
    在 SPI2_IRQHandler 中,这样操作:- M! g: y* x1 g- b
         voidSPI2_IRQHandler(void)
    , b  E- D- U8 z+ v1 c  N! r% @{: S  d* w( r" j+ v2 _
             SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,DISABLE);
    ! v* @' |0 I, z1 w         if(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==SET)
    ; M% J: m( H- w: N6 F! W         {
    8 U0 O4 B/ J" J9 t                   buff=SPI_I2S_ReceiveData(SPI2);
    0 x, V4 p6 a% l: D- Z4 O
    8 l9 u5 U, n6 a/ n" @       SPI_I2S_ClearFlag(SPI2,SPI_I2S_IT_RXNE);' J; g" q( l4 r- k( a) h
                     SPI2_WriteByte(buff);     
    0 n' m  T4 P5 W4 i         }0 |9 H5 u# N  Q: I1 S3 |  _
             SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);                                                                           1 a# f& B( y$ `0 N3 s7 {3 w
    }   

    该用户从未签到

    5#
     楼主| 发表于 2019-10-16 15:43 | 只看该作者
    行者~ABC 发表于 2019-10-16 15:29
    " y/ u/ D& w3 m7 w& y# g1   硬件确保无误
    - C. h- t7 p( e  F2 Y& I! \2  上电后,用示波器测CLK和data的波形看一下
    4 ^5 P7 u) W/ B/ R  {0 @
    麻烦帮忙看下代码部分有问题么?谢谢!
    : x: I& g8 ]6 T" `! ^( U

    点评

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

    该用户从未签到

    6#
    发表于 2019-10-16 15:46 | 只看该作者
    chenpeng30 发表于 2019-10-16 15:43# o% ^/ {3 p* p- k
    麻烦帮忙看下代码部分有问题么?谢谢!

    1 [- ~; J+ K. e3 O1 a4 y8 l好的,我看一下。

    该用户从未签到

    7#
    发表于 2019-10-16 16:19 | 只看该作者
    SPI程序.rar (3 MB, 下载次数: 4)
    8 B; N5 c# z4 I1 H5 M. T5 a9 A8 G) x1 v
    这是SPI程序,你对比一下' Z! ~) Z) ~6 t' L; E' {

    点评

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

    该用户从未签到

    8#
    发表于 2019-10-16 16:21 | 只看该作者
    还有个办法,你在线调试,用JTAG$ w9 s9 z$ I& h0 {+ E

    点评

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

    该用户从未签到

    9#
     楼主| 发表于 2019-10-16 16:28 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:215 r8 G' J( L0 E: o! m  l
    还有个办法,你在线调试,用JTAG
    4 |% j3 ], t6 c, {- \# R/ k
    谢谢, 我现在用的是st-link作为调试的!" Q& m4 w1 g( ~0 @5 R- S

    点评

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

    该用户从未签到

    10#
    发表于 2019-10-16 16:29 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:28( \* z$ F# T! h
    谢谢, 我现在用的是st-link作为调试的!

    # @$ m. ]5 o* j( S$ T& o/ U这个也可以

    该用户从未签到

    11#
     楼主| 发表于 2019-10-16 16:38 | 只看该作者
    行者~ABC 发表于 2019-10-16 16:195 C; w3 R) g; ]  A
    这是SPI程序,你对比一下
    8 z+ A8 C3 d: w
    威望不够, 明天看看能不能赚到8 J: O: a( x% W- a2 b

    点评

    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) D- D6 r6 ]4 ]- N/ ~. L
    威望不够, 明天看看能不能赚到
      {4 Q# z/ o( o/ `8 }
    我之前威望也少,发帖多了,就有了# t  T; u3 Y" ~- I( ?" P" y

    该用户从未签到

    13#
     楼主| 发表于 2019-10-16 17:26 | 只看该作者
    chenpeng30 发表于 2019-10-16 16:38; K2 f+ }- Y0 L5 r1 W$ I- ?
    威望不够, 明天看看能不能赚到
    ! g4 E2 I2 c- n  `5 ?) d
    STM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的
    / K# y, ~5 w5 ?- X7 m: `

    点评

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

    该用户从未签到

    14#
    发表于 2019-10-16 21:18 | 只看该作者
    chenpeng30 发表于 2019-10-16 17:263 H: D2 o' S' i  x3 o! v
    STM32F103ZE找个是走SPI2?我看你给我的范例里面是针对SPI2的

    ( C* H1 Z6 `" l$ E是的,我给你找的范例就是SPI的,这个你仔细看看。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-11 10:45 , Processed in 0.171875 second(s), 36 queries , Gzip On.

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

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

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