菜只因C 2024-02-10 21:52 采纳率: 72.7%
浏览 7
已结题

(标签-蓝桥杯|关键词-Output)

蓝桥杯嵌入式STM32G431
EEPROM读写

img

img


最后读取的都是255,哪里出了问题呀
CubeMX把PA6,PA7引脚设成GPIO_Output

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-10 21:53
    关注

    引自免费微信小程序:皆我百晓生

    在蓝桥杯竞赛中使用STM32G431进行EEPROM读写操作时,如果最后读取的总是255,可能涉及以下多个方面的问题:

    1. 硬件连接与配置

    • 检查EEPROM芯片是否正确连接到STM32G431的I2C接口。确保SCL和SDA线对应正确的GPIO引脚,并且不要将它们错误地配置为输出(如PA6, PA7)。
    • 在CubeMX中,请确认已正确配置了PA6和PA7为I2C的SCL和SDA信号,并非GPIO_Output。

    2. CubeMX配置

    • **初始化代码生成:**请确保在CubeMX中生成的初始化代码包含了对I2C外设的正确配置,包括速度、地址模式等。
    • **引脚复用功能:**检查所选引脚是否已设置为对应I2C外设的功能。

    3. 软件实现

    • **EEPROM读写函数:**以下是示例的EEPROM读写函数(假设I2C外设已经正确初始化并配置好):
    #include "stm32g4xx_hal.h"
    
    #define EEPROM_ADDR 0xA0 // EEPROM的I2C地址
    
    HAL_StatusTypeDef EEPROM_WriteByte(uint16_t mem_addr, uint8_t data) {
        uint8_t write_data[2] = { (mem_addr >> 8) & 0xFF, mem_addr & 0xFF };
        HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR << 1, write_data, 2, HAL_MAX_DELAY);
        HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR << 1 | 1, &data, 1, HAL_MAX_DELAY);
        return HAL_OK;
    }
    
    HAL_StatusTypeDef EEPROM_ReadByte(uint16_t mem_addr, uint8_t *pdata) {
        uint8_t write_data[2] = { (mem_addr >> 8) & 0xFF, mem_addr & 0xFF };
        HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR << 1, write_data, 2, HAL_MAX_DELAY);
        HAL_StatusTypeDef status = HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDR << 1 | 1, pdata, 1, HAL_MAX_DELAY);
        if(status == HAL_OK)
            return HAL_OK;
        else
            return HAL_ERROR;
    }
    
    • **调用验证:**确保你在主程序中正确调用了上述函数,并且传递给函数的地址和数据是预期的值。

    4. 错误排查

    • **通信问题:**检查I2C总线上的上拉电阻是否合适,以及EEPROM的工作电压是否正常。
    • **EEPROM内部状态:**有些EEPROM在初始状态下所有位可能默认为1,因此读出255可能是其内部默认状态,需要先写入一个有效的数据再尝试读取。

    如果你提供更具体的硬件连接情况及代码片段,我可以进一步针对性地帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月26日
  • 创建了问题 2月10日