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

cube MX创建I2C和SPI的应用(连续测试4天,未出BUG)  

[复制链接]
kevin0129 发布时间:2015-1-11 11:10
本帖最后由 kevin0129 于 2015-1-11 14:14 编辑 . e5 n3 ~9 m: [9 H* }& j' b

# j5 Q9 G" E9 ^; r7 \2 v: ~9 h      最近看到沐紫老师手上有多余的nucleo stm32f072的板,果断以之前的活动价购买了一块,之前研究过stm32f103,当使用072的时候发现它的这个HAL库和标准库差别十分大,于是便研究了一下这个HAL库,之前使用了一点这个cube MX,发现这个配置软件非常好用,相对于103来说,我们不用再来自己动手配置外设了,直接设置几个参数就够了,今天来介绍下cube mx生成一个带I2C和SPI的工程的步骤(之前用103没怎么调通过I2C,一直软件模拟,这次尝试下,发现没有出现I2C bug,应该不是侥幸,毕竟测试了四天四夜.......)
' c( x3 N$ C& `4 w: H1.打开cubemx后选择nucleo f072的板子,这个很好找6 X$ P; R" R6 E7 ^. x9 t
2.配置外设的引脚
& g, S7 C" c! `. O- B+ V8 d 1.jpg
6 X* b! J, y5 {3 t9 i- m* d- HI2C就直接选择I2C模式6 f% i. z/ [- E$ `( o" B
2.jpg
4 [; K3 |  a1 d1 C! ]% O: Y$ q- \  qSPI设备我用的一块显示屏,没必要去读它,我就直接选择了主机只发送的模式,如果要读写的话就不要选择这个了6 ]9 l9 s" U: t: a( C) n, ^
3.jpg
* Q* Z% K. s- O& lI2C的引脚更改,我看到板子上的SCL和SDA在PB8和PB9上果断把默认的引脚改成PB8和PB9(这个其实可以不用改的,我只是为了接线方便)5 U# P( S1 o- A: U; B$ k
4.jpg " Y$ }. w4 l& A) D5 \- m
接下来配置几个I/O做显示屏的控制I/O,直接都设置为输出就够了!
0 f1 M1 W5 c9 O/ Q" t' ^* d2 r1 h 5.jpg " Y7 d1 W: F9 |
接下来配置时钟,我自己焊了一个HSE晶振,所以选择了外部晶振,配置系统时钟为48M,还有设置I2C的时钟为系统时钟) w3 J$ Z4 i! R; ~, q
6.jpg " p, Y- f$ {2 h1 B2 r) `
接下来是I2C的配置,设置为标准模式100k速度, 上升沿400ns下降沿100ns,这个地方的设置和f103的I2C配置有点不一样,我没有选择中断和DMA最后修改下I2C的GPIO配置就够了(和配置其他gpio一样)' j- \7 W- t" E
7.jpg ! {8 q5 @  U0 n; C
SPI的设置更简单只需设置数据长度和速度就够了,同样没有用DMA和中断,只需配置I/O就够了0 V5 f. {0 }/ L7 y0 m" [5 p+ Q! Q
最后去配置一下那几个控制I/O就够了,这样就可以生成工程了
4 Z0 C, V! M; I) `* e# _ 8.jpg # C6 j  z/ ?# i2 w8 k
生成工程的时候我选择了这个,我不喜欢把所有的代码都放到main.c文件里面,看起来很麻烦,这一项是单独生成对应的外设.c和.h文件,看起来比较舒服+ Y* Q3 B* S9 y; x& o. f
生成工程完毕后,外设都基本设置好了,主要配置下I2C的读写程序和SPI的写程序就够了
3 s$ L8 M! d' k6 r! v% `2 `. n% b5 i
  1. void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)8 d7 s  `$ M( u; K
  2. {' v' u2 R8 I0 t  a4 w+ B8 a
  3.     uint8_t TxData[2] = {REG_Address,REG_data};
      w4 u4 w$ c- h8 [, h% ]% _) `7 U1 t6 E
  4.     while(HAL_I2C_Master_Transmit(&hi2c1,I2C1_WRITE_ADDRESS,(uint8_t*)TxData,2,1000) != HAL_OK)- q" H7 U2 J, y2 l
  5.     {
    0 C+ d$ j6 w8 _/ S; d
  6.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    5 M7 \" c$ q1 W9 w" k" z) L
  7.                 {/ h: ]0 i& `9 u: r9 N# d7 P4 l
  8.                   Error_Handler();$ K8 W6 m% {7 H& K+ ?! v' q7 K7 j: \
  9.                 }
    7 ^7 r2 Q* h1 k% h! Q" @& P
  10.     }
    9 g% |& q, s' R; V" I
  11. }
复制代码
6 x9 D7 }1 o: y& u- d

$ ~& L6 u4 B4 I& T5 X6 i这是I2C的写单个字节的程序
+ r2 M- W; y' z7 _% P
  1. uint8_t* Double_ReadI2C(uint8_t REG_Address)' K2 _' Q3 m  J, S1 d) Y( M
  2. {
    " k( F/ U' n$ e- f! _- \: N& o- l
  3.     % U4 d9 f0 C5 r& x
  4.     while(HAL_I2C_Master_Transmit(&hi2c1,I2C1_WRITE_ADDRESS,&REG_Address,1,500) != HAL_OK)
    ! F* r- @- s( I& g, [5 L1 L/ L
  5.     {
    7 x) a3 A3 K0 `5 j( i
  6.          if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)7 ^+ q, ^# e' f0 G0 Y
  7.                 {
    " _; m( z3 R/ p
  8.                   Error_Handler();
    & r) D) \. p! e' C, q& G' [
  9.                 }/ y) H" b) N9 K
  10.     }
    4 \% Q. U$ `  p. j; I
  11.    
    1 Y2 E- f7 A! {) E
  12.     if(HAL_I2C_Master_Receive(&hi2c1,I2C1_READ_ADDRESS,(uint8_t*)RxBuffer,2,1000) != HAL_OK)( }+ s" Y# E3 ]* `' i: k
  13.     {
    / ]# D, B9 D* y4 v
  14.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)# I7 V0 Z' d- v4 d8 A8 @
  15.                 {
    # A- b* D8 N+ @+ ?
  16.                   Error_Handler();
    $ R1 h9 o, A- P# ?$ O* M
  17.                 }3 `4 x0 A  w2 X0 `! F
  18.     }
    ) u7 i3 F! h+ E& |, A- X  z5 M
  19.     return RxBuffer;, l8 f' z& O7 m4 M4 d
  20. }
