0

这篇文章似乎与Windows IoT 和 DS3231 RTC 时钟 重复,但它似乎对我不起作用。我没有在这种环境中使用 i2c 的经验。

我的预期功能是,

  1. 在启动时检查是否有任何网络连接来更新系统时钟
  2. 如果离线,系统将读取datetimeDS3231更新系统datetime
  3. datetimefrom的任何更改,datepicker否则 timepicker它将更新DS3231

我的问题是

  1. 如何检查网络可用性以更新系统时钟。
  2. DS3231 使用i1cdevice.writeread要求中write read address分别读取?是否会i2c自动读取所有数据,直到stop收到位或我必须设置一个计数器?

    private const byte DS3231_I2C_WADDR = 0xD0;
    private const byte DS3231_I2C_RADDR = 0xD1;
    private I2cDevice DS3231_RTC; 
    
    byte[] i2CWriteBuffer;
    byte[] i2CReadBuffer;
    
    private async void Read_DS3231_RTC()
    {
        var settings = new I2cConnectionSettings(DS3231_I2C_RADDR);
        settings.BusSpeed = I2cBusSpeed.StandardMode;
        var controller = await I2cController.GetDefaultAsync();
        DS3231_RTC = controller.GetDevice(settings);
    
        try
        {
            DS3231_RTC.WriteRead(new byte[] { DS3231_I2C_RADDR }, i2CReadBuffer);
            }
        catch (Exception e)
        {
            StatusMessage.Text = "Fail to Init I2C:" + e.Message;
            return;
        }
    }
    
  3. 在设置我如何更新到DS3231 时写入时间设置dateickertimepickerdatetimeDS3231

    private void DatePicker_DateChanged(object sender, DatePickerValueChangedEventArgs e)
    {
        DateTimeSettings.SetSystemDateTime(e.NewDate.UtcDateTime);
        SetTime_DS3231();
    }
    
    private void TimePicker_TimeChanged(object sender, TimePickerValueChangedEventArgs e)
    {
        var currentDate = DateTime.Now.ToUniversalTime();
    
        var newDateTime = new DateTime(currentDate.Year,
                                       currentDate.Month,
                                       currentDate.Day,
                                       e.NewTime.Hours,
                                       e.NewTime.Minutes,
                                       e.NewTime.Seconds);
    
        DateTimeSettings.SetSystemDateTime(newDateTime);
    }
    

谢谢你。

4

1 回答 1

1

1.如何检查网络可用性以更新系统时钟。

您可以使用 NetworkInterface 类的 GetIsNetworkAvailable 方法来检查互联网是否连接。您可以从本主题 中获得有关如何在通用 Windows 平台中检查 Internet 连接类型的更多知识。

bool isInternetConnected = NetworkInterface.GetIsNetworkAvailable();

2.使用i1cdevice.writeread从DS3231读取需要单独写入读取地址?i2c 会自动读取所有数据,直到收到停止位还是我必须设置一个计数器?

没有必要分开写读。WriteRead方法 执行原子操作,将数据写入设备所连接的内部集成电路 (I2 C) 总线,然后从其读取数据,并在写入和读取操作之间发送重启条件。第二个参数是要从 I2 C 总线读取数据的缓冲区。缓冲区的长度决定了从设备请求多少数据。它不会自动停止,直到收到停止位。如果 I2 C 设备在读取整个缓冲区之前否定确认数据传输,则会出现错误(错误代码0x8007045D)。

3. 写入 DS3231 有 dateicker & timepicker 在设置日期时间时设置时间我如何更新到 DS3231

正如 TRS 在主题Windows IoT 和 DS3231 RTC 时钟 中回复的那样,他/她提供了设置时钟的方法。

新更新:

    private async void SetTime_DS3231(DateTime dt)
    {
        int SlaveAddress = 0x68;

        try
        {
            // Initialize I2C
            var Settings = new I2cConnectionSettings(SlaveAddress);
            Settings.BusSpeed = I2cBusSpeed.StandardMode;

            if (AQS == null || DIS == null)
            {
                AQS = I2cDevice.GetDeviceSelector("I2C1");
                DIS = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(AQS);
            }

            using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id, Settings))
            {
                byte write_seconds = decToBcd((byte)dt.Second);
                byte write_minutes = decToBcd((byte)dt.Minute);
                byte write_hours = decToBcd((byte)dt.Hour);
                byte write_dayofweek = decToBcd((byte)dt.DayOfWeek);
                byte write_day = decToBcd((byte)dt.Day);
                byte write_month = decToBcd((byte)dt.Month);
                byte write_year = decToBcd((byte)(dt.Year%100));

                byte[] write_time = { 0x00, write_seconds, write_minutes, write_hours, write_dayofweek, write_day, write_month, write_year };

                Device.Write(write_time);

            }
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Write(ex.Message);
        }
    }

    private static byte decToBcd(byte val)
    {
        return (byte)(((int)val / 10 * 16) + ((int)val % 10));
    }
于 2018-03-16T06:34:05.517 回答