Notes About Working with Various Arduino & Netduino Microcontroller Boards

Sunday, December 30, 2012

Sparkfun DeadOn RTC DS3234 Breakout & Netduino Plus 2

On 12/27/2012, I published an example of using the DeadOn RTC with an Arduino Due.  I have also tried to get it to work with the Netduino Plus 2. The code below reads the date and time from the DS3234 clock chip via SPI and prints them to the debug console in Visual Studio. For some reason, the value for seconds is always returned as 0. I will keep looking into this issue. The code is an adaptation of the sample code for the Arduino, but it implements only the "read" function. I will work on the code for setting the time and date and publish it in the near future.

For documentation on using SPI with the Netduino, see  http://wiki.netduino.com/SPI.ashx and http://wiki.netduino.com/SPI-Configuration.ashx.

Connections:
DeadOn RTC  Netduino Plus 2
GND         GND
VCC         3V3
CLK         D13
MISO        D12
MOSI        D11
SS          D10

Code:
using System.Threading;

using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using Microsoft.SPOT;
using System;

namespace DeadOnRTC
{
    public class Program
    {
        public static void Main()
        {
            byte[] WriteBuffer = new byte[1];
            byte[] ReadData = new byte[7];
            uint[] TimeDate = new uint[7];

            SPI.Configuration Device1 = new SPI.Configuration(
                Pins.GPIO_PIN_D10, // SS-pin
                false,             // SS-pin active state - false = low
                0,                 // The setup time for the SS port
                0,                 // The hold time for the SS port
                true,              // The idle state of the clock
                true,              // The sampling clock edge
                2000,              // The SPI clock rate in KHz
                SPI_Devices.SPI1   // The SPI bus
            );
            SPI SPIBus = new SPI(Device1);
            // 0x8E is addr of config byte
            WriteBuffer[0] = 0x8E;
            SPIBus.Write(WriteBuffer);
            // 0x60 = b01100000
            // Disable Oscillator & Battery SQ wave @1hz, temp comp., no Alarms
            WriteBuffer[0] = 0x60;
            SPIBus.Write(WriteBuffer);
            while (true)
            {    
                WriteBuffer[0] = 0x01;
                SPIBus.WriteRead(WriteBuffer, ReadData);
                //Data order: second,minute,hour,null,day,month,year
                for (uint i = 0; i <= 6; i++)
                {
                    if (i == 3) 
                        i++; 
                    uint n = ReadData[i];
                    uint a = n & 0x0F;
                    if (i == 2)
                    {
                        uint b = ((n & 0x30) >> 4); //24 hour mode
                        if (b == 2)
                            b = 20;
                        else if (b == 1)
                            b = 10;
                        TimeDate[i] = a + b;
                    }
                    else if (i == 4)
                    {
                        uint b = ((n & 0x30) >> 4);
                        TimeDate[i] = a + b * 10;
                    }
                    else if (i == 5)
                    {
                        uint b = ((n & 0x10) >> 4);
                        TimeDate[i] = a + b * 10;
                    }
                    else if (i == 6)
                    {
                        uint b = ((n & 0xF0) >> 4);
                        TimeDate[i] = a + b * 10;
                    }
                    else
                    {
                        uint b = ((n & 0x70) >> 4);
                        TimeDate[i] = a + b * 10;
                    }
                }
                String time = padZero(TimeDate[2]) + ":" + padZero(TimeDate[1]) + ":" + padZero(TimeDate[0]);
                String date = padZero(TimeDate[5]) + "/" + padZero(TimeDate[4]) + "/" + padZero(TimeDate[6]);
                Debug.Print(date + " " + time);
                Thread.Sleep(1000);
            }
        }
        public static string padZero(uint num)
        {
            return num >= 10 ? num.ToString() : "0" + num.ToString();
        }
    }
}

No comments:

Post a Comment