大家好
所以我正在尝试从 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 个字节时,我才不会从中得到正确的句子。
那么,我能在这里做什么呢。我是否以错误的顺序发送或读取数据。
|