![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 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条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|