打印
[STM32F1]

TM32F103RB通过2CS驱动ADXL345( STM32Cube函数库)

[复制链接]
1892|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljxpro|  楼主 | 2016-1-29 11:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1、通读STM32F1xx10章,阅读ARM Cortex-M3 内核编程手册的主要部分,对内核运行方式有所了解,但对解决I2C问题帮助不大。使用标准库的主要问题是:一、不能很好的解决I2C初始化死锁;二、不知道如何结合ADXL345I2C时序和STM32标准库对I2C的操作。虽然掌握了C8051FI2C中断状态机方法,但对掌握STM32I2C没太大指导作用。
2、网上经常见同好们讲STM32I2C有问题,这个芯片系列出了很长时间了,应用广泛,这个说法不太可能是正确的。得到的可运行的示例都是模拟IO的,没有使用I2C硬件机制,水平不高,资源浪费。
3、wgsxsm的方法(https://bbs.21ic.com/forum.php?mo ... p;highlight=ADXL345)讲到使用STM32Cube。之前看到过相关的介绍,有图形化配置界面,下载后了解了一下,使用的是HAL(硬件抽象层)库,和标准库区别很大。研究后确认这是SMT32软件开发的大方向,忘记在STM32Cube哪个英文资料中看到一句话,意思是说“STM32CubeST重点发展的软件开发方法,标准库还在更新,但不建议在新的项目中再使用标准库”,故弃标准库转STM32Cube
4、STM32CubeMX配置STM32I2C很简单,2分钟可完成。wgsxsm的方法(https://bbs.21ic.com/forum.php?mo ... p;highlight=ADXL345)提到的例子使用的是轮询方式(不要在图形配置中将SCLSDA配置成中断方式既可使用轮询IO函数)。使用的函数是HAL_I2C_Master_TransmitHAL_I2C_Master_ReceiveHAL_I2C_Slave_ReceiveHAL_I2C_Slave_Transmit,这个例子是用于两块开发板通过I2C通讯的。wgsxsm给出了读写ADXL345的源代码,使用了上述函数,详细内容请见wgsxsm的方法(https://bbs.21ic.com/forum.php?mo ... p;highlight=ADXL345)的附件zip文件。我是在摸索出内容5后才下载到wgsxsm的附件的,给了我另一种思路,对HALI2C使用加深了理解。
在此感谢wgsxsm的分享!
5、经过研究使用HAL_I2C_Mem_ReadHAL_I2C_Mem_Write可以直接完成ADXL345的寄存器读写操作。比wgsxsm的方法(https://bbs.21ic.com/forum.php?mo ... p;highlight=ADXL345)更简洁一点。代码如下:
//ADXL345器件ID
void ADXL345_Read_ID(uint8_t* a)
{
        HAL_I2C_Mem_Read(&hi2c2, ADXL345ADD, DEVICE_ID, 1, a, 1, 35);       
}
//ADXL345初始化
uint8_t ADXL345_Init( void )
{
        uint8_t data;
        //测试I2C是否通畅
        HAL_I2C_Mem_Read(&hi2c2, ADXL345ADD, DEVICE_ID, 1, &data, 1, 35);
        if( data == 0xE5 )
        {
                //量程16g,右对齐,13位全分辨率
                data = 0x0B;
                HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, DATA_FORMAT, 1, &data, 1, 35);
                //输出速率25Hz
                data = 0x08;
                HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, BW_RATE, 1, &data, 1, 35);
                //使能测量
                data = 0x08;
                HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, POWER_CTL, 1, &data, 1, 35);
                //不使用中断
                data = 0x00;
                HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, INT_ENABLE, 1, &data, 1, 35);
                //X偏置
                data = 0x00;
                HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, OFSX, 1, &data, 1, 35);
                //Y偏置
                data = 0x00;
                HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, OFSY, 1, &data, 1, 35);
                //Z偏置
                data = 0x00;
                HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, OFSZ, 1, &data, 1, 35);
                return 0;
        }
        return 1;
}
//读加速度值
void ADXL345_ReadXYZ( uint16_t* xyz )
{
        uint8_t temp[6];
        HAL_I2C_Mem_Read(&hi2c2, ADXL345ADD, DATA_X0, 1, temp, 6, 35);
       
        for( uint8_t i=0;i<3;i++)
        {
                xyz = (uint16_t)(temp[i*2+1]<<8) + temp[i*2];
        }
}
6STM32CubeLabVIEWVisual Stdio C++等的工程配置过程很相像,简单方便,重要的是ST生成的代码不会出现I2C初始化死锁问题,使开发STM32的固件与开发应用软件一样简单。从wgsxsm的方法(https://bbs.21ic.com/forum.php?mo ... p;highlight=ADXL345HAL_I2C_Mem_ReadHAL_I2C_Mem_Write的用法可见,比使用标准库或51单片机软件开发节省了大量时间和精力。建议各位同好们考虑使用STM32Cube。后附STSTM32Cube RoadShow。我只是一个单片机爱好者,但做过多年的测控软件开发,只是将学习STM32Cube的经验和大家分享,没有任何商业宣传的意思。

沙发
ljxpro|  楼主 | 2016-1-29 11:56 | 只看该作者
STM32Cube的RoadShow太大了,不能上传。文件名STM32Cube - RoadShow Version.pdf,是介绍STM32Cube的PPT。

使用特权

评论回复
板凳
yiyigirl2014| | 2016-1-29 11:57 | 只看该作者
STM32Cube与LabVIEW、Visual Stdio C++等的工程配置过程很相像,简单方便,重要的是ST生成的代码不会出现I2C初始化死锁问题,使开发STM32的固件与开发应用软件一样简单

使用特权

评论回复
地板
Rooney30| | 2016-1-29 14:49 | 只看该作者
I2C的bug问题还是没有解决是吧

使用特权

评论回复
5
ljxpro|  楼主 | 2016-1-29 17:33 | 只看该作者
以下两图是ST不建议在新设计中使用标准库的原文。IIC应该不会有bug,RM0008 STM32全系列参考手册最早的版本是2007年10月19日,8年了,ST怎么可能允许IIC的Bug一直存在?道理上讲不通。我在继续使用STM32Cube调试ADXL345中,目前很顺利。

捕获3.PNG (59.59 KB )

捕获3.PNG

捕获4.PNG (109.12 KB )

捕获4.PNG

使用特权

评论回复
6
仙女山| | 2016-1-29 20:35 | 只看该作者
这个cube生成的工程能直接用吗

使用特权

评论回复
7
pkuzhx| | 2016-1-30 10:25 | 只看该作者
仙女山 发表于 2016-1-29 20:35
这个cube生成的工程能直接用吗

可以

使用特权

评论回复
8
小猫爱吃鱼| | 2016-1-30 16:50 | 只看该作者
不知道用cube配置的时候把i2c的bug有没有去掉

使用特权

评论回复
9
ljxpro|  楼主 | 2016-2-1 08:12 | 只看该作者
STM32是否有bug不是个问题。既然cube是ST出的配置生成软件,即使I2C有bug,ST也要想办法解决,cube是ST使用软件方法弥补硬件设计问题的最好机会。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

粉丝