网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> C6000文章 >> C64X系列 >> 文章正文
  DM642读写时钟芯片DS1339的程序         ★★★ 【字体:
DM642读写时钟芯片DS1339的程序
作者:61IC    文章来源:本站原创    点击数:    更新时间:2006-9-8    
程序是我自己写的,可能有些错误,不过在板子上跑了一下运行得还不错,要是哪位高
手发现了BUG请指出。基本功能是用查询方式设置时钟芯片DS1339的寄存器指针,然后用
EDMA读出DS1339所有的寄存器值,EDMA传送完毕之后产生一个硬件中断,在ISR中对时钟
芯片的寄存器值进行解码,最后在CCS的调试窗口中输出当前时间。

文件一 I2CbyEDMA.c

#include <stdio.h>

#include <std.h>

#include <csl.h>

#include <csl_chip.h>

#include <csl_irq.h>

#include <csl_i2c.h>

#include <csl_edma.h>

#include "myI2C.h"

#define NUMOFRD 17                   /*读取字节数*/

#define NUMOFWR 2

#define BCD2HEX(a)  ((a)-6*((a)>>4))     /*BCD码转换为十六进制码*/

I2C_Handle hI2c;

I2C_Config cfgI2cread={              /*I2C读取配置*/

           I2C_I2COAR_A_OF(0x01),

           I2C_I2CIMR_RMK(           /*屏蔽全部I2C中断*/

            I2C_I2CIMR_ICXRDY_MSK,

            I2C_I2CIMR_ICRRDY_MSK,

            I2C_I2CIMR_ARDY_MSK,

            I2C_I2CIMR_NACK_MSK,

            I2C_I2CIMR_AL_MSK

           ),

           I2C_I2CCLKL_ICCL_OF(60-6), /*I2C时钟频率100kHz*/

           I2C_I2CCLKH_ICCH_OF(60-6), /*I2C时钟频率100kHz*/

           I2C_I2CCNT_ICDC_OF(NUMOFRD),

           I2C_I2CSAR_A_OF(0x68),

           I2C_I2CMDR_RMK(

            I2C_I2CMDR_NACKMOD_ACK,

            I2C_I2CMDR_FREE_BSTOP,

            I2C_I2CMDR_STT_NONE,

            I2C_I2CMDR_STP_NONE,

            I2C_I2CMDR_MST_MASTER,

            I2C_I2CMDR_TRX_RCV,

            I2C_I2CMDR_XA_7BIT,

            I2C_I2CMDR_RM_NONE,

            I2C_I2CMDR_DLB_NONE,

            I2C_I2CMDR_IRS_RST,

            I2C_I2CMDR_STB_NONE,

            I2C_I2CMDR_FDF_NONE,

            I2C_I2CMDR_BC_BIT8FDF

           ),

           I2C_I2CPSC_IPSC_OF(50-1),  /*预缩放时钟频率600M/50=12MHz*/   

           },

          

           cfgI2cwrite={              /*I2C写入配置*/

           I2C_I2COAR_A_OF(0x01),

           I2C_I2CIMR_RMK(            /*屏蔽全部I2C中断*/

            I2C_I2CIMR_ICXRDY_MSK,

            I2C_I2CIMR_ICRRDY_MSK,

            I2C_I2CIMR_ARDY_MSK,

            I2C_I2CIMR_NACK_MSK,

            I2C_I2CIMR_AL_MSK

           ),

           I2C_I2CCLKL_ICCL_OF(60-6), /*I2C时钟频率100kHz*/

           I2C_I2CCLKH_ICCH_OF(60-6), /*I2C时钟频率100kHz*/

           I2C_I2CCNT_ICDC_OF(NUMOFWR),

           I2C_I2CSAR_A_OF(0x68),

           I2C_I2CMDR_RMK(

            I2C_I2CMDR_NACKMOD_ACK,

            I2C_I2CMDR_FREE_BSTOP,

            I2C_I2CMDR_STT_NONE,

            I2C_I2CMDR_STP_NONE,

            I2C_I2CMDR_MST_MASTER,

            I2C_I2CMDR_TRX_XMT,

            I2C_I2CMDR_XA_7BIT,

            I2C_I2CMDR_RM_NONE,

            I2C_I2CMDR_DLB_NONE,

            I2C_I2CMDR_IRS_RST,

            I2C_I2CMDR_STB_NONE,

            I2C_I2CMDR_FDF_NONE,

            I2C_I2CMDR_BC_BIT8FDF

           ),

           I2C_I2CPSC_IPSC_OF(50-1),  /*预缩放时钟频率600M/50=12MHz*/   

           };

