4851|10

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

写了一个rtc驱动的应用程序,无法设置rtc的值 [复制链接]

目前做的是freescale mx27+ce500,rtc是独立的一个实时时钟ic,为sd2068,在应用程序中通过OnBtnWriteRtc进行写
void CRTC_testDlg::OnBtnWriteRtc()
{
        // TODO: Add your control notification handler code here
        BOOL bWrite;
        UpdateData(TRUE);
        m_sysTime.wYear = m_uYear;
        m_sysTime.wMonth = m_uMonth;
        m_sysTime.wDay = m_uDay;
        m_sysTime.wHour = m_uHour;
        m_sysTime.wMinute = m_uMin;
        m_sysTime.wSecond = m_uSec;
       
        if(!SetSystemTime(&m_sysTime))
                MessageBox(TEXT("SetSystemTime is failed! "), NULL, MB_OK);

        if(m_hRTC)
                bWrite = ::DeviceIoControl(m_hRTC, IOCTL_RTC_WRITE_CURRENT_TIME, &m_sysTime, sizeof(SYSTEMTIME), NULL, 0, NULL,NULL);
        else
                MessageBox(TEXT("m_hRTC is failed! "), NULL, MB_OK);

        if(!bWrite)
        {
                MessageBox(TEXT("bWrite is failed! "), NULL, MB_OK);//每次都返回失败,弹出这个对话框
        //        RETAILMSG(1,(TEXT("DeviceIoControl Write is error!")));
        }
}

驱动中的相应代码:
        switch(dwCode)
        {
        case RTC_WRITE_CURRENT_TIME:
                st = (SYSTEMTIME*)pBufIn;
              memset(bBufIn, 0, 6);
                TimestoBCD(st, bBufIn);
                Write_SD2068(hI2C, RTC_I2C_ADDRESS, bBufIn);
                bRet = TRUE;//这地方改成false也不行
                break;
觉得很奇怪,在驱动的初始化的时候, 对rtc读写都没问题,并且也能设置系统时钟,不知道这问题出在那,麻烦大家给指点指点

最新回复

结贴了,更串口能用的时候一步一步的来看。。。  详情 回复 发表于 2009-5-23 10:55
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我分析可能出在m_hRTC句柄身上,就要压根没进入到驱动里面去。
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
顶楼上的。
m_hRTC是全局变量?看其它地方有没有被释放掉。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
memset(bBufIn, 0, 6);  //清零??

//下面再用
TimestoBCD(st, bBufIn);
Write_SD2068(hI2C, RTC_I2C_ADDRESS, bBufIn);
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
对,是清零啊。
引用 3 楼 nick_TS16949 的回复:
memset(bBufIn, 0, 6);  //清零??

//下面再用
TimestoBCD(st, bBufIn);
Write_SD2068(hI2C, RTC_I2C_ADDRESS, bBufIn);
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
我倒,那你不是把RTC全部寄存器都写0了?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
不是啊楼上的那几位哥们,我把代码全部贴出来,现在应该清楚了吧,呵呵
BOOL RTC_IOControl(DWORD hOpenContext,
                   DWORD dwCode,
                   PBYTE pBufIn,
                   DWORD dwLenIn,
                   PBYTE pBufOut,
                   DWORD dwLenOut,
                   PDWORD pdwActualOut)
{
//   int nIndex=0;
    BOOL bRet = FALSE;
SYSTEMTIME* st;
BYTE bBufIn[6] ; //这个和输入的pbufin不一样,用于存放SYSTEMTIME结构转换成bcd码的数据的。
BYTE bBufOut[6];
//INT iResult;
// WORD* wData;
BYTE bySlaveAddr = 0x32;
    RETAILMSG(1,(TEXT("ioctrl: RTC_IOControl, Code: %x\r\n"), dwCode));
        switch(dwCode)
        {
        case RTC_WRITE_CURRENT_TIME:
                st = (SYSTEMTIME*)pBufIn;                     //传递指针
                memset(bBufIn, 0, 6);                         //清零,准备放bcd码到bBufIn中
                TimestoBCD(st, bBufIn);                       //把输入的系统时间转换成bcd码,存放在bbufin的6个字节中。
                Write_SD2068(hI2C, RTC_I2C_ADDRESS, bBufIn);  //把bbufin中的bcd码写入RTC芯片中
                bRet = TRUE;
                break;
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
其实驱动里的代码是没多大问题的,我在RTC_Init()中用下面这段代码,显示都是正确的,rtc读写都没问题,并且系统时钟也都改变了
                oldTime.wYear = 2009;
                oldTime.wMonth = 5;
                oldTime.wDay = 13;
                oldTime.wHour = 15-8;
                oldTime.wMinute = 40;
                oldTime.wSecond = 30;

                TimestoBCD(&oldTime, bBufIn);       
                Write_SD2068(hI2C, bySlaveAddr, bBufIn);
                Read_SD2068(hI2C, bySlaveAddr, bReadBuf);
                BCDtoTimes(bReadBuf, &pTime);
       
                if(!SetSystemTime(&pTime))
                {
                        RETAILMSG(1,(TEXT("RTC_Init : SetSystemTime failed    // modify by 20090512\r\n")));
                }

但当应用操作驱动的 RTC_IOControl读和写,返回都是false,数据也不能改变系统时钟,郁闷了一段时间了
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
1. RTC 不就是 kernel 中的东西吗, 怎麽会搞一个 driver 出来, 玩 CE 那麽久了还第一次看到, 不解, 不知 LZ 对於 Application call GetSystemTime() 怎麽处理的??

2. AP 中用的 IOCTL_RTC_WRITE_CURRENT_TIME 与 Driver 中用的 RTC_WRITE_CURRENT_TIME 是同一个值吗??

3. i.MX27 不是都用 PMIC MC13783 吗?? LZ 自己又搞了一套啊, 你们的 Hardware Engineer 真勇敢, 也为你们的 Software Engineer 默哀.

Paul, Chao @ Techware
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 paul_chao 的回复:
1. RTC 不就是 kernel 中的东西吗, 怎麽会搞一个 driver 出来, 玩 CE 那麽久了还第一次看到, 不解, 不知 LZ 对於 Application call GetSystemTime() 怎麽处理的??

2. AP 中用的 IOCTL_RTC_WRITE_CURRENT_TIME 与 Driver 中用的 RTC_WRITE_CURRENT_TIME 是同一个值吗??

3. i.MX27 不是都用 PMIC MC13783 吗?? LZ 自己又搞了一套啊, 你们的 Hardware Engineer 真勇敢, 也为你们的 Software Engineer 默哀.

Paul, Chao …

1。这个是硬件决定的,单独搞一个出来也没问题。
to 2。哥们,是同一个值,只是我刚才改了,把IOCTL_RTC_WRITE_CURRENT_TIME 改成RTC_WRITE_CURRENT_TIME 了,这个和应用程序是一定要保持一致的,不管有没有用我都是这么处理的
3。13783太贵了,我们没有用,你说的的确是这样的,对于驱动很恼火,我的电源管理又 用gpio又用9712,还有一些东西,我不想说了,他们总觉得驱动很简单,应该两三天搞定一个。。。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
结贴了,更串口能用的时候一步一步的来看。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表