ST意法半导体
直播中

哈哈哈

11年用户 917经验值
擅长:可编程逻辑
私信 关注
[问答]

用STM32F103C8T6读写FT24C16A的问题求解

大家好
所以我正在尝试从 FT24C16A 读取和写入 64 字节长的列表。我正在使用 STM32F103C8T6。所以第一张图片显示了 uC 的 I2C 初始化。这里没问题。我正在使用 3.3 V。
  • //---I2C_init---//
  • static void MX_I2C1_Init(void)
  • {
  •   /* USER CODE BEGIN I2C1_Init 0 */
  •   /* USER CODE END I2C1_Init 0 */
  •   /* USER CODE BEGIN I2C1_Init 1 */
  •   /* USER CODE END I2C1_Init 1 */
  •   hi2c1.Instance = I2C1;
  •   hi2c1.Init.ClockSpeed = 400000;
  •   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  •   hi2c1.Init.OwnAddress1 = 0;
  •   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  •   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  •   hi2c1.Init.OwnAddress2 = 0;
  •   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  •   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  •   if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  •   {
  •           HAL_UART_Transmit(&huart3,"HAL_I2C_Init: ",14,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"HAL_ERROR",9,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"rn",2,0xFFFF);
  •           //Error_Handler();
  •   }
  •   else
  •   {
  •           HAL_UART_Transmit(&huart3,"HAL_I2C_Init: ",14,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"HAL_OK",6,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"rn",2,0xFFFF);
  •   }
  •   /* USER CODE BEGIN I2C1_Init 2 */
  •   /* USER CODE END I2C1_Init 2 */
  • }
因此,我编写了简单的代码来测试 uC 和 EXT_EEPROM FT24C16A 之间的读写序列。
  • //---Check_external_memory_status---//
  •   BJ_FT24C16A_MEM_Status(&hi2c1);
  •   HAL_Delay(1);
  •   //---Write_list---//
  •   BJ_FT24C16A_Write_Byte(&hi2c1,"0hello there, This is a test",28,1);
  •   HAL_Delay(10);
  •   //---Set_address_for_read---//
  •   BJ_FT24C16A_Write_Byte(&hi2c1,(uint8_t *)User_array_value2,1, 1);
  •   //---Read_data_from_EXT_EEPROM---//
  •   BJ_FT24C16A_Read_Byte(&hi2c1,(uint8_t *)User_Buffer,27);
  •   //---Transmit_data_to_PC---//
  •   HAL_UART_Transmit(&huart3,(uint8_t *)User_Buffer,27,0xFFFF);
