后来与你172 2025-04-13 17:48 采纳率: 0%
浏览 10

GD32F303CBT6控制DS1302

求GD32F303控制DS1302,无论怎么改网上的代码,永远都是0:0:0,或80:80:80,或65:65:65

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-04-13 17:51
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 问题关键点分析
      - 出现固定错误时间显示(如0:0:0、80:80:80、65:65:65等),说明DS1302与GD32F303之间的通信存在问题,可能是SPI通信参数设置错误、数据读写错误或者DS1302的初始化不正确等。
    2. 解决方案
      - 硬件连接
      • 确保GD32F303的SPI引脚与DS1302正确连接。一般来说,GD32F303的SPI引脚(如PA5 - PA7等,具体根据使用的SPI外设)连接到DS1302的SCLK、DIN、DOUT引脚。VCC、GND等电源引脚也要连接正确。
      • 软件方面
      • SPI初始化
    void spi_init(void)
    {
        spi_parameter_struct spi_init_struct;
    
        rcu_periph_clock_enable(RCU_GPIOA);
        rcu_periph_clock_enable(RCU_SPI0);
    
        gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
        gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
        gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    
        spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
        spi_init_struct.device_mode = SPI_MASTER;
        spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
        spi_init_struct.clock_polarity = SPI_CK_PL;
        spi_init_struct.clock_phase = SPI_CK_PH;
        spi_init_struct.nss = SPI_NSS_SOFT;
        spi_init_struct.prescale = SPI_PRESCALER_DIV2;
        spi_init(SPI0, &spi_init_struct);
    
        spi_enable(SPI0);
    }
    
     - **DS1302初始化**:
    
    void ds1302_init(void)
    {
        spi_cs_low();
        ds1302_write(0x8E, 0x00); // 关闭写保护
        spi_cs_high();
    }
    
     - **读取时间函数**:
    
    void ds1302_read_time(uint8_t *time)
    {
        uint8_t i;
        spi_cs_low();
        for(i = 0; i < 7; i++)
        {
            time[i] = ds1302_read(0x81 + i);
        }
        spi_cs_high();
    }
    
     - **写入时间函数**:
    
    void ds1302_write_time(uint8_t *time)
    {
        uint8_t i;
        spi_cs_low();
        ds1302_write(0x8E, 0x00); // 关闭写保护
        for(i = 0; i < 7; i++)
        {
            ds1302_write(0x80 + i, time[i]);
        }
        ds1302_write(0x8E, 0x80); // 开启写保护
        spi_cs_high();
    }
    
     - **SPI通信的读写函数**:
    
    uint8_t ds1302_read(uint8_t addr)
    {
        uint8_t data;
        spi_send_data(SPI0, addr);
        data = spi_receive_data(SPI0);
        return data;
    }
    
    void ds1302_write(uint8_t addr, uint8_t data)
    {
        spi_send_data(SPI0, addr | 0x80);
        spi_send_data(SPI0, data);
    }
    
    void spi_cs_low(void)
    {
        gpio_bit_reset(GPIOA, GPIO_PIN_4);
    }
    
    void spi_cs_high(void)
    {
        gpio_bit_set(GPIOA, GPIO_PIN_4);
    }
    
    1. 多种解决方案优缺点
      - 优点
      • 上述代码是一种较为全面的解决思路,按照DS1302与SPI通信的正常流程进行初始化、读写操作。通过清晰的步骤,有助于逐步排查硬件连接和软件逻辑上的问题。
      • 缺点
      • 代码相对较为复杂,对于初学者来说理解起来可能有一定难度。如果硬件连接错误,仅通过软件代码可能较难快速定位,需要仔细检查硬件连接。
    2. 总结
      - 解决GD32F303控制DS1302时间显示异常的问题,需要从硬件连接和软件代码两方面入手。确保硬件连接正确后,重点检查SPI通信初始化及DS1302的读写操作代码,按照上述提供的代码框架逐步调试,以实现正确的时间设置和读取。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月13日