ENGLISH 简体中文 日本語 한국어  


APPLICATION NOTE  3334

App Note 3334: 8051형 마이크로컨트롤러를 사용하여 MAX6900 RTC 인터페이싱

개요: 이 애플리케이션 노트는 8051형 마이크로컨트롤러를 사용하여 MAX6900을 인터페이싱하기 위한 하드웨어 및 소프트웨어의 예를 제공한다.

설명

이 애플리케이션 노트는 MAX6900 I²C 호환 RTC(실시간 클록)을 8051형 마이크로컨트롤러(µC)에 인터페이싱하는 방법을 제시하고 기본 인터페이스 루틴을 보여주는 예제 코드를 제공한다. 이 예에서 사용된 마이크로컨트롤러는 DS2250이고, 소프트웨어는 C로 작성되었다.

동작

이 프로그램은 마이크로컨트롤러 상의 두 개의 범용 포트 핀을 사용하여 I²C 버스에서 마스터로 동작한다. MAX6900은 동일한 버스에서 슬레이브 소자로 동작한다.

회로도는 그림 1과 같다. 소프트웨어는 그림 2와 같다.

Figure 1. Schematic of Daughter Card.
큰 이미지 보기

그림 1. 부속 카드 회로도

ZIP 파일 다운로드 그림 2. 코드 목록
/***************************************************************************/
/* DEMO6900.c                                                              */
/***************************************************************************/
/* This program is for example only and is not supported by Dallas Maxim   */
#include <stdio.h>		/* Prototypes for I/O functions     */
#include <DS5000.h>		/* Register declarations for DS5000 */
#define	ACK	0
#define	NACK	1
#define	ADD6900	0xa0	/* 2-wire addresses */
sbit scl = P0^0;        	/* 2-wire pin definitions  */
sbit sda = P0^1;
void	I2Cstart();
void	I2Cstop();
uchar	I2Cwrite(uchar);
unsigned char	I2Cread(int);
void	writebyte6900();
void	Initialize_MAX6900();
void	disp_clk_regs();
void	burstramread();
void	burstramwrt();
/* global variables */