第 2 行中的代码将检查 FT24C16A 是否存在。它将返回 TRUE 表示正常。
第 6 行的代码将发送简单的语句写入 EEPROM。您会看到第一个字节是“0”(十六进制 0x30),对于 FT24C16 来说,这将是写入序列的起始地址。
然后延迟 10ms,uC 将发送字节 (0x30) 以设置读取地址。第 10 行的代码。
对于读取,使用第 13 行中的代码。停止从 EEPROM FT24C16A 读取数据后,缓冲区“User_Buffer”中的数据通过 UART 发送到 PC。
问题是,读取相同的发送数据到 EEPROM。我发送“0hello,这是一个测试”,但我读回了这个“
我还通过逻辑分析来检查这一点。是一样的:
我检查了 SCL、SDA 和电源 3.3 Vpp 纹波。一切都很好。我也尝试使用 100kHz 的速度。同样的结果。
这是我的读写序列函数。
  • //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//
  • /////////////////////////////////////////////////////////////////////////////////////
  • //------------------------------Write_data_in_FT24C16A-----------------------------//
  • //------------------------------Write_data_single_byte-----------------------------//
  • void BJ_FT24C16A_Write_Byte(I2C_HandleTypeDef *hi2c, uint8_t *pData,uint16_t data_count, int stop)
  • {
  • //---Send_data_to_EXT_memory---//
  • EXT_Memory_Variable.Status_Write_Flag_MEM_FT24C16A = HAL_I2C_Master_Transmit(hi2c,(uint16_t) FT24C16A_WRITE_ADDRESS,(uint8_t *)pData,(uint16_t) data_count,(uint32_t) 0xFFFF, stop);
  • //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//
  • /////////////////////////////////////////////////////////////////////////////////////
  • //------------------------------Read_data_in_FT24C16A------------------------------//
  • //-------------------------------Read_data_single_byte-----------------------------//
  • void BJ_FT24C16A_Read_Byte(I2C_HandleTypeDef *hi2c, uint8_t *pData,uint16_t data_count)
  • {
  • //---Send_data_to_EXT_memory---//
  • EXT_Memory_Variable.Status_Read_Flag_MEM_FT24C16A = HAL_I2C_Master_Receive(hi2c,(uint16_t) FT24C16A_READ_ADDRESS,(uint8_t *)pData,(uint16_t) data_count,(uint32_t) 0xFFFF);
  • }
但有趣的是,当我只发送“0hello there”时,得到正确的句子。

只有当我向 EEPROM 发送超过 16 个字节时,我才不会从中得到正确的句子。
那么,我能在这里做什么呢。我是否以错误的顺序发送或读取数据。







回帖(1)

刘飞云

2023-2-6 10:44:04
大家好
所以我正在尝试从 FT24C16A 读取和写入 64 字节长的列表。我正在使用 STM32F103C8T6。所以第一张图片显示了 uC 的 I2C 初始化。这里没问题。我正在使用 3.3 V。
  • //---I2C_init---//
  • static void MX_I2C1_Init(void)
  • {
  •   /* USER CODE BEGIN I2C1_Init 0 */
  •   /* USER CODE END I2C1_Init 0 */
  •   /* USER CODE BEGIN I2C1_Init 1 */
  •   /* USER CODE END I2C1_Init 1 */
  •   hi2c1.Instance = I2C1;
  •   hi2c1.Init.ClockSpeed = 400000;
  •   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  •   hi2c1.Init.OwnAddress1 = 0;
  •   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  •   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  •   hi2c1.Init.OwnAddress2 = 0;
  •   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  •   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  •   if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  •   {
  •           HAL_UART_Transmit(&huart3,"HAL_I2C_Init: ",14,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"HAL_ERROR",9,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"
    ",2,0xFFFF);
  •           //Error_Handler();
  •   }
  •   else
  •   {
  •           HAL_UART_Transmit(&huart3,"HAL_I2C_Init: ",14,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"HAL_OK",6,0xFFFF);
  •           HAL_UART_Transmit(&huart3,"
    ",2,0xFFFF);
  •   }
  •   /* USER CODE BEGIN I2C1_Init 2 */
  •   /* USER CODE END I2C1_Init 2 */
  • }
因此,我编写了简单的代码来测试 uC 和 EXT_EEPROM FT24C16A 之间的读写序列。
  • //---Check_external_memory_status---//
  •   BJ_FT24C16A_MEM_Status(&hi2c1);
  •   HAL_Delay(1);
  •   //---Write_list---//
  •   BJ_FT24C16A_Write_Byte(&hi2c1,"0hello there, This is a test",28,1);
  •   HAL_Delay(10);
  •   //---Set_address_for_read---//
  •   BJ_FT24C16A_Write_Byte(&hi2c1,(uint8_t *)User_array_value2,1, 1);
  •   //---Read_data_from_EXT_EEPROM---//
  •   BJ_FT24C16A_Read_Byte(&hi2c1,(uint8_t *)User_Buffer,27);
  •   //---Transmit_data_to_PC---//
  •   HAL_UART_Transmit(&huart3,(uint8_t *)User_Buffer,27,0xFFFF);
第 2 行中的代码将检查 FT24C16A 是否存在。它将返回 TRUE 表示正常。
第 6 行的代码将发送简单的语句写入 EEPROM。您会看到第一个字节是“0”(十六进制 0x30),对于 FT24C16 来说,这将是写入序列的起始地址。
然后延迟 10ms,uC 将发送字节 (0x30) 以设置读取地址。第 10 行的代码。
对于读取,使用第 13 行中的代码。停止从 EEPROM FT24C16A 读取数据后,缓冲区“User_Buffer”中的数据通过 UART 发送到 PC。
问题是,读取相同的发送数据到 EEPROM。我发送“0hello,这是一个测试”,但我读回了这个“
我还通过逻辑分析来检查这一点。是一样的:
我检查了 SCL、SDA 和电源 3.3 Vpp 纹波。一切都很好。我也尝试使用 100kHz 的速度。同样的结果。
这是我的读写序列函数。
  • //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//
  • /////////////////////////////////////////////////////////////////////////////////////
  • //------------------------------Write_data_in_FT24C16A-----------------------------//
  • //------------------------------Write_data_single_byte-----------------------------//
  • void BJ_FT24C16A_Write_Byte(I2C_HandleTypeDef *hi2c, uint8_t *pData,uint16_t data_count, int stop)
  • {
  • //---Send_data_to_EXT_memory---//
  • EXT_Memory_Variable.Status_Write_Flag_MEM_FT24C16A = HAL_I2C_Master_Transmit(hi2c,(uint16_t) FT24C16A_WRITE_ADDRESS,(uint8_t *)pData,(uint16_t) data_count,(uint32_t) 0xFFFF, stop);
  • //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//
  • /////////////////////////////////////////////////////////////////////////////////////
  • //------------------------------Read_data_in_FT24C16A------------------------------//
  • //-------------------------------Read_data_single_byte-----------------------------//
  • void BJ_FT24C16A_Read_Byte(I2C_HandleTypeDef *hi2c, uint8_t *pData,uint16_t data_count)
  • {
  • //---Send_data_to_EXT_memory---//
  • EXT_Memory_Variable.Status_Read_Flag_MEM_FT24C16A = HAL_I2C_Master_Receive(hi2c,(uint16_t) FT24C16A_READ_ADDRESS,(uint8_t *)pData,(uint16_t) data_count,(uint32_t) 0xFFFF);
  • }
但有趣的是,当我只发送“0hello there”时,得到正确的句子。

只有当我向 EEPROM 发送超过 16 个字节时,我才不会从中得到正确的句子。
那么,我能在这里做什么呢。我是否以错误的顺序发送或读取数据。







举报

更多回帖

发帖
×
20
完善资料,
赚取积分