打印
[STM32F4]

CubeMX生成的i2c不工作(长帖求助)

[复制链接]
3064|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pkuzhx|  楼主 | 2015-10-26 08:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是STM32F401RE,使用cubeMX生成keil工程后,发现i2c不工作。
main中关键函数如下:
/* USER CODE BEGIN 1 */
HAL_StatusTypeDef i2cStatus1, i2cStatus2;
/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */
SystemClock_Config();

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
lcd_init();

/* USER CODE BEGIN 2 */
uint8_t data1 = 0x17;
i2cStatus1 = HAL_I2C_IsDeviceReady(&hi2c1, 0x5a, 3000, 1000);
i2cStatus1 返回error。
然后我调试过程中发现,HAL_I2C_IsDeviceReady函数执行过程很诡异,经过函数内如下一段代码后(I2C_CR1_START = 0x100),CR1还是0x1,而没有变成0x101.但是DR变成了0x5A(DevAddress=0x5A)。这里我就很困惑了,为啥CR1经过了hi2c->Instance->CR1 |= I2C_CR1_START;语句值却没有变化呢?
do
{
  /* Generate Start */
  hi2c->Instance->CR1 |= I2C_CR1_START;

  /* Wait until SB flag is set */
  if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
  {
    return HAL_TIMEOUT;
  }

  /* Send slave address */
  hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
……
//more code

我的cubemx配置如下,请大家也帮我看看有没有啥问题,其中PA0/1/4/5/6是控制LCD的。





沙发
pkuzhx|  楼主 | 2015-10-26 09:05 | 只看该作者
补充一下:CR1最低位是PE位,初始化后是置1的,其他位都是0。所以CR1在do之前是0x1,。I2C_CR1_START = 0x100,所以经过那段代码后CR1应该是0x101才对。
可能有人怀疑 if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)改变了CR1的值,这个真没有,我把断点设在if前面,CR1执行过还是0x1.
是在无能为力了,请大家帮我看看我到底是哪里出错了

使用特权

评论回复
板凳
Ketose| | 2015-10-26 10:26 | 只看该作者
Start信号就是一瞬间的事情。。。。

使用特权

评论回复
地板
pkuzhx|  楼主 | 2015-10-26 10:57 | 只看该作者
Ketose 发表于 2015-10-26 10:26
Start信号就是一瞬间的事情。。。。

也就是说在debug模式下也看不到这个寄存器的变化了?
我的理解是,在debug模式下,set某一bit后,只要不往下执行,该bit会一直保持在1

使用特权

评论回复
5
Ketose| | 2015-10-26 12:50 | 只看该作者
pkuzhx 发表于 2015-10-26 10:57
也就是说在debug模式下也看不到这个寄存器的变化了?
我的理解是,在debug模式下,set某一bit后,只要不 ...

你最好是用逻辑分析仪看下。

使用特权

评论回复
6
zhuotuzi| | 2015-10-26 13:19 | 只看该作者
最好是用逻辑分析仪看下

使用特权

评论回复
7
pkuzhx|  楼主 | 2015-10-26 13:53 | 只看该作者
Ketose 发表于 2015-10-26 12:50
你最好是用逻辑分析仪看下。

奈何手头没有这种仪器啊

使用特权

评论回复
8
pkuzhx|  楼主 | 2015-10-27 10:24 | 只看该作者
最后还是用gpio模拟i2c了,有时间再搞这个吧

使用特权

评论回复
9
lwsn| | 2015-10-28 14:29 | 只看该作者
仔细检查时序

使用特权

评论回复
10
米尔豪斯| | 2015-10-28 14:36 | 只看该作者
其实gpio模拟i2c也不是很麻烦

使用特权

评论回复
11
pkuzhx|  楼主 | 2015-10-28 16:49 | 只看该作者
米尔豪斯 发表于 2015-10-28 14:36
其实gpio模拟i2c也不是很麻烦

已经用gpio模拟。发现即便库可以用,也跟我的使用要求相差较远,还是得自己再封装一些函数

使用特权

评论回复
12
pkuzhx|  楼主 | 2015-10-29 16:50 | 只看该作者
用cubeMX也可以啦。之前的配置方法没有错。
只是我对HAL库函数的理解有误,它有没有详细的说明。后来结合示波器看波形,就明白它的函数怎么用了。

使用特权

评论回复
13
315013856| | 2015-11-13 09:51 | 只看该作者
楼主,您好 我遇到和你同样的问题,请问你是如何解决的。

使用特权

评论回复
14
pkuzhx|  楼主 | 2015-11-13 10:53 | 只看该作者
315013856 发表于 2015-11-13 09:51
楼主,您好 我遇到和你同样的问题,请问你是如何解决的。

给你发个文档吧,按照这个文档配置应该没有问题。不过我的用途跟你的不一样,具体用什么函数你自己去看HAL文档了

20151029 HAL I2C设置.rar

259.98 KB

使用特权

评论回复
15
standin000| | 2017-6-20 14:40 | 只看该作者
pkuzhx 发表于 2015-11-13 10:53
给你发个文档吧,按照这个文档配置应该没有问题。不过我的用途跟你的不一样,具体用什么函数你自己去看HA ...

多谢指点~~~DevAddress需要左移才能起作用!

使用特权

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

本版积分规则

个人签名:原来可以设置签名档啊!

45

主题

730

帖子

6

粉丝