请选择 进入手机版 | 继续访问电脑版

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

STM8L 调试硬件3线SPI 分享

[复制链接]
horsdy 发布时间:2018-6-26 11:19
这次调试SPI, 在网上查了不少资料, 特别是论坛上的, 现在硬件3线SPI已调通, 跟大家分享下.8 a. j+ O8 c. D6 ?5 v+ `$ e- ~" X3 H
由于外设是3线spi,MCU不得不也跟着使用3线SPI.
8 w& W& Z9 F! h/ C5 Q: U0 j4 l
# S6 a! w# X  EMCU: STM8L051F36 P& s& Y; }/ D2 d& H
外设: A7139' A2 I0 u& g0 D  M5 }; F) @! z  A
操作寄存器方式: 官方库函数7 ^$ z. i8 o3 |  `$ j
SPI: 3线 + u: r! r$ L7 K1 ~, f2 j6 g
- b! v$ u# F% A2 ?- i) H+ W% p7 G
主要步骤:7 e7 S' Z4 w) W4 d4 }- j/ p, ]
1 初始化
+ T9 G! n, v0 V8 z. E4 Y# R! ?& {
  • 主设备的时钟极性, 时钟相位一定要与从设备保持一致,即CPOL CPHA;
  • 设置单线双向;
  • 主从的速率不能相差太多;(本人的读写数据存在错误,一直以为是读写函数逻辑的问题,后来降低速率,读写变得正常了,原来是速率的问题)
    , T* p8 o5 \  d2 s% W5 ~

