我正在尝试学习如何使用组件的数据表编写驱动程序。本例中使用 MB85RC16 FRAM。数据表 = https://www.fujitsu.com/ca/en/Images/MB85RC16-DS501-00001-8v0-E.pdf - 第 9 页
我可以使用 HAL_I2C_Master_Transmit 写入我想要的任何地址,但如果不使用 HAL_I2C_Mem_Read 则无法使读回部分工作。
前四位固定为 1010,然后三位是设备地址配置(在我的例子中为 000),导致 0x50 作为完整的设备地址。接下来是最后第八位,即 R/W。
使用 HAL 我将 0xCE 写入地址 0x05。
uint8_t buff[10] = {0x05, 0xCE};
HAL_I2C_Master_Transmit(&hi2c1, (0x50 << 1), buff, 2, HAL_MAX_DELAY);
然后,为了读回,我使用数据表并首先发送 0x05 作为要读取的地址,并尝试使用 HAL_I2C_Master_Receive 来完成我希望读回数据的第二部分。
uint8_t buff2[1];
HAL_I2C_Master_Transmit(&hi2c1, (0x50 << 1), 0x05, 1, HAL_MAX_DELAY);
stat = HAL_I2C_Master_Receive(&hi2c1, (0x50 << 1) | 0x01, buff2, 1, 1000);
stat 显示 HAL_OK,但我没有在 buff2 中得到 0xCE。它只是读取 0。
您能否指导我做错了什么,因为当我使用如下所示的 HAL_I2C_Mem_Read 时,它工作正常。
HAL_I2C_Mem_Read(&hi2c1, (0x50 << 1) | 0x01, 0x05, 1, buff2, 1, 1000);
我尝试使用示波器,但我还不明白 Master_recieve 信号和 Mem_read 信号之间的差异。
哪个STM32?
HAL_I2C_Master_Transmit(&hi2c1, (0x50 << 1), 0x05, 1, HAL_MAX_DELAY);
第三个参数应该是指向数据缓冲区的指针,而不是数字。请参阅 Cube 手册中对此功能的描述,或直接在 Cube/HAL 源中查看:
/**
* @brief Transmits in master mode an amount of data in blocking mode.
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for the specified I2C.
* @param DevAddress Target device address: The device 7 bits address value
* in datasheet must be shifted to the left before calling the interface
* @param pData Pointer to data buffer
* @param Size Amount of data to be sent
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
同样,请阅读相同来源中 HAL_I2C_Mem_Read() 的描述,并将其与上面 HAL_I2C_Master_Transmit() 的描述进行比较,以了解差异。