DS1390/DS1391 RTC与Motorola SPI

摘要:本应用笔记说明了ds1390与内置spi™接口的motorola dsp的连接方式,该电路使用了motorola dsp56f800demo开发板和codewarrior ide。
说明ds1390实时时钟(rtc)可以通过spi接口与微控制器(µc)或数字信号处理器(dsp)单元连接,本应用笔记给出了ds1390与内置spi接口的motorola dsp的连接方式。该电路使用了motorola dsp56f800demo开发板和codewarrior® ide。 使用例程本例程从新建空白项目开始,详细资料请参考motorola工具包安装指南指南:创建codewarrior项目。本应用笔记的增加代码在main.c中。 操作过程该程序通过gpio口控制ds1390的cs。由软件初始化spi控制器,dsp向ds1390内部写入时间和日期。然后,该软件可以循环读取时间和日期。ds1390和ds1391支持spi模式1和模式3。
原理图如图1所示,该电路包含一个子卡,附有motorola开发板。请注意,图1电路中包括几款带有spi接口的rtc。每次只需使用一款rtc,本文给出了程序仅支持ds1390。程序清单如图2所示。
图1.
详细电路图 (pdf, 138kb)
图2. 子卡原理图
图3. 程序清单 /* file: ds1390.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); void init_sci0(word16); tx_sci0(unsigned char); void bcd2ascii(unsigned char); unsigned char rbyte_spi(void); #define reg_base 0x0000 #define sci0_base 0x0f00 #define spi_base 0x0f20 #define gpioa_base 0x0fb0 #define gpiob_base 0x0fc0 #define sci0_scibr *(volatile uword16 *)(sci0_base + 0) #define sci0_scicr *(volatile uword16 *)(sci0_base + 1) #define sci0_scisr *(volatile uword16 *)(sci0_base + 2) #define sci0_scidr *(volatile uword16 *)(sci0_base + 3) #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_a_pur *(volatile uword16 *)(gpioa_base + 0) #define gpio_a_dr *(volatile uword16 *)(gpioa_base + 1) #define gpio_a_ddr *(volatile uword16 *)(gpioa_base + 2) #define gpio_a_per *(volatile uword16 *)(gpioa_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 msec=0, min=0x26, sec=0x00, hr=0x17, dow=0x06, date=0x26, mon=0x12, yr=0x03, write = 0; reset_spi(); init_sci0(195); // 30mhz / 195 = 9600 baud gpio_b_dr = 0x0008; // disable rtc - cs high gpio_b_dr = 0; // enable rtc - cs low wbyte_spi(0x8d); // control register write address rbyte_spi(); // dummy read wbyte_spi(0x18); // enable osc, 32khz sqw rbyte_spi(); gpio_b_dr = 0x0008; // disable rtc - cs high if(write) { gpio_b_dr = 0; // enable rtc - cs low wbyte_spi(0x80); // select seconds register write address rbyte_spi(); // dummy read wbyte_spi(msec); // milliseconds register data rbyte_spi(); 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 = 0x0008; // disable rtc - cs high } while(1) { gpio_b_dr = 0u; // enable rtc - cs low wbyte_spi(0); // seconds register read address rbyte_spi(); // dummy read wbyte_spi(0); msec = rbyte_spi(); // read milliseconds register 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 = 0x0008; // disable rtc - cs high tx_sci0(0x0d); // sequence to print time & date tx_sci0(0x0a); bcd2ascii(yr); tx_sci0('/'); bcd2ascii(mon); tx_sci0('/'); bcd2ascii(date); tx_sci0(' '); bcd2ascii(hr); tx_sci0(':'); bcd2ascii(min); tx_sci0(':'); bcd2ascii(sec); } 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 = 0x0056; // 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 = 0x000d; // direction is output gpio_a_per = 0x00f9; // enable/disable per function (1=enable) gpio_a_ddr = 0x0006; // direction is output (1=output) gpio_a_dr = 0; // write bits low (0=low) } void wbyte_spi( unsigned char wbyte) // ------ write one byte ------- { while (!(spscr & 0x0200)); // wait for transmitter empty flag spdtr = wbyte; } void bcd2ascii(unsigned char dat) // ----- convert bcd to ascii and send to sci ---- { tx_sci0( (dat >> 4) + 0x30); tx_sci0( (dat & 0x0f) + 0x30); } unsigned char rbyte_spi(void) // -------- read one byte ---------- { while (!(spscr & 0x2000)); // wait for receiver full flag return(spdrr); } void init_sci0(word16 baud) { gpio_b_per = 0x00f3; // set up gpio_b_ddr = 0x000d; // direction is output sci0_scibr = baud; // baud rate sci0_scicr = 0x2000; // control reg } tx_sci0(unsigned char val) { uword16 reg; sci0_scicr &= 0xfffb; // turn receiver off sci0_scicr |= 8; // turn transmitter on do { reg = sci0_scisr; // clear flag by reading } while( (reg & 0x8000) == 0); // wait until rdrf is false sci0_scidr = (unsigned int) (val); }

马斯克宣布特斯拉高层人士变动,表示将迎来史上发展最惊人季度
“中国灯王”与“封装大佬”的碰撞
华为鸿蒙os系统下载 华为鸿蒙系统如何安装
苹果将删除在浏览器中启用谷歌 Stadia 云游戏应用
5G正式商用 将推动华科创智银纳米线新材料全面爆发
DS1390/DS1391 RTC与Motorola SPI
噪音来源电路振荡和磁元件三方面等
英特尔oneAPI受好评:研究称可提高开发者生产力并保证性能不受损
中文电子书的优势
法国Bleujour推出mini主机产品,最高可选i7-8559U处理器
华为6G和5G的技术在开发过程中是并行的6G早就在开发了
5G电力切片的落地需要解决三大产业断点问题
一加5确认6月15日发布:骁龙835+8GB超大内存!
戴尔WP原型机曝光 搭载x86桌面处理器可当PC用
现代汽车已与LG新能源就Kona电动车召回费用的分摊达成一致
M2M技术在交通安全系统中的应用
AIoT+5G有利于我国智慧城市建设
长春市成立人工智能创新中心
玛莎拉蒂宣布将进军自动驾驶和新能源动力领域
通过NVIDIA SimNet v21.06进行频域电磁仿真