本應(yīng)用筆記提供了用于將串行外設(shè)接口(SPI)RTC與內(nèi)置SPI接口模塊的摩托羅拉DSP連接的硬件和軟件示例。本示例使用摩托羅拉DSP演示套件作為電路的基礎(chǔ)。
DS1306引腳配置
引腳配置
描述
DS1306實(shí)時(shí)時(shí)鐘(RTC)可通過3線或SPI?接口與微控制器(μC)或數(shù)字信號處理(DSP)單元連接。本應(yīng)用筆記介紹了如何將DS1306連接至內(nèi)置SPI接口模塊的摩托羅拉DSP。DS1305也可用于此應(yīng)用。該電路使用摩托羅拉DSP56F800DEMO演示板和CodeWarrior IDE。
使用示例軟件
示例軟件是從空白項(xiàng)目開始開發(fā)的。按照摩托羅拉套件安裝指南(教程:創(chuàng)建 CodeWarrior 項(xiàng)目)中的說明進(jìn)行操作,了解詳細(xì)信息。在main.c中添加本應(yīng)用筆記中包含的代碼。
操作
該程序使用GPIO端口來控制DS1306上的CE。軟件初始化DSP中的SPI控制器模塊,將時(shí)間和日期寫入DS1306。然后,軟件循環(huán)讀取時(shí)間和日期。DS1305和DS1306支持SPI模式1和3。
圖1所示為該電路的原理圖。該電路包括連接到摩托羅拉演示板的子卡。請注意,圖1中的電路包括幾個(gè)帶SPI接口的RTC。一次只能使用一個(gè)RTC,軟件僅支持DS1306。該軟件如圖2所示。
圖 1.DSP56F800演示板的子卡。
圖2.演示代碼。
/* File: main.c */ /* This example program was developed using the Motorola 56F800 Demo Board Kit. Follow the kit instalation guide for creating a CodeWarrior Project. Use the shell of the new project for this example. Note: This program is for example only and is not supported by Dallas Semiconductor Maxim. */ #include "port.h" #include "stdio.h" #include "stdlib.h" /******************************************************* * Main program for use with Embedded SDK *******************************************************/ extern sampleASM (void); void reset_spi(void); void wbyte_spi(unsigned char); unsigned char rbyte_spi(void); #define REG_BASE 0x0000 #define SPI_BASE 0x0F20 #define GPIOB_BASE 0x0FC0 #define SPSCR *(volatile UWord16 *)(SPI_BASE + 0) #define SPDSR *(volatile UWord16 *)(SPI_BASE + 1) #define SPDRR *(volatile UWord16 *)(SPI_BASE + 2) #define SPDTR *(volatile UWord16 *)(SPI_BASE + 3) #define GPIO_B_PUR *(volatile UWord16 *)(GPIOB_BASE + 0) #define GPIO_B_DR *(volatile UWord16 *)(GPIOB_BASE + 1) #define GPIO_B_DDR *(volatile UWord16 *)(GPIOB_BASE + 2) #define GPIO_B_PER *(volatile UWord16 *)(GPIOB_BASE + 3) void main (void) { unsigned char min=0x58, sec=0x59, hr=0x09, dow=0x04, date=0x23, mon=0x10, yr=0x03; reset_spi(); GPIO_B_DR = 0; // disble RTC - CS low GPIO_B_DR = 0x0008; // enable RTC - CS high wbyte_spi(0x8f); // control register write address rbyte_spi(); // dummy read wbyte_spi(0); // disable write protect rbyte_spi(); GPIO_B_DR = 0; // disble RTC - CS low GPIO_B_DR = 0x0008; // enable RTC - CS high wbyte_spi(0x80); // select seconds register write address rbyte_spi(); // dummy read wbyte_spi(sec); // seconds register data rbyte_spi(); wbyte_spi(min); // minutes register rbyte_spi(); wbyte_spi(hr); // hours register rbyte_spi(); wbyte_spi(dow); // day of week register rbyte_spi(); wbyte_spi(date); // date register rbyte_spi(); wbyte_spi(mon); // month register rbyte_spi(); wbyte_spi(yr); // year register rbyte_spi(); GPIO_B_DR = 0; // disble RTC - CS low while(1) { GPIO_B_DR = 0x0008; // enable RTC - CS high wbyte_spi(0); // seconds register read address rbyte_spi(); // dummy read wbyte_spi(0); sec = rbyte_spi(); // read seconds register wbyte_spi(0); min = rbyte_spi(); // ditto minutes wbyte_spi(0); hr = rbyte_spi(); // and so on wbyte_spi(0); dow = rbyte_spi(); wbyte_spi(0); date = rbyte_spi(); wbyte_spi(0); mon = rbyte_spi(); wbyte_spi(0); yr = rbyte_spi(); GPIO_B_DR = 0; // disable RTC - CS low } return; } //SPSCR //15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 // r MSB SPRF ERRIE ovrf modf spte modfen spr1 spr0 sprie spmstr cpol cpha spe spite void reset_spi() { int val; SPSCR = 0x0096; // SPR0, SPMSTR, CPHA, SPE SPDSR = 0x0007; // 8-bit size SPSCR &= 0xfffd; // clear spe, resets SPI (partial) SPSCR |= 0x0002; // set spe, new values take effect GPIO_B_PER = 0x00f3; // use GPIOB3 as CS for RTC GPIO_B_DDR = 0x000c; // direction is output } void wbyte_spi( unsigned char wbyte) // ------ write one byte ------- { while (!(SPSCR & 0x0200)); // wait for transmitter empty flag SPDTR = wbyte; } unsigned char rbyte_spi(void) // -------- read one byte ---------- { while (!(SPSCR & 0x2000)); // wait for receiver full flag return(SPDRR); }
審核編輯:郭婷
-
dsp
+關(guān)注
關(guān)注
553文章
7987瀏覽量
348733 -
接口
+關(guān)注
關(guān)注
33文章
8575瀏覽量
151014 -
RTC
+關(guān)注
關(guān)注
2文章
538瀏覽量
66460
發(fā)布評論請先 登錄
相關(guān)推薦
評論