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

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

[复制链接]
kevin0129 发布时间:2015-1-11 11:10
本帖最后由 kevin0129 于 2015-1-11 14:14 编辑

      最近看到沐紫老师手上有多余的nucleo stm32f072的板,果断以之前的活动价购买了一块,之前研究过stm32f103,当使用072的时候发现它的这个HAL库和标准库差别十分大,于是便研究了一下这个HAL库,之前使用了一点这个cube MX,发现这个配置软件非常好用,相对于103来说,我们不用再来自己动手配置外设了,直接设置几个参数就够了,今天来介绍下cube mx生成一个带I2C和SPI的工程的步骤(之前用103没怎么调通过I2C,一直软件模拟,这次尝试下,发现没有出现I2C bug,应该不是侥幸,毕竟测试了四天四夜.......)
1.打开cubemx后选择nucleo f072的板子,这个很好找
2.配置外设的引脚
1.jpg
I2C就直接选择I2C模式
2.jpg
SPI设备我用的一块显示屏,没必要去读它,我就直接选择了主机只发送的模式,如果要读写的话就不要选择这个了
3.jpg
I2C的引脚更改,我看到板子上的SCL和SDA在PB8和PB9上果断把默认的引脚改成PB8和PB9(这个其实可以不用改的,我只是为了接线方便)
4.jpg
接下来配置几个I/O做显示屏的控制I/O,直接都设置为输出就够了!
5.jpg
接下来配置时钟,我自己焊了一个HSE晶振,所以选择了外部晶振,配置系统时钟为48M,还有设置I2C的时钟为系统时钟
6.jpg
接下来是I2C的配置,设置为标准模式100k速度, 上升沿400ns下降沿100ns,这个地方的设置和f103的I2C配置有点不一样,我没有选择中断和DMA最后修改下I2C的GPIO配置就够了(和配置其他gpio一样)
7.jpg
SPI的设置更简单只需设置数据长度和速度就够了,同样没有用DMA和中断,只需配置I/O就够了
最后去配置一下那几个控制I/O就够了,这样就可以生成工程了
8.jpg
生成工程的时候我选择了这个,我不喜欢把所有的代码都放到main.c文件里面,看起来很麻烦,这一项是单独生成对应的外设.c和.h文件,看起来比较舒服
生成工程完毕后,外设都基本设置好了,主要配置下I2C的读写程序和SPI的写程序就够了
  1. void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
  2. {
  3.     uint8_t TxData[2] = {REG_Address,REG_data};
  4.     while(HAL_I2C_Master_Transmit(&hi2c1,I2C1_WRITE_ADDRESS,(uint8_t*)TxData,2,1000) != HAL_OK)
  5.     {
  6.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
  7.                 {
  8.                   Error_Handler();
  9.                 }
  10.     }
  11. }
复制代码


这是I2C的写单个字节的程序
  1. uint8_t* Double_ReadI2C(uint8_t REG_Address)
  2. {
  3.    
  4.     while(HAL_I2C_Master_Transmit(&hi2c1,I2C1_WRITE_ADDRESS,&REG_Address,1,500) != HAL_OK)
  5.     {
  6.          if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
  7.                 {
  8.                   Error_Handler();
  9.                 }
  10.     }
  11.    
  12.     if(HAL_I2C_Master_Receive(&hi2c1,I2C1_READ_ADDRESS,(uint8_t*)RxBuffer,2,1000) != HAL_OK)
  13.     {
  14.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
  15.                 {
  16.                   Error_Handler();
  17.                 }
  18.     }
  19.     return RxBuffer;
  20. }
复制代码

这是I2C读两个字节的 程序,主要写单个字节的时候需要取地址(®_Address),由于这个HAL_I2C_Master_Transmit()这个函数的输入参数,数据那一项是一个指针,所以如果传单个字节必须取地址,有一个PDF文件介绍了HAL库函数的使用,但是全英文的,可以看看提高自己的英文水平,主要的两个I2C函数都在这里,可以直接调用HAL 的API,用起来非常方便!
  1. void LCD_Send_Data(unsigned char Data)
  2. {
  3.         LCD_CS_L();
  4.         LCD_DC_H();  
  5.         HAL_SPI_Transmit(&hspi1,&Data,1,100);
  6.    
  7.    LCD_CS_H();
  8.         LCD_DC_H();  
  9. }
  10. void LCD_Send_CMD(unsigned char CommandByte)
  11. {
  12.         LCD_CS_L();
  13.         LCD_DC_L();  
  14.     HAL_SPI_Transmit(&hspi1,&CommandByte,1,100);
  15.    LCD_CS_H();
  16.         LCD_DC_H();  
  17. }
复制代码

这是SPI的写函数,一个发命令,一个发数据,也是调用了HAL的API  HAL_SPI_Transmit()这个函数,同样注意发一个字节的时候也要去地址
主要的东西都完成了,只要把对应的LCD驱动和I2C设备的驱动复制过来,然后把读写接口对上,工程就完成了。
本来自己的程序没有问题,但是调试的时候发现I2C一直卡死,还以为时出现了I2C,郁闷了一段时间,其实是自己没看电路图,造成视觉上的蒙蔽
9.jpg
有没有人以为这里就是对应的SCL和SDA,我之前一直把SCL和SDA插在这里,结果I2C就一直卡死,表示自己给自己眼睛坑了,结果去查电路图才发现
10.jpg
SCL和SDA分别是第二排和第三排靠内的那两个,换下接口后I2C就立马工作了,表示自己在这个上面把自己坑了半天........
STM32F0的HAL库用户手册_部分1.pdf (6.34 MB, 下载次数: 1857)
收藏 13 评论58 发布时间:2015-1-11 11:10

举报

58个回答
linshifaa 回答时间:2015-1-11 12:31:58
我的是F334的还没开工!!
wambob 回答时间:2015-1-11 13:14:49
恭喜你,不出毛病,继续找毛病,找到BUG你就彻底懂了
kevin0129 回答时间:2015-1-11 13:31:15
我现在板子还没断电,不知道什么时候会死机,感觉有点浪费电.......
adersonl 回答时间: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库什么时候才有!

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版