编写STM32 FRAM驱动

问题描述 投票:0回答:1

我正在尝试学习如何使用组件的数据表编写驱动程序。本例中使用 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 信号之间的差异。

Image: Read from a specific memory address

stm32 ram i2c hal
1个回答
0
投票

哪个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() 的描述进行比较,以了解差异。

© www.soinside.com 2019 - 2024. All rights reserved.