摘要:本应用笔记说明了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进行频域电磁仿真