潇潇雨歇pku 发表于 2015-10-26 08:42:15

CubeMX生成的i2c不工作

刚开始学STM32,,用的是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的。





潇潇雨歇pku 发表于 2015-10-26 08:46:41

补充一下: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.
是在无能为力了,请大家帮我看看我到底是哪里出错了

你好我好大家好! 发表于 2015-10-26 09:03:07

:):):):):):):):)

foxglove 发表于 2015-10-26 09:07:45

到底是哪里出错了

disheng4688 发表于 2015-10-26 10:49:21

帮顶                  

dsjsjf 发表于 2015-10-26 11:19:14

帮顶            

潇潇雨歇pku 发表于 2015-10-26 11:19:52

多谢各位,自己也来顶一下

peter001 发表于 2015-10-26 12:38:02

固件库有i2c 例子,对照一下

潇潇雨歇pku 发表于 2015-10-26 15:00:15

peter001 发表于 2015-10-26 12:38
固件库有i2c 例子,对照一下

对比一下,函数组织略有不同,但实际是一样的。还有就是我用的是PB6/7,例子用的是PB6/9,其他就没有区别了。
我再试试把例子修改一下下到我的板子上看行不行。

金志峰 发表于 2015-10-26 15:59:39

只玩过模拟i2c等着楼主搞定之后出教程呀:D
页: [1] 2 3
查看完整版本: CubeMX生成的i2c不工作