rt thread spi 使用

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

有没有尝试按照rt thread 官方文档的spi 案例敲代码,但是发现总线错误或者spi数据传输不成功的情况,那么下面可以看一下我的记录。! l6 H: O# ^4 O6 |
. u  r8 @" _/ C
  1. #include <rtthread.h>
    0 W# |8 F% A( [: v5 R; s, @% n
  2. #include <rtdevice.h># {; i: C: G7 a
  3. #include "drv_spi.h"                     //注意添加这个头文件,不然rt_hw_spi_device_attach 无法调用
    ) V( [: F4 s0 r

  4. 3 _7 M3 F0 A/ V& M
  5. #define    FLASH_DEVICE_NAME   "spi12"; X, U) I& q4 l

  6. 6 F" |2 j4 B" W+ A( R" Y! ~. g/ F
  7. struct rt_spi_device *spi_dev_flash;
    ; w( n: f" E) L9 n. t2 V5 D* f
  8. 3 a3 C. H, r1 c2 c! Q) |0 I; I* c
  9. * T' H7 _" J2 s& m
  10. struct rt_spi_message msg1, msg2;
    0 a  n6 L# _( W7 W. ]& V

  11. 2 p! h/ `2 X7 I6 x! [2 i- }
  12. & w0 B6 {0 j' z9 K1 c
  13. struct rt_spi_message *res;           
    # y1 ^( C8 c8 {7 e* w/ H- J
  14. . _& g+ R! l* ?6 x0 O8 E
  15. 5 x# o. @1 w) z" ]
  16. struct rt_spi_configuration cfg;( l: O2 I9 `! V3 n: z9 [: z* ~

  17. # ]: R& B$ d# \# k! b% v$ C
  18. % [4 k) O3 {5 d
  19. rt_uint8_t flash_id[] = {0x90, 0x24};8 w; m+ ~+ L- E/ ~

  20.   d+ w$ i; R0 W: o/ |
  21. //文档中提示使用rt_hw_spi_device_attach这个函数,但是没有码% A. T: B. N% R
  22. static int rt_hw_spi_flash_init(void)
    6 j- n$ v' p" K! ]/ b4 ^! g8 N
  23. {
    " w4 |; H+ O7 y3 e" N. Y# \
  24.    __HAL_RCC_GPIOC_CLK_ENABLE();
    + E6 p6 Q& C. k7 u+ f5 [
  25.          rt_hw_spi_device_attach("spi1", "spi12", GPIOC, GPIO_PIN_0);           //我用的野火指南者开发板,CS片选引脚为PC0
    / Q7 q0 i8 v6 `
  26.          return RT_EOK;+ E1 h( r- j, u) t
  27. }
    " i; o% o* Z8 @& b

  28. ! V7 W9 v2 h6 ~) p

  29. * F, W4 h1 O7 z- F8 P2 @6 O
  30. //测试代码,直接放在main 中了4 S9 M' t3 F, g2 ?
  31. int main(void)
    0 U" o  F& K4 |- Z* x+ f
  32. {   ( U" Y" t3 q' V# {& }$ ]( O2 f3 _# a
  33.           //挂载spi12 到 spi1
    7 R& a% {  X" h" i9 K9 R, ]# w" |6 w
  34.           rt_hw_spi_flash_init();  . s8 j1 @2 R- M: K& F
  35.         4 x2 t) @# H3 H5 ~
  36.           spi_dev_flash = (struct rt_spi_device *)rt_device_find(FLASH_DEVICE_NAME);! k, t- i, e. @1 A- Y8 x& m1 P5 {# r8 [
  37.         3 _$ }* N8 R( U/ x! T; Q7 J( e/ R
  38.           if(spi_dev_flash != RT_NULL)3 p6 c! Y  r" T( `1 M5 I9 e% H
  39.                 {9 C8 z: |2 p$ E* e3 a  B
  40.                    rt_kprintf("find the flash on the spi bus\n");5 Z( a/ L- z) N' {' d& D
  41.                 }
    6 {7 H4 u. }; H
  42.                 else- k7 E% A( Y7 ]- E1 o
  43.                 {, Z) k' `1 G! J! {& b
  44.                    rt_kprintf("can't find the device\n");
    ; }9 z' D! \- k( V
  45.                 }
    3 P. h, U& h1 Y4 B( f! h
  46.                 0 T& E3 b* M; |- m
  47.                 //配置spi( H. ^9 V( s/ c) l- N
  48.                 cfg.data_width = 8;
    6 \0 w/ \: G! Q( u% E  |
  49.                 cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
    ) h: V) [( L0 ?0 ~4 H2 t% o
  50.                 cfg.max_hz = 20*1000*1000;   //20Mhz
    / O- a4 v9 E# K# n7 v( v# A, l
  51.                
      x- e$ z/ y1 |5 S
  52.           rt_spi_configure(spi_dev_flash, &cfg);
    ) Q$ ]9 N+ I3 d! B. G
  53.                 ! D+ G% z7 ^3 j0 G
  54.                     //向设备发送数据
    # K9 U/ @& t# S3 @* ^  y- X1 `
  55.         msg1.send_buf   = &flash_id[0];
    4 q# y) c8 g& Q+ n
  56.         msg1.recv_buf   = RT_NULL;3 _: A' p- X# M4 S
  57.         msg1.length     = 1;: x3 v8 k% D9 Y' Y) ^6 r" ~
  58.         msg1.cs_take    = 1;
    * a. [- U; `% U5 v' C
  59.         msg1.cs_release = 0;
    ( l' V! \% X5 A* L% E5 u* r
  60.         msg1.next       = &msg2;6 k- m. ~- o4 W
  61.                 % v! ~, U: t+ j7 D& ?
  62.                     msg2.send_buf   = &flash_id[1];
    ) F' S$ ^  h9 F+ r7 z
  63.                     msg2.recv_buf   = RT_NULL;' ^; w5 w) C% }2 H6 q6 F
  64.                     msg2.length     = 1;; H$ k0 Y) W9 d2 Q! R( _: g
  65.                     msg2.cs_take    = 0;  U# X& i# ~0 J3 _1 [& K/ Z9 ?5 P  E
  66.                     msg2.cs_release = 1;
    9 q) \% E: R( ~  [+ o7 z1 e$ w/ C& V
  67.                                 msg2.next       = RT_NULL;
    ! t$ @- q1 C* F& K
  68.                      / K& o0 [  ]7 M) m
  69.               res =   rt_spi_transfer_message(spi_dev_flash, &msg1);   
    ( {, y' [# |5 F3 D  y
  70.                     
    ( i" c  q$ v- w7 j! n
  71.                     if(res == RT_NULL)
    + O& h* R- S9 V! E7 \/ X  h
  72.                                 {" a+ ~' i* b0 c7 @$ x- {
  73.                                    rt_kprintf("data transfer ok from spi12\n");
      W$ @9 }% A6 F' H* K& p
  74.                                 }' U3 e$ Y+ F' b8 d! o& O; A
  75.                
    5 k2 _1 R9 `+ f# c9 P4 L$ P; B- J
  76.    return 0;5 h: K0 k# F$ J8 W; b
  77. }0 [# E* |1 n" z- k  P
  78. ! H2 ^! H. ~( \  @% G

  79. ; ~2 k8 c% F# h- k- _- |
复制代码
最后的输出结果如下:6 T- _5 {9 ], _" i% q9 Z0 {! N1 n
24 (2).png
/ U- L0 [3 N6 j# }3 L, ~/ d6 U: X. E1 ~; E

+ n& E3 O% d0 E1 Y" q  @: G$ F  H9 K$ x1 e  T/ E

2 b  M/ r. w( P6 |0x90, 可以发现上面设置的20Mhz  是 spi 数据传输时的,clk 频率。
3 @3 m! y. m# a( {( z 24 (1).png & `- c6 O! u+ g7 b: s8 G- F  R( d9 X
0x24$ p1 [1 ^+ [1 X; i0 T
+ _6 o. E  O. |; i: `) g" y
spi12 设备 工作正常。
( r0 g/ A) M, D* f
, V$ v- X( I6 W. C1 Z) v8 |) i/ |, j! l( U& d! j
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-7-17 21:07:03 | 显示全部楼层
给楼主点赞!
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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