2 U. ~- [; `& R( z! ?/**; j8 i) {0 O' M
  * @brief  Initializes the SPI and CS pins.
  n/ t' x) N* i6 {  * @param  None& \! R* ^: P* J  ?- z$ ^: H
  * @retval None6 U+ G; [7 Y! a8 n. \
  */
& A1 q. F/ e% m- }% g# y/ [void SPI_LowLevel_Init(void)
+ v# p, f+ `! |2 q$ ]2 |* w{
- {. r  ~- z: ^6 H$ y$ s8 I  /* Enable SPI clock */
" ]* b0 b1 Q6 W$ |* x9 }  CLK_PeripheralClockConfig(SPI_CLK, ENABLE);4 d% x' a$ p* J$ M

; J6 x$ B4 H( {- l( V# a  /* Set the MOSI,MISO and SCK at high level */( d  `$ |+ H5 S3 v( O
  GPIO_ExternalPullUpConfig(SPI_SCK_GPIO_PORT, SPI_MISO_PIN | SPI_MOSI_PIN | \) r: w2 {8 \! P5 x( Y4 r8 a' Y
                            SPI_SCK_PIN, ENABLE);+ j; Y6 r' y8 v- H/ D/ {

$ |. p/ F  @6 J, p1 f: P  V  /* SPI Config */
- r9 Y- `( U( a% s+ K2 Y  SPI_Init(SPI, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_128, SPI_Mode_Master,- u, [1 R4 Q# `9 \7 S( _
           SPI_CPOL_Low, SPI_CPHA_1Edge, SPI_Direction_1Line_Tx /*SPI_Direction_2Lines_FullDuplex*/,
8 C8 X9 l: N/ B/ v  P8 i5 V           SPI_NSS_Soft, 0x07);
( Q% K+ N  q1 g
" W! z6 z3 t6 z: T  /* SPI enable */
- L$ I9 A5 O* r+ w, G  SPI_Cmd(SPI, ENABLE);
8 s2 R. K2 \$ i1 p# ?% T7 F' E" c' ~1 |7 V0 t. |
  /* Set MSD ChipSelect pin in Output push-pull high level */- o1 ]5 e1 ]7 v& Q3 l) e0 N
  GPIO_Init(CS_GPIO_PORT, CS_PIN, GPIO_Mode_Out_PP_High_Slow);8 S: q0 m( h4 w
}
7 r  S& g; ~6 [" c* q' {/ V
, {! x; p% u( J0 @# h2 读写函数4 v6 p. O* j( z
  • 注意当SPI处于单线双向的RX模式时,CLOCK是一直存在的;
  • 注意在适当时候设置SPI为RX模式或TX模式, 本人的做法是要初始化设为TX, 要接收时先设置为RX,接收完再设置为TX;
  • 注意使用BUSY标志;
  • 写函数注意当数据被赋值给SPI的DR,数据没有立即发送出去,一定要等到BUSY=0;
    ( Z0 f) z9 @5 l. V& R
) g5 ^: p  }% D6 D
/**
  |/ F- U& I) S3 P" Z$ ~, |5 ~  * @brief  Write a byte .% s, j; ]! A) Y* T# g
  * @param  Data: byte to send.
8 @; u7 b: q1 \3 N  * @retval None0 e" H  }9 b- j$ U- g( Q1 d5 N
  */
% L) `* C  s0 u. W8 P& t+ yuint8_t SPIx_WriteByte(uint8_t Data)9 B7 Z3 |# o# a8 b; c( u6 T
{2 Q' f! g/ S3 M
  //SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Tx); //设置单线为发送2 @) Q* W( [( r' `. m
4 ^5 A- S: ?. c
  /*!< Wait until SPI is not busy */  
7 {! O( r5 v5 E  while (SPI_GetFlagStatus(SPI, SPI_FLAG_BSY) != RESET)
& k0 u9 S6 g' g" U  {}% c9 p9 i+ l4 r+ I. s& O3 Q
7 w' F" [1 S) B
  /*!< Send the byte */
. v4 t8 Q* T6 f2 G, t$ x/ v4 `8 B  SPI_SendData(SPI, Data);
! n9 {5 m  d8 D% S' w5 r, U; Q- z" C) K# x( d% u+ r- j; N
  /*!< Wait until SPI is not busy */
: J6 S+ k% E* p) C' \, M  while (SPI_GetFlagStatus(SPI, SPI_FLAG_BSY) != RESET), y7 j& x2 ?( ]. X4 |
  {}# G8 k/ W7 l. K+ m+ |6 f, B% k: r
- V( D; q  P) c% I- s$ p' V8 [
  //SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Rx); //设置单线为接收8 `9 o5 @, O7 U% {' w. _, i
  return 1;! K7 \( [) d6 l  X: e. P% K
}
* j- V6 h( G+ X
% q3 U  O) _8 z% N" p) _" v/**
, N& ?5 z  ^# g3 M* M4 u  * @brief  Read a byte .8 l7 b. s6 S6 _0 Y' z. ]
  * @param  None
$ }' n& j+ k3 g  * @retval The received byte.
0 J2 I# ]: I& }6 ^- p  */  Y/ T8 t. x* }% R1 U7 T, b
uint8_t SPIx_ReadByte(void), ^5 O) {# W0 B( [
{
* G2 M4 y8 Y2 E. T" G( W- W6 z  uint8_t Data = 0;- c$ `" ]% f1 n9 ^
  //SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Rx); //设置单线为接收2 l" V' D% S; P1 ]
  //SPI_Cmd(SPI, ENABLE);# n, N9 i! V  |2 X0 h
" E9 P. B+ j) x& u" V+ H6 u
  /* Wait untils SPI is working */1 w5 H* ^' H$ t) V
  while (SPI_GetFlagStatus(SPI, SPI_FLAG_BSY) == SET);
; y/ f. ?) x* f- g( F5 p
; A' j. `- S9 j( s' Q- t: J& h3 r' y+ @  /*!< Wait until a data is received */* X: u* `* q! Z
  while (SPI_GetFlagStatus(SPI, SPI_FLAG_RXNE) == RESET)/ ^' Z* E" f% S9 E: K5 H5 F
  {}0 @* P. W; M. T' m9 N
  /*!< Get the received data */
7 r6 h6 ?9 z. H/ `/ n  x  Data = SPI_ReceiveData(SPI);8 e  C. _( d/ j5 H/ R" @3 Y" i
- j5 i6 `( d# \+ J' K* K
  //SPI_Cmd(SPI, DISABLE);
* _: s3 \# ?+ g  //SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Tx);* Z) O  K# x9 q( c
  /*!< Return the shifted data */" l- h+ q3 q: C5 ^% k7 r' T* H* ?
  return Data;
& ^) w) e! b! ?# L}
- L: N* Z5 I  g
# D7 j# g; @( V. Ivoid A7139_SetCID(Uint32 id), W" ?2 c. V5 w; e1 N: G
{
3 F' c& a# v0 G7 {4 X, ^        SPI_CS_LOW(); //SCS=0;+ r2 f1 u; F  c$ {) }
        SPIx_WriteByte(CMD_CID_W);& y8 v4 l- q( X( v* s7 E- ^2 ~
        SPIx_WriteByte((Uint8)(id>>24));9 [( X* W+ g" a
        SPIx_WriteByte((Uint8)(id>>16));4 X- Y. \# W9 }
        SPIx_WriteByte((Uint8)(id>>8));
3 l" z/ z. V  t( ?        SPIx_WriteByte((Uint8)id);4 N. e  Z# f* H
        SPI_CS_HIGH(); //SCS=1;
6 w9 s2 p% Q* Q/ g}" s- J4 ~2 S9 _$ _1 Q

& J- f4 e" e& a: w1 M! ?* hUint32 A7139_ReadCID(void). d5 W4 G( u$ U5 [
{
6 {' X7 \+ j* _8 y( c2 r' M        Uint32 data = 0;
% {, [* j( K; J' W: X9 d        Uint8 i = 0;
' o' K$ Z+ s4 ?        Uint32 byte[4] = {0};2 f6 M9 ?6 S5 b$ z
: i2 s, {$ m* G9 G. c
        SPI_CS_LOW();
: T% t- f( e4 F* ^        SPIx_WriteByte(CMD_CID_R);
2 J# v& y' U5 I        SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Rx); //设置单线为接收6 v. B- ^4 j; H* s: ?1 u" h) a
//        for (i = 0; i < 4; i++)
* [/ A7 Q) }' b6 \. Y/ c//        {( Y. g: K$ o5 X
//                data = data << 8;6 k' M* l; Z  o+ {/ ^
//                data |= SPIx_ReadByte();
! Q4 N; J8 Y. e//        }
: k7 @  U% O* z9 A1 A! ~        byte[0] = SPIx_ReadByte();8 k+ O- D; r; }+ Q2 x* J7 G; B
        byte[1] = SPIx_ReadByte();
& q6 F3 M$ t7 G" x' ?( O        byte[2] = SPIx_ReadByte();# }" C) q+ @! c6 Y* k% z; O& ?
        byte[3] = SPIx_ReadByte();
! ~* |. ?5 f; `0 _( R
1 i- Z, n! Q/ `6 d5 |4 x        data = (byte[0] << 24) | (byte[1] << 16) | (byte[2] << 8) | byte[3];: J# i, u2 G/ V& G. K0 `" P
        SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Tx);/ Y  U2 D- y9 e6 e/ j& m9 E
        SPI_CS_HIGH(); ) Y' s- p. H2 b

" {% i" I. W+ t. L$ ?# [        return data;3 f5 Z9 w0 Q) @
}
6 Y* G/ _+ y8 B* Q: o/ J* j& X8 M7 O; D+ J6 B9 k* F, f

9 `8 x2 S; c7 i3 }; U* P! ^9 N
收藏 评论1 发布时间:2018-6-26 11:19

举报

1个回答
zero99 回答时间:2018-6-29 10:33:56
谢谢分享,楼主可以考虑用下面的工具,代码看起来更舒服1 C" N' ]& j1 B# F3 O$ k/ G
https://www.stmcu.org.cn/module/forum/thread-612887-1-1.html
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版