复制代码
0 \" q& n5 Q3 q! P& c5 ~
这是I2C读两个字节的 程序,主要写单个字节的时候需要取地址(®_Address),由于这个HAL_I2C_Master_Transmit()这个函数的输入参数,数据那一项是一个指针,所以如果传单个字节必须取地址,有一个PDF文件介绍了HAL库函数的使用,但是全英文的,可以看看提高自己的英文水平,主要的两个I2C函数都在这里,可以直接调用HAL 的API,用起来非常方便!3 g- q5 H6 G7 i* V" h+ k1 o
  1. void LCD_Send_Data(unsigned char Data)
    % g8 i1 Q  L6 [7 M9 Y
  2. {
    5 c) O+ ~; R, M( d9 L% m
  3.         LCD_CS_L();0 {1 a, K1 ?! \2 V% E
  4.         LCD_DC_H();  , E$ J9 x' w* D; Q. H/ B
  5.         HAL_SPI_Transmit(&hspi1,&Data,1,100);6 u4 }1 [$ N/ O* v$ O/ J# J1 [
  6.    
    7 i8 M# g) L8 t# n' G  `
  7.    LCD_CS_H();  }$ H) c4 B& A3 l/ C1 f
  8.         LCD_DC_H();  5 p1 t4 [% b. m8 a' W4 j5 @
  9. }
    + X! [  F# o& H2 [1 R- p) K
  10. void LCD_Send_CMD(unsigned char CommandByte)
    ' B& J  e. C9 X7 c
  11. {
    ' O' h. d" O( z0 D
  12.         LCD_CS_L();
    # W& _8 n7 ]$ G
  13.         LCD_DC_L();  
    / g# e; d- k1 k' Y2 w: b5 L
  14.     HAL_SPI_Transmit(&hspi1,&CommandByte,1,100);3 f4 d" @% g8 ~9 J9 s
  15.    LCD_CS_H();" r1 T' i2 F/ l9 A3 d- g
  16.         LCD_DC_H();  
    4 f1 \$ z) E! B" F
  17. }
复制代码

, L( h# n8 r. [, O7 T5 q' z4 T这是SPI的写函数,一个发命令,一个发数据,也是调用了HAL的API  HAL_SPI_Transmit()这个函数,同样注意发一个字节的时候也要去地址
% A2 W# U) H" t) C主要的东西都完成了,只要把对应的LCD驱动和I2C设备的驱动复制过来,然后把读写接口对上,工程就完成了。0 B6 y% C! m6 X: ]
本来自己的程序没有问题,但是调试的时候发现I2C一直卡死,还以为时出现了I2C,郁闷了一段时间,其实是自己没看电路图,造成视觉上的蒙蔽5 S0 R2 v7 g/ f6 o
9.jpg
/ \7 ?# c# F& W" F有没有人以为这里就是对应的SCL和SDA,我之前一直把SCL和SDA插在这里,结果I2C就一直卡死,表示自己给自己眼睛坑了,结果去查电路图才发现
% z+ q+ `1 d. K4 S2 E5 P/ M 10.jpg
- s/ @  X1 S+ L1 r( kSCL和SDA分别是第二排和第三排靠内的那两个,换下接口后I2C就立马工作了,表示自己在这个上面把自己坑了半天......... e5 k7 x# ?! q4 E9 j
STM32F0的HAL库用户手册_部分1.pdf (6.34 MB, 下载次数: 1865)
收藏 14 评论58 发布时间:2015-1-11 11:10

举报

58个回答
R2D1 回答时间:2015-3-3 18:24:56
feiante 发表于 2015-1-13 10:38) I7 i7 h0 U6 V5 T/ f5 G6 ^8 V. z4 \
我在做SPI时,也是用HAL_SPI_Transmit(),发送的数据是一个数组,为什么我连接上逻辑分析仪看,都是FF呢 ...
+ c% a4 D7 f5 m
我的IIC也显示为“FF”,原因是每次断电或复位产生的信号干扰被误读。
IWOS2610 回答时间:2015-7-9 19:42:00
kevin0129 发表于 2015-1-12 11:06
. Q+ w9 O# P2 Q4 o9 o& a2 @F1的HAL库谁知道什么时候会出,感觉ST有点放弃了F1一样!

. @, i8 i' i* Y木有放弃啊,已经出来了,F7现在都支持了
) s2 x5 I  y% W: b. f! ?, Y# j9 }http://www.st.com/web/en/catalog ... _searchtype=keyword
snjeym 回答时间:2016-10-25 22:25:04
snjeym 发表于 2016-10-23 23:31
: s: {0 ]0 Y6 r2 J你好,同样是这块板,他的SPI基于HAL库的接受功能你试了没有?就是HAL_SPI_Receive或者HAL_SPI_TransmitRec ...
0 Z. k! \- E3 H0 R% B
已解决,cube设置错误,把SPI定义成了单发。
麟狮蕟 回答时间:2015-1-11 12:31:58
我的是F334的还没开工!!
wamcncn 回答时间:2015-1-11 13:14:49
恭喜你,不出毛病,继续找毛病,找到BUG你就彻底懂了
kevin0129 回答时间:2015-1-11 13:31:15
我现在板子还没断电,不知道什么时候会死机,感觉有点浪费电.......
aderson 回答时间:2015-1-11 14:02:43
BUG问题楼主有遇到过吗?
kevin0129 回答时间:2015-1-11 14:08:03
目前还没有.......
晓枫VS枯叶 回答时间:2015-1-11 14:19:37
看来一下,感觉HAL比标准库简单,但是相对于MBED的来说还是复杂了一下,如果mbed能把cubemx的图形界面引脚配置吸收进去的话感觉就完美了!
smcdh 回答时间:2015-1-11 15:30:24
我还在用MDK,看来要学一下cube MX
kevin0129 回答时间:2015-1-11 15:50:07
mbed还没看过,不过看到这块板子好像支持mbed,先学下这个HAL库再去看mbed吧!
琴箫雨霁 回答时间:2015-1-11 15:58:08
I2C我也经常用到,不过在使用f103时还是更倾向于使用模拟的,不知道f1系列的HAL库什么时候才有!
kevin0129 回答时间:2015-1-12 11:06:13
F1的HAL库谁知道什么时候会出,感觉ST有点放弃了F1一样!
琴箫雨霁 回答时间:2015-1-12 12:47:30
应该不会放弃吧,F1的出货量现在这么高,ST怎么会有钱不赚呢。
电子松鼠 回答时间:2015-1-12 14:56:38
楼主写的很详细,受教啦。,不过我之前用cubemx经常自动闪退,大家有遇到类似情况吗?
zhous 回答时间:2015-1-12 15:07:22
点赞!!!!
fjjjnk1234 回答时间:2015-1-12 15:24:45
这工具确实挺方便的
1234下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版