此帖可能与Windows IoT and DS3231 RTC clock 重复,但它似乎对我不起作用。我没有在这种环境中使用i2c的经验。
我的预期功能是,
datetime
读取DS3231
并更新
系统datetime
datetime
或datepicker
的{{1}}的任何更改
timepicker
它会更新DS3231
我的问题是
从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;
}
}
写信给DS3231
有dateicker
&时间设置为timepicker
设置datetime
后如何更新为DS3231
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);
}
谢谢。
答案 0 :(得分:0)
1.如何检查网络是否可以更新系统时钟。
您可以使用NetworkInterface类的GetIsNetworkAvailable方法来检查互联网是否连接。您可以从topic 获得有关如何在Universal Windows Platform中检查互联网连接类型的更多知识。
bool isInternetConnected = NetworkInterface.GetIsNetworkAvailable();
2.使用i1cdevice.writeread从DS3231读取需要单独写入读地址? i2c会自动读取所有数据吗? 直到收到停止位或我必须设置一个计数器?
没有必要分开写入读取。 WriteRead方法执行原子操作以将数据写入然后从设备所连接的内部集成电路(I2 C)总线读取数据,并在写入和读取操作之间发送重启条件。第二个参数是要从I2 C总线读取数据的缓冲区。缓冲区的长度决定了从设备请求多少数据。在收到停止位之前它不会自动停止。如果I2 C设备在读取整个缓冲区之前否定了数据传输,则会出现错误(错误代码) 0x8007045D)。
3.写入DS3231有dateicker&设置日期时间时间设置的时间戳设置如何更新为DS3231
由于TRS在主题Windows IoT and DS3231 RTC clock 中回复,他/她提供了设置时钟的方法。
新更新:
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));
}