尝试通过STM32评估板学习I2C。我有STM3241G-Eval板,我正在尝试使用I2C使IO扩展器正常工作。我是董事会新手,还是I2C新手。
链接到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可能有些我不了解和理解的东西,因此,我感谢所有评论,并帮助您顺利进行。