#pragma DATA_ALIGN(rcvdata,4);

Uint8 rcvdata[NUMOFRD];

Uint8 wrtdata[NUMOFWR];

typedef struct{

int year;

int month;

int day;

int date;

int hour;

int minutes;

int second;

int hourflag;                    //0-24,n0-12

int ampm;

} time;

time rcvtime;

int endflag=0,endcond=0;

EDMA_Config cfgEdmaRead={

  EDMA_OPT_RMK(

    EDMA_OPT_PRI_LOW,

    EDMA_OPT_ESIZE_8BIT,

    EDMA_OPT_2DS_NO,

    EDMA_OPT_SUM_NONE,

    EDMA_OPT_2DD_NO,

    EDMA_OPT_DUM_INC,

    EDMA_OPT_TCINT_YES,

    EDMA_OPT_TCC_OF(0xc),

    EDMA_OPT_TCCM_OF(0x2),

    EDMA_OPT_ATCINT_NO,

    EDMA_OPT_ATCC_OF(0),

    EDMA_OPT_PDTS_DISABLE,

    EDMA_OPT_PDTD_DISABLE,

    EDMA_OPT_LINK_NO,

    EDMA_OPT_FS_NO

  ),

  EDMA_SRC_OF((unsigned long*)0x01b40018),

  EDMA_CNT_OF(NUMOFRD),

  EDMA_DST_OF(rcvdata),

  EDMA_IDX_OF(0x00000001),

  EDMA_RLD_OF(0x00000000)

  };

EDMA_Handle hEdmaRead;

void datadecoder(Uint8 *,time *);

void timedisplay(time *);

void irqset();

extern void vectors();

void main(){

CSL_init();

EDMA_clearPram(0);

hEdmaRead=EDMA_open(EDMA_CHA_ICREVT0,EDMA_OPEN_RESET);

EDMA_reset(hEdmaRead);

EDMA_config(hEdmaRead,&cfgEdmaRead);

I2C_enable();

hI2c=I2C_open(I2C_DEV0,I2C_OPEN_RESET);

while(hI2c==INV){

  printf("I2C open error.");

  hI2c=I2C_open(I2C_DEV0,I2C_OPEN_RESET);

}

wrtdata[0]=0x10;

wrtdata[1]=0x00;

I2C_write(hI2c,&cfgI2cwrite,wrtdata);

I2C_resetAll();

I2C_config(hI2c,&cfgI2cread);                     //配置I2C模块

I2C_outOfReset(hI2c);

irqset();

EDMA_enableChannel(hEdmaRead);

I2C_readByte(hI2c);

while(I2C_bb(hI2c));                            //等待I2C总线空闲

I2C_start(hI2c);

while(!endcond) endcond=endflag;

printf("程序结束\n");

}

/*时间解码函数*/

void datadecoder(Uint8* p,time* ptime){

/*解码年*/

ptime->year=*(p+6)+100*(19+((*(p+5)&0x80)>>7));

/*解码月*/

ptime->month=BCD2HEX(*(p+5)&0x1f);

/*解码日*/

ptime->date=BCD2HEX(*(p+4));

/*解码星期*/

ptime->day=*(p+3);

/*解码小时*/

if(ptime->hourflag=*(p+2)&0x40){       //1-12,0-24

  ptime->hour=BCD2HEX(*(p+2)&0x1f);

  ptime->ampm=(*(p+2)&0x20)>>5;

}

else{

  ptime->hour=BCD2HEX(*(p+2)&0x3f);

}

/*解码分钟*/

ptime->minutes=BCD2HEX(*(p+1));

/*解码秒*/

ptime->second=BCD2HEX(*p);

}

/*时间显示函数*/

void timedisplay(time *ptime){

char str[7];

switch(ptime->day){

case 1:strcpy(str,"星期一");

  break;

case 2:strcpy(str,"星期二");

  break;

case 3:strcpy(str,"星期三");

  break;

case 4:strcpy(str,"星期四");

  break;

case 5:strcpy(str,"星期五");

  break;

case 6:strcpy(str,"星期六");

  break;

default:strcpy(str,"星期日");

  break;

}

printf("现在时间是%d年%d月%d日%s",ptime->year,ptime->month,ptime->date,str)
;

if(ptime->hourflag){

  if(ptime->ampm)

   printf("下午",ptime->hour);

  else

   printf("上午",ptime->hour);

}

printf("%d时%d分%d秒\n",ptime->hour,ptime->minutes,ptime->second);

}