void I2Cstart()		/* ----------------------------------------------- */
{
	sda = 1;	/* Initiate start condition */
	scl = 1;
	sda = 0;
}
void I2Cstop()		/* ----------------------------------------------- */
{
	sda = 0;	sda = 0;	/* Initiate stop condition */
	scl = 1;	scl = 1;
	sda = 1;
}
uchar I2Cwrite(uchar d)		/* ----------------------------- */
{
  int i;

  scl = 0;
	for (i = 0;i < 8; i++)
	{
		if (d & 0x80)
			sda = 1; /* Send the msbits first */
		else
			sda = 0;
		scl = 0;
		scl = 1;
		d = d < 1;	/* add to scl high time */
		scl = 0;
	}
	sda = 1;		/* Release the sda line */
	scl = 0;
	scl = 1;
	i = sda;
	scl = 0;
	if (i)
	{
		puts("Ack missing");
	}
	return(i);
}
uchar I2Cread(int b)	/* ----------------------------------- */
{
uchar i, d;

	d = 0;
	sda = 1;			/* Let go of sda line */
	for (i=1; i<=8; i++)		/* read the msb first */
	{
		scl = 0;
		scl = 1;
		d = d << 1;
		d = d | (unsigned char)sda;
	}
	scl = 0;
	sda = b;          /* Hold sda low for ACK, high for NACK */

	scl = 0;		/* toggle clock */
	scl = 1;
	scl = 0;

	sda = 1;		/* Release the sda line */
	return d;
}
void writebyte6900()	/* ----- write a single byte; user enters read address ----- */
{
uchar add;
uchar dat;
	/* Get Address & Data */
	printf("\nEnter the Read Address\nADDRESS (80,82,84...FC): ");
	scanf("%bx", &add);
	printf("DATA (0-ff):");
	scanf("%bx", &dat);

	I2Cstart();
	I2Cwrite(ADD6900);	/* slave address + write */
	I2Cwrite(add);
	I2Cwrite(dat);
	I2Cstop();
}
void Initialize_MAX6900()	/* ------- initialize from stdio entries ------- */
/* Note: NO error checking is done on the user entries! */
{
uchar	yr, mn, dt, dy, hr, min, sec, day;

	I2Cstart();
	I2Cwrite(ADD6900);		/* slave address + write */
	I2Cwrite(0x8e);		/* control register write address */
	I2Cwrite(0x00);		/* clear write protect */
	I2Cstop();

	printf("\nEnter the year (0-99): ");
	scanf("%bx", &yr);
	printf("Enter the month (1-12): ");
	scanf("%bx", &mn);
	printf("Enter the date (1-31): ");
	scanf("%bx", &dt);
	printf("Enter the day (1-7): ");
	scanf("%bx", &dy);
	printf("Enter the hour (1-23): ");
	scanf("%bx", &hr);
	hr = hr & 0x3f;	/* force clock to 24 hour mode */
	printf("Enter the minute (0-59): ");
	scanf("%bx", &min);
	printf("Enter the second (0-59): ");
	scanf("%bx", &sec);

	I2Cstart();
	I2Cwrite(ADD6900);	/* slave address + write */
	I2Cwrite(0xbe);	/* clock burst write */
	I2Cwrite(sec);
	I2Cwrite(min);
	I2Cwrite(hr);
	I2Cwrite(dt);
	I2Cwrite(mn);
	I2Cwrite(dy);
	I2Cwrite(yr);
	I2Cwrite(0);		/* control */
	I2Cstart();
	I2Cwrite(ADD6900);	/* slave address + write */
	I2Cwrite(0x92);
	I2Cwrite(0x20);	/* century data */
	I2Cstop();
}
void disp_clk_regs()		/* --------- display using burst mode --------- */
{
uchar Sec, prv_sec = 99, Min, Hrs, Dte, Mon, Day, Yr, cy;

while(!RI)	/* Read & Display Clock Registers */
{
	I2Cstart();
	I2Cwrite(ADD6900);		/* slave address + write */
	I2Cwrite(0xbf);		/* clock burst read */
	I2Cstart();
	I2Cwrite(ADD6900 + 1);	/* slave address + read */
	Sec = I2Cread(ACK);		/* starts w/last address stored in register pointer */
	Min = I2Cread(ACK);
	Hrs = I2Cread(ACK);
	Dte = I2Cread(ACK);
	Mon = I2Cread(ACK);
	Day = I2Cread(ACK);
	Yr  = I2Cread(ACK);
	cy  = I2Cread(NACK);		/* dummy read of control register */
	I2Cstart();
	I2Cwrite(ADD6900);		/* slave address + write */
	I2Cwrite(0x93);		/* century byte read address */
	I2Cstart();
	I2Cwrite(ADD6900 + 1);	/* slave address + read */
	cy  = I2Cread(NACK);
	I2Cstop();

	if(Sec != prv_sec)		/* display every time seconds change */
	{
		printf("\n%02bX%02bX/%02bX/%02bX %01bX", cy, Yr, Mon, Dte, Day);
		printf(" %02bX:%02bX:%02bX", Hrs, Min, Sec);
	}
	prv_sec = Sec;
}
   RI = 0;  /* Swallow keypress to exit loop */
}
void burstramread()		/* ----------------------------------------- */
{
uchar j, k;

	I2Cstart();
	I2Cwrite(ADD6900);	/* write slave address, write 6900 */
	I2Cwrite(0xff);	/* ram burst read */
	I2Cstart();
	I2Cwrite(ADD6900 + 1);	/* slave address + read */
	printf("\nRAM contents");
      for (j=0; j<30; ++j)
	{
		if(!(j % 8) )	printf("\n");
		printf("%2.bX ", I2Cread(ACK) );
	}
	printf("%2bX", I2Cread(NACK) );	/* last byte, NACK */
	I2Cstop();
	printf("\n");
}
void burstramwrt(uchar Data)		/* ----------------------------------------- */
{
uchar j, k;

	I2Cstart();
	I2Cwrite(ADD6900);	/* write slave address, write 6900 */
	I2Cwrite(0xfe);	/* ram burst write */
	for (k=0; k < 31; ++k)
	{
		I2Cwrite(Data);
	}
	I2Cstop();
}
main (void)		/* ----------------------------------------------------- */
{
uchar i, M, M1;

	while (1)
	{ 
		printf("\nMAX6900 build %s\n", __DATE__);
		printf("CI Clock Init\n");
		printf("CR Clock Read BW Byte Write\n");
		printf("RR RAM Read   RW RAM Write\n");
		printf("Enter Menu Selection: ");

		M = _getkey();

		switch(M) 
		{
			case 'B':
			case 'b':
			printf("\rByte: B");
			M1 = _getkey();

			switch(M1) 
			{
				case 'W':
				case 'w':	writebyte6900(); 
						break;
			}	break;

			case 'C':
			case 'c':
			printf("\rEnter Clock Routine to run:C");
			M1 = _getkey();

			switch(M1) 
			{
				case 'I':
				case 'i':	Initialize_MAX6900();
						break;

				case 'R':
				case 'r':	disp_clk_regs();
					      break;
			}	break;

			case 'R':
			case 'r':
			printf("\rEnter Ram Routine to run:R");
			M1 = _getkey();

			switch(M1) 
			{
				case 'R':
				case 'r':	burstramread();
						break;
				case 'W':
				case 'w':	printf("\nEnter the data to write: ");
						scanf("%bx", &i);
						burstramwrt(i);	break;
			}	break;
		}
	}
}


의견을 보내주세요!
위 내용이 도움이 되셨나요?
여러분의 의견을 기다립니다 — Maxim은 보내주신 정정이나 제안사항을 반영하고 있습니다. 이 페이지를 평가하고 의견을 보내주십시오.


자동 업데이트
관심있는 분야의 애플리케이션 노트가 나올 때 자동으로 업데이트 받고 싶으세요? 그렇다면 EE-Mail™을 신청하십시오.



추가 정보  APP 3334: Jan 17, 2005
MAX6900 TDFN 패키지로 제공되는 I²C 호환 RTC 전체 데이터 시트
(PDF, 212kB)
무료 샘플
 

다운로드, PDF 형식다운로드, PDF 형식 (38kB)
 AN3334, AN 3334, APP3334, Appnote3334, Appnote 3334



         



   Copyright © 2008 by Maxim Integrated Products, Dallas Semiconductor    법적 고지    개인정보보호 정책