rt thread spi 使用

发表在 SPI2019-7-17 09:59 [复制链接] 1 165

有没有尝试按照rt thread 官方文档的spi 案例敲代码,但是发现总线错误或者spi数据传输不成功的情况,那么下面可以看一下我的记录。
, |. x' U6 l2 p
, F+ R+ `$ n  c% V
  1. #include <rtthread.h>
    ) ]- G2 E/ j5 c. r6 y; d
  2. #include <rtdevice.h>
    $ Y1 D8 \: ^* N3 x- o
  3. #include "drv_spi.h"                     //注意添加这个头文件,不然rt_hw_spi_device_attach 无法调用; D0 B3 N: ^4 y5 v* z

  4. ; c/ B/ q; i; n2 O1 {
  5. #define    FLASH_DEVICE_NAME   "spi12"
    & R7 _8 \4 A" g4 R# i. f
  6. 3 h; w( @) ?8 I/ j- `& U
  7. struct rt_spi_device *spi_dev_flash;
    ! ]9 B/ f4 d+ V3 k' {( e; l* i. W2 Z
  8. : J/ Y0 x. i2 Y! h4 p
  9. ; p: r8 _# ~& ?$ h  Y; |
  10. struct rt_spi_message msg1, msg2;0 D: x/ X. Y) ^3 L9 T: }8 C

  11. + b$ m' l+ N3 A) p

  12. % d  @4 ]1 u( K# ]( E* P
  13. struct rt_spi_message *res;           $ D7 H* _" B5 Z0 C3 @
  14. 3 p& ^' Z) K& Q" b/ r* q0 E
  15. / C3 J% Y; o' R- B
  16. struct rt_spi_configuration cfg;
    ' _) b8 u/ q& E( Y; f, @

  17. 8 o  Z/ ~+ A, y. J
  18. 0 C1 W# F& M0 g' g
  19. rt_uint8_t flash_id[] = {0x90, 0x24};
    , W/ s7 [" w7 }) I5 k
  20. % ]0 }; ]$ l) a, }4 ~
  21. //文档中提示使用rt_hw_spi_device_attach这个函数,但是没有码; C; X# h9 ^  x: O3 a5 h5 O' O
  22. static int rt_hw_spi_flash_init(void)# ^5 C# h& M5 n) P8 l4 d7 E
  23. {# ^0 n8 x' t# Z; I! z
  24.    __HAL_RCC_GPIOC_CLK_ENABLE();; @3 I3 W8 ~7 C+ _3 T* A' Y2 D( f& O7 D
  25.          rt_hw_spi_device_attach("spi1", "spi12", GPIOC, GPIO_PIN_0);           //我用的野火指南者开发板,CS片选引脚为PC0
    8 G0 O& ~0 J8 x# b. [9 t
  26.          return RT_EOK;
    5 l' q" h% S- V6 K
  27. }
    7 \2 ]9 {+ w3 V
  28. 9 t, J. c1 w1 ?2 G) ?

  29. / D% u# z' V% i, f! G
  30. //测试代码,直接放在main 中了
    9 u, k8 C; `  L  Y
  31. int main(void)& A8 h% }* b9 _# ~1 U/ F  ^9 L
  32. {   ( F  H. e) S  E9 Y4 K" f/ _
  33.           //挂载spi12 到 spi1
    " `& ]$ f! N/ ~. }
  34.           rt_hw_spi_flash_init();  # o3 _1 Q, Y/ O" i5 P, ~  M
  35.         * D+ \  S$ Y& T) f  s, F) \
  36.           spi_dev_flash = (struct rt_spi_device *)rt_device_find(FLASH_DEVICE_NAME);% {2 ^+ B& ~8 k8 J0 \$ ~3 e
  37.         : b& W  M/ A0 f2 N0 p
  38.           if(spi_dev_flash != RT_NULL)
    6 V' \6 O, D& }; s; [% F
  39.                 {' q8 ~& S' f; }1 J, r
  40.                    rt_kprintf("find the flash on the spi bus\n");2 E% ]7 h* E9 F* z2 c
  41.                 }: a0 Y$ Q# h3 R2 _7 y: n( R
  42.                 else: C" d. N8 q$ p( I# n
  43.                 {
    4 v0 [6 Y  B& r) C' s
  44.                    rt_kprintf("can't find the device\n");
    1 T4 }5 t( |" A. U+ Y
  45.                 }
    * s9 x, D! p+ V- J7 ~
  46.                
      v! j" Q, @* N8 s7 g' V; p8 N, N
  47.                 //配置spi& o0 {' D' X6 }/ D& R% n' ~. h, ^
  48.                 cfg.data_width = 8;
    4 X2 s7 W' k4 F" S! ]7 }  ^% K
  49.                 cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;) X" r. y- x. {. f* E
  50.                 cfg.max_hz = 20*1000*1000;   //20Mhz
    & n  k, }: D# R
  51.                
    . i: h- i2 B& }; k( T
  52.           rt_spi_configure(spi_dev_flash, &cfg);2 R+ W0 Y0 {( n& n* Q- N8 Q& q- w
  53.                
    ) _, P0 q! A! Q+ c; {
  54.                     //向设备发送数据
    $ f9 J- q  V3 W: o$ d
  55.         msg1.send_buf   = &flash_id[0];3 j0 x' Q( V% H4 P
  56.         msg1.recv_buf   = RT_NULL;0 C8 Z5 M/ s& o
  57.         msg1.length     = 1;% h$ {6 y2 s4 ]; |# M
  58.         msg1.cs_take    = 1;
    6 }: K; \* V) A# k! T; D+ n' C* N
  59.         msg1.cs_release = 0;% ?- Z' t, _8 ^. K+ A" n9 t  X8 P
  60.         msg1.next       = &msg2;
    5 u$ Y# n* ^8 _8 Q4 K
  61.                
    + H. U( `! _+ M! G' ^
  62.                     msg2.send_buf   = &flash_id[1];
    " {$ ?- v4 {  y1 K( r  q: z* `
  63.                     msg2.recv_buf   = RT_NULL;8 n( u0 s2 {1 P, r
  64.                     msg2.length     = 1;; L) j" Z7 @/ o' t5 z2 l( N+ m- ]
  65.                     msg2.cs_take    = 0;. i% K+ K; b: x/ U: H
  66.                     msg2.cs_release = 1;
    2 I$ d2 O, P1 b2 R  Y( k
  67.                                 msg2.next       = RT_NULL;' Q" H3 l# e' ~' p3 ?/ I
  68.                     
    9 U' {/ q! m' @' R( M( {
  69.               res =   rt_spi_transfer_message(spi_dev_flash, &msg1);   
    4 ^( }! }. u* v9 V0 w$ \
  70.                     
    8 c: Z! ~/ \7 l7 w2 o% U
  71.                     if(res == RT_NULL)( J$ w0 n$ [$ `/ ~, |. U
  72.                                 {
    : O% S" G0 r8 T7 N) X3 _
  73.                                    rt_kprintf("data transfer ok from spi12\n");
    8 }: L/ ^& W  u+ S8 p
  74.                                 }
    ' h3 R' p6 P4 Q& d# I/ U8 O
  75.                
    * {" @) Z! I7 ]1 Z/ ^
  76.    return 0;1 A- |4 P; p; ^% D
  77. }
    + r; F. J( o+ q( }% L

  78. # c, Y+ O. C- X; ~

  79. 5 u/ Q" T* H& P- i9 W
复制代码
最后的输出结果如下:+ y- P9 G  }# T( J- Z4 H: s1 M
24 (2).png
0 R; o' ~4 c- Q9 \1 A8 ?. n1 L) W
. ^. f( ?1 ?) {: T6 ?) ^; z+ @& |& b* R+ j: j3 d

9 \' |, c/ a" n# Z; G* [2 {4 l9 k2 i% s) {$ S& X
0x90, 可以发现上面设置的20Mhz  是 spi 数据传输时的,clk 频率。
; }" i% A/ ?. z6 V 24 (1).png ! e( S4 G! R% D, x/ r" `( Z
0x24
) _9 Z+ R+ c; R) q; D# k9 I2 G/ R  D  g, h
spi12 设备 工作正常。3 Y6 ?! }% ^- v! |9 [5 `- w+ V
, H8 x) W3 i5 q6 H
5 D$ E4 ^" Y* R+ a" @
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-7-17 21:07:03 | 显示全部楼层
给楼主点赞!
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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