void irqset(){

IRQ_setVecs(vectors);

IRQ_nmiEnable();

IRQ_globalEnable();

IRQ_reset(IRQ_EVT_EDMAINT);

IRQ_enable(IRQ_EVT_EDMAINT);

EDMA_intDisable(44);

EDMA_intClear(44);

EDMA_intEnable(44);

}

interrupt void c_int08(){

while(!I2C_bb(hI2c));

I2C_sendStop(hI2c);

I2C_resetAll();

I2C_close(hI2c);

I2C_disable();

datadecoder(rcvdata,&rcvtime);

timedisplay(&rcvtime);

EDMA_intClear(44);

EDMA_intDisable(44);

EDMA_close(hEdmaRead);

IRQ_reset(IRQ_EVT_EDMAINT);

IRQ_disable(IRQ_EVT_EDMAINT);

IRQ_globalDisable();

IRQ_nmiDisable();

endflag=1;

}

文件二 myI2C.h

#include<stdio.h>

#include<std.h>

#include<csl.h>

#include<csl_chip.h>

#include<csl_i2c.h>

void I2C_enable(){

CHIP_Config cfgChip;

CHIP_getConfig(&cfgChip);

cfgChip.percfg|=0x8;

CHIP_config(&cfgChip);

}

void I2C_disable(){

CHIP_Config cfgChip;

CHIP_getConfig(&cfgChip);

cfgChip.percfg&=~((Uint32)0x8);

CHIP_config(&cfgChip);

}

/**************************************************************

I2C总线数据接收函数,I2CMDR寄存器RM位必须置0,即非重复传送模式

典型配置结构如下:                                            

cfgI2cread={                                                               
     

           I2C_I2COAR_A_OF(0x01),                             

           I2C_I2CIMR_RMK(              屏蔽全部I2C中断

            I2C_I2CIMR_ICXRDY_MSK,                            

            I2C_I2CIMR_ICRRDY_MSK, 

            I2C_I2CIMR_ARDY_MSK,

            I2C_I2CIMR_NACK_MSK,

            I2C_I2CIMR_AL_MSK

           ),

           I2C_I2CCLKL_ICCL_OF(60-6),  I2C时钟频率100kHz

           I2C_I2CCLKH_ICCH_OF(60-6),  I2C时钟频率100kHz

           I2C_I2CCNT_ICDC_OF(NUMOFRD),

           I2C_I2CSAR_A_OF(0x68),

           I2C_I2CMDR_RMK(

            I2C_I2CMDR_NACKMOD_ACK,

            I2C_I2CMDR_FREE_BSTOP,

            I2C_I2CMDR_STT_NONE,

            I2C_I2CMDR_STP_NONE,

            I2C_I2CMDR_MST_MASTER,

            I2C_I2CMDR_TRX_RCV,

            I2C_I2CMDR_XA_7BIT,

            I2C_I2CMDR_RM_NONE,

            I2C_I2CMDR_DLB_NONE,

            I2C_I2CMDR_IRS_RST,        I2C_I2CMDR_STB_NONE,

            I2C_I2CMDR_FDF_NONE,

            I2C_I2CMDR_BC_BIT8FDF

           ),

           I2C_I2CPSC_IPSC_OF(50-1),   预缩放时钟频率600M/50=12MHz   

           }

************************************************************************/

void I2C_read(I2C_Handle handleI2C,I2C_Config *configI2C,Uint8 *readdata){

int i;

I2C_Config tempConfig;

I2C_getConfig(handleI2C,&tempConfig);                //保存I2C原始配置

I2C_resetAll();

I2C_config(handleI2C,configI2C);                     //配置I2C模块

I2C_outOfReset(handleI2C);

while(I2C_bb(handleI2C));                            //等待I2C总线空闲

I2C_start(handleI2C);                                //产生起始条件

for(i=0;i<configI2C->i2ccnt;i++){                    //读取数据

  while(!I2C_rrdy(handleI2C));

  readdata[i]=I2C_readByte(handleI2C);

}

I2C_sendStop(handleI2C);                             //产生结束条件

while(I2C_bb(handleI2C));                            //等待I2C总线空闲

I2C_resetAll();

I2C_config(handleI2C,&tempConfig);                   //恢复I2C原始配置

}

