stn_1984 发表于 2012-3-28 13:16:36

ds1305使用spi模式3与STC12C5A60S2通讯问题?

硬件定义为: ds1305使用spi的模式3(cpol=1,cpha=1),四线通讯(cs,mosi,miso,sclk),mcu是stc12c5a60s2。
这个与1305通讯的例子是stc网站上下载的(1302的例子),地址和命令我已经改为1305的定义,请达人帮我看看是哪里的问题?

#include <8051.h>
#include <string.h>
#include <stdio.h>
#include "OCMJ4X8C.h"

#define BYTE unsigned char
#define WORD unsigned int
#define DWORD unsigned long
#define uchar unsigned char

__sfr AUXR   =   0x8e;       //Auxiliary register
__sfr SPSTAT =   0xcd;       //SPI status register
__sfr SPCTL=   0xce;       //SPI control register
__sfr SPDAT=   0xcf;       //SPI data register

__sbit __at (0x80) SPIF;    //SPSTAT.7
__sbit __at (0x40) WCOL;    //SPSTAT.6

__sbit __at (0x80) SSIG;    //SPCTL.7
__sbit __at (0x40) SPEN;    //SPCTL.6
__sbit __at (0x20) DORD;    //SPCTL.5
__sbit __at (0x10) MSTR;    //SPCTL.4
__sbit __at (0x08) CPOL;    //SPCTL.3
__sbit __at (0x04) CPHA;    //SPCTL.2

__sbit __at (0x00) SPDHH;   //CPU_CLK/4
__sbit __at (0x01) SPDH;    //CPU_CLK/16
__sbit __at (0x02) SPDL;    //CPU_CLK/64
__sbit __at (0x03) SPDLL;   //CPU_CLK/128

/************************** Bit Declarations *******************************/
#define CS      P3_6        /* to CE pin on DS1305 */
#define        MOSI      P1_5        /* to SDI & SDO pins on DS1305 */
#define        MISO      P1_6        /* to INT0b pin on DS1305 */
#define        SCLK      P1_7        /* to SCLK pin on DS1305 */
/************************** Global Variables *******************************/

BYTE __code init[] = {0x00, 0x00, 0x20, 0x01, 0x01, 0x05, 0x10};
BYTE __data now;

void DS1302_Initial();
void DS1302_SetTime(BYTE *p);
void DS1302_GetTime(BYTE *p);
void delay(uchar n);

void main(void)
{
lcd_init();
DS1302_Initial();               //初始化DS1302
DS1302_SetTime(init);         //设置初始时间

DS1302_GetTime(now);            //读取当前时间

printstr(0x01,0x01,now,0x07);

while (1);
}

void delay(uchar n)
{
    while (n--)
    {
      __asm
      nop
      nop
      __endasm;
    }
}
void init_SPI(void)                                  //初始化SPI
{
SPCTL = SSIG|SPEN|MSTR|CPOL|CPHA;
SPSTAT=SPIF|WCOL;
SPDAT=0;
}

/**************************************
从DS1302读1字节数据
**************************************/
BYTE DS1302_ReadByte()
{
    BYTE i;
    BYTE dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
                SCLK = 0;                   //时钟线拉低
                delay(2);                //延时等待
      dat >>= 1;                      //数据右移一位
                if (MISO) dat |= 0x80;      //读取数据
                SCLK = 1;                   //时钟线拉高
                delay(2);                //延时等待
        }

    return dat;
}

/**************************************
向DS1302写1字节数据
**************************************/
void DS1302_WriteByte(BYTE dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
      SCLK = 0;                   //时钟线拉低
      delay(2);                //延时等待
      dat >>= 1;                  //移出数据
      MOSI = CY;                  //送出到端口
      SCLK = 1;                   //时钟线拉高
      delay(2);                //延时等待
    }
}

/**************************************
读DS1302某地址的的数据
**************************************/
BYTE DS1302_ReadData(BYTE addr)
{
    BYTE dat;

    CS = 0;
    delay(2);
    SCLK = 0;
    delay(2);
    //RST = 1;
    delay(2);
    DS1302_WriteByte(addr);         //写地址
    dat = DS1302_ReadByte();      //读数据
    SCLK = 1;
    CS = 0;

    return dat;
}

/**************************************
往DS1302的某个地址写入数据
**************************************/
void DS1302_WriteData(BYTE addr, BYTE dat)
{
    CS = 0;
    delay(2);
    SCLK = 0;
    delay(2);
    //RST = 1;
    delay(2);
    DS1302_WriteByte(addr);         //写地址
    DS1302_WriteByte(dat);          //写数据
    SCLK = 1;
    CS = 0;
}

/**************************************
写入初始时间
**************************************/
void DS1302_SetTime(BYTE *p)
{
    BYTE addr = 0x80;
    BYTE n = 7;

    DS1302_WriteData(0x8f, 0x00);   //允许写操作
    while (n--)
    {
      DS1302_WriteData(addr, *p++);
      addr++;
    }
    DS1302_WriteData(0x8f, 0x80);   //写保护
}

/**************************************
读取当前时间
**************************************/
void DS1302_GetTime(BYTE *p)
{
    BYTE addr = 0x80;
    BYTE n = 7;

    while (n--)
    {
      *p++ = DS1302_ReadData(addr);
      addr++;
    }
}

/**************************************
初始化DS1302
**************************************/
void DS1302_Initial()
{
    CS = 0;
    SCLK = 0;
    DS1302_WriteData(0x8f, 0x00);   //允许写操作
    DS1302_WriteData(0x80, 0x00);   //时钟启动
    //DS1302_WriteData(0x90, 0xa6);   //一个二极管+4K电阻充电
    DS1302_WriteData(0x8f, 0x80);   //写保护
}

stn_1984 发表于 2012-3-28 13:28:19

我第一次使用spi,不知道用的对不对
页: [1]
查看完整版本: ds1305使用spi模式3与STC12C5A60S2通讯问题?