rt thread spi 使用

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

有没有尝试按照rt thread 官方文档的spi 案例敲代码,但是发现总线错误或者spi数据传输不成功的情况,那么下面可以看一下我的记录。
- Y' E3 [0 R4 S& a! o4 D4 D! m8 W/ A5 w- ^/ i- ?4 ^( P
  1. #include <rtthread.h>
    2 `" Y/ g2 D- y. o" Q
  2. #include <rtdevice.h>
    3 Z  U4 W' ^% s  a# G0 g- O
  3. #include "drv_spi.h"                     //注意添加这个头文件,不然rt_hw_spi_device_attach 无法调用" C$ j0 F( L- ?. a% l9 b9 X
  4. 3 X' C3 T  F/ ^. Y- Y4 B
  5. #define    FLASH_DEVICE_NAME   "spi12"
    & N1 C9 F% r2 @  m. H
  6. 0 u) T+ R  s# j, P% D. F
  7. struct rt_spi_device *spi_dev_flash;
    9 N7 g" D1 e' L% z7 U+ e4 d. r

  8. 0 @$ u$ w  `( j; L4 e! g
  9. . O- f9 n9 G9 N0 d% B
  10. struct rt_spi_message msg1, msg2;& a* l( r! S4 M( G4 J
  11. 3 G  a1 F# E! |

  12. 3 q( d' G2 c+ A) u; y& V
  13. struct rt_spi_message *res;           
    * }9 Z! N! S- T: L: |

  14. * ^9 S) p& J8 ]/ N1 P- L
  15. ; s+ ^+ x' e5 \# k4 Y
  16. struct rt_spi_configuration cfg;
      y% z' K: L9 f$ o3 K( t5 V( u
  17. 5 P/ _* n* j* O7 u
  18. # a* P- b) O+ P8 e8 a& Y
  19. rt_uint8_t flash_id[] = {0x90, 0x24};+ m* u: T6 N$ C6 O% w  Y. a

  20. ; u! g7 D  C' P" l
  21. //文档中提示使用rt_hw_spi_device_attach这个函数,但是没有码' q3 h4 v7 R: R' s6 s* i, V9 A
  22. static int rt_hw_spi_flash_init(void)
    6 }) Y1 F+ [3 m% r& o
  23. {
    6 g, [" \6 c9 q8 _0 d
  24.    __HAL_RCC_GPIOC_CLK_ENABLE();
    # F% T% t" B( j' `4 k/ G  T
  25.          rt_hw_spi_device_attach("spi1", "spi12", GPIOC, GPIO_PIN_0);           //我用的野火指南者开发板,CS片选引脚为PC01 Q0 F2 u- u3 [% J. l( `
  26.          return RT_EOK;
    2 d+ L- x! o* B( F5 M
  27. }8 F( ?  m7 z3 |3 C6 q. a% g/ @

  28. 4 b$ q* P$ s$ \* @% z

  29. " o8 z) }/ ?$ e1 T! l
  30. //测试代码,直接放在main 中了
    $ ~# o- {# B9 a. v( n% _
  31. int main(void), N: f5 t6 f  C" P4 g' z: q
  32. {   . l- s5 F# Q8 U5 E3 O9 N- O
  33.           //挂载spi12 到 spi13 [. b3 A9 L& I& H: ~% R
  34.           rt_hw_spi_flash_init();  
    0 u$ j5 U/ `9 Z. n' s1 s
  35.         2 H8 E" D6 y7 `5 E; |1 B0 E0 w
  36.           spi_dev_flash = (struct rt_spi_device *)rt_device_find(FLASH_DEVICE_NAME);
    8 K" R! \5 ^/ f/ p% Y4 |: Y
  37.         6 ?: ]& u1 o: z* W" o8 K
  38.           if(spi_dev_flash != RT_NULL); @2 \( ~4 T  ?7 ?
  39.                 {
    & a4 `: j  s% W6 r4 H
  40.                    rt_kprintf("find the flash on the spi bus\n");6 t! l0 h! E' W3 b4 [' G5 l
  41.                 }
    " j$ R6 g* e0 q, C% k" s  l4 r/ k0 h
  42.                 else6 O7 `9 h/ z% C
  43.                 {
    + k- I; ~% m( }5 E* i7 N
  44.                    rt_kprintf("can't find the device\n");
    1 M, ]2 }# j- _. k$ H
  45.                 }8 {6 \0 r& ?/ X+ f: \8 j
  46.                
    1 A# L8 Y8 E/ c
  47.                 //配置spi( ~( n0 M0 R8 S  B
  48.                 cfg.data_width = 8;; A- g6 U8 c' h7 I
  49.                 cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;1 z% W) d' R3 N5 I' R3 ]
  50.                 cfg.max_hz = 20*1000*1000;   //20Mhz6 t; _- U. E; c/ J$ U
  51.                 7 Y: G% M0 h8 W
  52.           rt_spi_configure(spi_dev_flash, &cfg);% E* G  I2 ^7 o8 o0 L
  53.                
    * f6 s& M& g+ i' m
  54.                     //向设备发送数据2 n' Q2 {* z$ l% Y! c1 \( A
  55.         msg1.send_buf   = &flash_id[0];8 }9 |' d9 f' ]9 R  G! Z. [
  56.         msg1.recv_buf   = RT_NULL;7 h8 N9 k# l( A! i) h1 S/ [
  57.         msg1.length     = 1;
    # F+ y. g+ O3 X% a6 k" t  C0 f
  58.         msg1.cs_take    = 1;8 N1 {# n3 \" |1 G, ]. B$ [5 C
  59.         msg1.cs_release = 0;: ?# M. T, p5 z, \$ {* R5 U" x7 H
  60.         msg1.next       = &msg2;- Z3 G0 h' g4 `& W+ H2 z
  61.                
    : a6 C. i% X) p/ a2 Z1 Q3 r; M
  62.                     msg2.send_buf   = &flash_id[1];# i7 ?* x; H6 y, R# @% g
  63.                     msg2.recv_buf   = RT_NULL;/ v  S% [8 N; f/ g1 d, O% ^# {' p
  64.                     msg2.length     = 1;$ {0 }6 \6 @" n, D
  65.                     msg2.cs_take    = 0;& ^# \. s0 J# A- y" @3 t0 W
  66.                     msg2.cs_release = 1;" J# ~9 y' D6 D7 N0 S0 M
  67.                                 msg2.next       = RT_NULL;
    & o, s$ V# \+ L! U. a5 Y) ^
  68.                     
    . F* l+ n  e4 P
  69.               res =   rt_spi_transfer_message(spi_dev_flash, &msg1);   9 V. G8 ~: D7 {0 i0 f# n8 m) A
  70.                     
    / w! E4 A) x0 |
  71.                     if(res == RT_NULL)& ^6 ~9 J: h- [8 L* [$ r: O0 D- B
  72.                                 {& U+ }7 n6 C( x  w- Y
  73.                                    rt_kprintf("data transfer ok from spi12\n");5 S8 L% _5 W4 v  l  s
  74.                                 }
    6 }( i5 ^. K8 B2 V! W4 C% V
  75.                
    0 [0 r  y" i6 m# I' o5 C# M- S1 I
  76.    return 0;
    4 }* b, ]8 C3 W* J
  77. }/ f& W& g7 ]: x: B6 v
  78. * m  |2 m+ L  ]  ~
  79. ) `0 U+ Y& l4 v# F! P8 x& v. _- {4 z
复制代码
最后的输出结果如下:
* k1 }" U; Q. m' x8 \  K# I 24 (2).png
# J9 f: s" g" w6 n  I$ f, a% _) `2 N$ d) G' ^5 r( I

2 h( n+ t8 n  [8 J9 U
$ R% Y3 }7 ^" e4 Y
: t2 z" N  M+ }6 z3 A0x90, 可以发现上面设置的20Mhz  是 spi 数据传输时的,clk 频率。
1 r' p4 i: Y, ~5 O& w$ X; ~. _/ ]' E 24 (1).png
2 S# n9 G  a. r0x242 ]0 S/ K! M4 f; ~% e$ n) }
; x$ A  m/ b3 S0 g; h# x
spi12 设备 工作正常。
  p( ~( {9 f: r, k9 b8 p; q7 i: D" T- Z: i% K5 K

" v0 D4 c- c2 U+ `+ E. ]: y/ i* c& o
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-7-17 21:07:03 | 显示全部楼层
给楼主点赞!
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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