/**************************************************************

I2C总线数据接收函数,I2CMDR寄存器RM位必须置0,即非重复传送模式

典型配置结构如下:                                            

cfgI2cread={                                                               
     

           I2C_I2COAR_A_OF(0x01),                             

           I2C_I2CIMR_RMK(              屏蔽全部I2C中断

            I2C_I2CIMR_ICXRDY_MSK,                            

            I2C_I2CIMR_ICRRDY_MSK, 

            I2C_I2CIMR_ARDY_MSK,

            I2C_I2CIMR_NACK_MSK,

            I2C_I2CIMR_AL_MSK

           ),

           I2C_I2CCLKL_ICCL_OF(60-6),  I2C时钟频率100kHz

           I2C_I2CCLKH_ICCH_OF(60-6),  I2C时钟频率100kHz

           I2C_I2CCNT_ICDC_OF(NUMOFWR+1),

           I2C_I2CSAR_A_OF(0x68),

           I2C_I2CMDR_RMK(

            I2C_I2CMDR_NACKMOD_ACK,

            I2C_I2CMDR_FREE_BSTOP,

            I2C_I2CMDR_STT_NONE,

            I2C_I2CMDR_STP_NONE,

            I2C_I2CMDR_MST_MASTER,

            I2C_I2CMDR_TRX_XMT,

            I2C_I2CMDR_XA_7BIT,

            I2C_I2CMDR_RM_NONE,

            I2C_I2CMDR_DLB_NONE,

            I2C_I2CMDR_IRS_RST,        I2C_I2CMDR_STB_NONE,

            I2C_I2CMDR_FDF_NONE,

            I2C_I2CMDR_BC_BIT8FDF

           ),

           I2C_I2CPSC_IPSC_OF(50-1),   预缩放时钟频率600M/50=12MHz   

           }

************************************************************************/

void I2C_write(I2C_Handle handleI2C,I2C_Config *configI2C,Uint8 *writedata){


int i;

I2C_Config tempConfig;

I2C_getConfig(handleI2C,&tempConfig);                //保存I2C原始配置

I2C_resetAll();

I2C_config(handleI2C,configI2C);                     //配置I2C模块

I2C_outOfReset(handleI2C);

while(I2C_bb(handleI2C));                            //等待I2C总线空闲

I2C_start(handleI2C);                                //产生起始条件

for(i=0;i<configI2C->i2ccnt;i++){                    //写入数据

  while(!I2C_xrdy(handleI2C));

  I2C_writeByte(handleI2C,writedata[i]);

}

I2C_sendStop(handleI2C);                             //产生结束条件

while(I2C_bb(handleI2C));                            //等待I2C总线空闲

I2C_resetAll();

I2C_config(handleI2C,&tempConfig);                   //恢复I2C原始配置

}

文件三 vector.asm (中断向量表)

   .global _vectors

   .global _c_int00

   .global _vector1

   .global _vector2

   .global _vector3

   .global _vector4

   .global _vector5

   .global _vector6

   .global _vector7

   .global _c_int08

VEC_ENTRY .macro addr

    STW   B0,*--B15

    MVKL  addr,B0

    MVKH  addr,B0

    B     B0

    LDW   *B15++,B0

    NOP   2

    NOP  

    NOP  

   .endm

VEC_NOP .macro

    NOP

    NOP

    NOP

    NOP

    NOP

    NOP

    NOP

    NOP

   .endm

.sect ".text:vector"

.align 1024

_vectors:

_vector0:   VEC_ENTRY _c_int00

_vector1:   VEC_NOP

_vector2:   VEC_NOP

_vector3:   VEC_NOP

_vector4:   VEC_NOP

_vector5:   VEC_NOP

_vector6:   VEC_NOP

_vector7:   VEC_NOP

_vector8:   VEC_ENTRY _c_int08  


               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    DM642上TCP/IP协议的实现及性…
    基于DM642嵌入式无线视频监控…
    DM642 I2C通用读写源代码
    基于AVS-M和DM642视频服务器…
    DM642 Ver2.0多路实时图像处…
    DM642与百兆以太网接口设计
    DM642与1394a的接口设计
    DM642和线阵CCD的接口
    DM642与以太网的接口
    DM642与CMOS图像传感器的接口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号