rt thread spi 使用

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

有没有尝试按照rt thread 官方文档的spi 案例敲代码,但是发现总线错误或者spi数据传输不成功的情况,那么下面可以看一下我的记录。
1 X4 G& `, ]& H. g. s, k' [. S2 j- z+ ]* C; ~2 A
  1. #include <rtthread.h>
    : r8 A) r3 h; T# s% J
  2. #include <rtdevice.h>
    1 \' c) z9 ^  f7 D& S4 e0 b
  3. #include "drv_spi.h"                     //注意添加这个头文件,不然rt_hw_spi_device_attach 无法调用
    7 Y- p; p5 W) u2 D
  4. ! ]- [8 c4 R) t9 ^; j" g1 t2 R
  5. #define    FLASH_DEVICE_NAME   "spi12"( x, h: ~7 t( Z$ r3 m5 Q
  6. 9 U3 x( @, f4 D5 n/ F1 D4 L' ?
  7. struct rt_spi_device *spi_dev_flash;" o4 m/ b  [$ I& ?

  8. & x3 m' I# j6 X6 z9 |

  9. ; E5 o; ^  i( {6 q6 o3 v2 q: {
  10. struct rt_spi_message msg1, msg2;
    6 Z+ M8 {2 I! R& n+ L, R( W
  11. 5 U7 |& M, V3 k2 j1 X

  12. & r0 h$ }" g( k# U' l7 z  _6 t
  13. struct rt_spi_message *res;           9 b& y( l7 l7 C9 Z

  14. ! f7 I0 E8 O* H8 y
  15. : s# l' P+ s& K2 w# p# |
  16. struct rt_spi_configuration cfg;
    7 B5 F( L$ p$ W: r+ j1 p3 [
  17. 8 y( a2 R  ]7 \0 S/ c( M* q
  18. - |2 x* `& E7 U" _+ Y; r
  19. rt_uint8_t flash_id[] = {0x90, 0x24};
    4 U# _8 J3 X, W0 F; d! s- G

  20. ) u6 D7 Y# P+ @
  21. //文档中提示使用rt_hw_spi_device_attach这个函数,但是没有码
    1 ]3 k$ h- d8 M. D; F& T, o
  22. static int rt_hw_spi_flash_init(void)( _5 v4 V7 M. k2 Z, A7 Q
  23. {( p  _7 ~' Q4 X. D
  24.    __HAL_RCC_GPIOC_CLK_ENABLE();* }4 f" W" u' K1 m1 N0 ^
  25.          rt_hw_spi_device_attach("spi1", "spi12", GPIOC, GPIO_PIN_0);           //我用的野火指南者开发板,CS片选引脚为PC0
    % D) d- `1 j% v: F, K
  26.          return RT_EOK;. l3 h* b- p5 K% k
  27. }& Z3 u4 x$ Q0 h, V9 b9 C: v, p6 t! R

  28. 9 U: h9 z, S' U$ I- w- t

  29. 4 ^8 q% P# N9 g# u
  30. //测试代码,直接放在main 中了
    1 i. E) @1 K; k4 ]; t( o' B. f8 D9 m
  31. int main(void): ^" H% {4 f1 H) d% c4 J
  32. {   1 X3 J. J1 A0 Y5 D+ m
  33.           //挂载spi12 到 spi1
    3 ^5 {" d7 u; v- S1 r6 P, P
  34.           rt_hw_spi_flash_init();  2 {0 k% _& n( W* u6 q
  35.        
    # B- w8 s. @# }
  36.           spi_dev_flash = (struct rt_spi_device *)rt_device_find(FLASH_DEVICE_NAME);# C1 n- e/ X5 s& ]2 b  \; s) X$ S3 y7 C
  37.         9 w! G( u4 j& z3 S  k$ `6 a7 e
  38.           if(spi_dev_flash != RT_NULL)
    3 i. R- K5 u6 F$ m" g$ b; f, `
  39.                 {
    ) o0 r: V5 Z1 N5 a1 }. l- t# Z
  40.                    rt_kprintf("find the flash on the spi bus\n");: [8 p: `2 Y" Y+ i
  41.                 }& F* q1 u: y; l: N# r$ y
  42.                 else( M. i# l9 P. P) r  |2 W
  43.                 {, C0 G; }! @! z9 ^# q( ?
  44.                    rt_kprintf("can't find the device\n");4 X* l/ K2 E& [# \6 ]4 G" {
  45.                 }# d1 k( l! b. b
  46.                 7 F& d8 J, b3 e/ Q
  47.                 //配置spi1 [1 E1 Q% U3 t, j7 d! J
  48.                 cfg.data_width = 8;+ G% v" X  P$ W" Y- O+ A
  49.                 cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;7 H# V; _2 W0 L7 S8 W  }
  50.                 cfg.max_hz = 20*1000*1000;   //20Mhz
    ! }: X2 r) e+ b- Y+ _
  51.                 8 V) U3 r; K' i# F
  52.           rt_spi_configure(spi_dev_flash, &cfg);
    * `+ F# p/ `. F) }9 c0 M5 t9 P  `
  53.                 7 b" w) _* y2 T* o
  54.                     //向设备发送数据5 i) C  ^. ^, d2 |
  55.         msg1.send_buf   = &flash_id[0];
    7 w; Z5 I5 ?' L# u0 N
  56.         msg1.recv_buf   = RT_NULL;) @; E; F% M- G# u$ F/ Y* M
  57.         msg1.length     = 1;
    + C% W6 M, A$ C/ l' T
  58.         msg1.cs_take    = 1;
    % p5 C1 @% U, n' n; N/ h
  59.         msg1.cs_release = 0;; F( i% T( b/ [5 W5 M$ Y
  60.         msg1.next       = &msg2;
    ) J' q3 a, ^, L. ]7 d3 j
  61.                
    1 X- q3 l* `2 i
  62.                     msg2.send_buf   = &flash_id[1];
    + {& `& B' T' V* K( {* b9 Y) _, r
  63.                     msg2.recv_buf   = RT_NULL;
    ' t7 u2 L1 q. V
  64.                     msg2.length     = 1;+ d$ y) i1 f4 ]6 a
  65.                     msg2.cs_take    = 0;
    % s$ i% O( r) g
  66.                     msg2.cs_release = 1;3 {# i9 x- w$ {2 ?2 L
  67.                                 msg2.next       = RT_NULL;
    ; M' I1 H4 U  v  N$ f
  68.                     
    5 P: r/ ^, g  Q; c4 t# l( @* r
  69.               res =   rt_spi_transfer_message(spi_dev_flash, &msg1);   % z7 O7 G) E5 B; Y7 `+ A
  70.                     
    $ d+ t! Y) L% M3 q/ m9 b
  71.                     if(res == RT_NULL)
    0 |3 o6 x4 C4 a5 u5 a
  72.                                 {
    : f- w) T( F* G# f
  73.                                    rt_kprintf("data transfer ok from spi12\n");" j  j) b5 i* y2 _2 L. [, @
  74.                                 }4 e% X$ g% {5 O2 P) k
  75.                 ' ]( i/ p+ G+ G9 k
  76.    return 0;
    9 _! h6 Q  p, o. u; F
  77. }
    4 G! ]5 W6 L- M9 ~# N
  78.   K& L/ c7 ~# j  p9 V% V7 I
  79. # f. |' n1 Y6 {0 z1 n" o
复制代码
最后的输出结果如下:+ U# Z- s& _- B# P
24 (2).png
$ B/ Y7 z6 w$ h1 t- M. y! Z8 |4 G" Z2 |2 m% P% z8 G) }
2 }  l# H0 f/ i7 y7 ]

, ^* ^) E/ C: H1 `6 c$ h. u' P! W" F
! `  t3 B& N: i) d) }0x90, 可以发现上面设置的20Mhz  是 spi 数据传输时的,clk 频率。& I& u# G) \% d! Z
24 (1).png
( A+ y# \( \6 [: G2 V) q0x24
4 J' H* s/ Q9 X5 [3 x6 r
$ q7 }2 m9 C5 hspi12 设备 工作正常。/ {5 Y8 S6 E  U. Q/ w8 u

% T  y. h# {4 A" g) \
* z0 F' [3 a/ F: a) @# [
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-7-17 21:07:03 | 显示全部楼层
给楼主点赞!
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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