如何在带有stm32f4xx_hal_i2c库的STM3241G-Eval板上使用I2C

时间:2019-03-24 12:06:37

标签: i2c hal stm32f4 truestudio

尝试通过STM32评估板学习I2C。我有STM3241G-Eval板,我正在尝试使用I2C使IO扩展器正常工作。我是董事会新手,还是I2C新手。

链接到董事会手册: https://www.st.com/content/ccc/resource/technical/document/user_manual/f6/38/77/c2/9f/01/4a/26/DM00036744.pdf/files/DM00036744.pdf/jcr:content/translations/en.DM00036744.pdf

链接到IO扩展器手册: https://datasheet.lcsc.com/szlcsc/STMicroelectronics-STMPE811QTR_C118017.pdf

我已经用STM32CubeMX为开发板创建了一个项目。我所做的全部工作都启用了FREERTOS和I2C1。想要使用FreeRTOS,因为以后可能需要它。使用CubeMX,我将SDA和SCL连接到PB9和PB6。然后生成TrueStudio代码,并使用TrueStudio将其打开。 在TrueStudio中,我将项目转换为C ++项目。

评估板上有一个Joystich,我想使用I2C读取该状态。 游戏杆已连接到IO扩展器。

我已经创建了一个要在RTOS上运行的任务,并且该任务正在调试中运行,但是我无法使用I2C读取任何内容。

我尝试搜索解决方案的次数越多,我越会感到困惑。我曾尝试使用HAL_I2C_Master_Receive读取操纵杆状态,但还看到一则帖子说我应该使用HAL_I2C_Mem_Read。现在我不确定应该使用哪个?还是我应该使用HAL I2C库中的其他方法?

IO扩展器的地址为0x88,我尝试使用功能“ GPIO监控器引脚状态 寄存器”,其地址为0x12。

我已经定义了I2C地址

#define I2C_ADDRESS (0x88)

我有缓冲区,可以在其中设置地址和读取结果的地方

unsigned char buffer1[3];

我使用这些信息读取I2C的状态和状态

HAL_I2C_StateTypeDef state;
HAL_StatusTypeDef status;

尽管不确定是否有必要,我使用20ms的延迟时间

TickType_t xDelay = 20 / portTICK_PERIOD_MS;

我设置了要读取的地址,然后循环读取

buffer1[0] = 0x12
HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, buffer1,1, 100);
for(;;)
{
    vTaskDelay(xDelay);
    buffer1[0] = 0x00;
    buffer1[1] = 0x00;
    buffer1[2] = 0x00;
    HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS, buffer1,3, 100);
    b1 = buffer1[0];  //this stays zero
    b2 = buffer1[1];  //this stays zero
    b3 = buffer1[2];  //this stays zero
    state = HAL_I2C_GetState(&hi2c1);  //HAL_I2C_STATE_READY
    status = HAL_I2C_IsDeviceReady(&hi2c1, I2C_ADDRESS, 1, 100); //HAL_ERROR when using 0x88<<1 and HAL_OK when using 0x88
}

在I2C HAL库中,它说该地址应该向左移动,但是每当我这样做时,我都会收到HAL_ERROR,当我直接使用0x88时,我会得到HAL_OK作为I2C的状态。对此有何评论?

我不确定读取结果时缓冲区应该有多大。并且在读取缓冲区时,它仅包含零。

I2C可能有些我不了解和理解的东西,因此,我感谢所有评论,并帮助您顺利进行。

0 个答案:

没有答案