免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3944 | 回复: 3
打印 上一主题 下一主题

I2C总线上的RTC驱动(HT1382)问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-03 21:39 |只看该作者 |倒序浏览
  1. static int ht1382_get_datetime(struct i2c_client *client, struct rtc_time *tm)
  2. {
  3.         unsigned char buf[8] = { 0x00 };
  4.         struct i2c_msg msgs[] = {
  5.                 {
  6.                         .addr = client->addr,
  7.                         .flags = 0,
  8.                         .len = 1,
  9.                         .buf = buf,
  10.                 }, {
  11.                         .addr = client->addr,
  12.                         .flags = I2C_M_RD,
  13.                         .len = sizeof(buf),
  14.                         .buf = buf,
  15.                 }
  16.         };

  17.         /* read registers */
  18.         if ((i2c_transfer(client->adapter, msgs, 2)) != 2) {
  19.                 dev_err(&client->dev, "%s: read error\n", __func__);
  20.                 return -EIO;
  21.         }
  22.        

  23.         tm->tm_year   = bcd2bin((buf[INX_YEAR]>>4)*10 + (buf[INX_YEAR]&0x0f) + ORIGINYEAR);
  24.         tm->tm_year   -=1900;
  25.         tm->tm_wday   = bcd2bin(buf[INX_WEEK]&0x0f);
  26.         tm->tm_mon    = bcd2bin((buf[INX_MONTH]>>4)*10+ (buf[INX_MONTH]&0x0f));
  27.         tm->tm_mon    -= 1;
  28.         tm->tm_mday   = bcd2bin((buf[INX_DAY]>>4)*10  + (buf[INX_DAY]&0x0f));
  29.         tm->tm_hour   = bcd2bin((buf[INX_HOUR]>>4)*10 + (buf[INX_HOUR]&0x0f));
  30.         tm->tm_min    = bcd2bin(((buf[INX_MIN]&0x7f)>>4)*10  + (buf[INX_MIN]&0x0f));
  31.         tm->tm_sec    = bcd2bin(((buf[INX_SEC]&0x7f)>>4)*10  + (buf[INX_SEC]&0x0f));
  32.         if (rtc_valid_tm(tm) < 0)
  33.                 dev_err(&client->dev, "retrieved date/time is not valid.\n");

  34.         return 0;

  35. }

  36. static int ht1382_set_datetime(struct i2c_client *client, struct rtc_time *tm)
  37. {
  38.         unsigned char buf[8] = { 0x00 };
  39.         int i,err;

  40.         dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, "
  41.                 "mday=%d, mon=%d, year=%d, wday=%d\n",
  42.                 __func__,
  43.                 tm->tm_sec, tm->tm_min, tm->tm_hour,
  44.                 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);

  45.         buf[INX_SEC]        = bin2bcd(tm->tm_sec);
  46.         buf[INX_MIN]        = bin2bcd(tm->tm_min);
  47.         buf[INX_HOUR]        = bin2bcd(tm->tm_hour);
  48.         buf[INX_DAY]        = bin2bcd(tm->tm_mday);
  49.         buf[INX_MONTH]        = bin2bcd(tm->tm_mon + 1);
  50.         buf[INX_WEEK]        = bin2bcd(tm->tm_wday & 0x07);
  51.         buf[INX_YEAR]        = bin2bcd(tm->tm_wday + 1900);

  52.         /* write register's data */
  53.         for (i = 0; i < 7; i++) {
  54.                 unsigned char data[2] = { HT1382_REG_SC + i, buf[HT1382_REG_SC + i] };

  55.                 err = i2c_master_send(client, data, sizeof(data));
  56.                 if (err != sizeof(data)) {
  57.                         dev_err(&client->dev,
  58.                                 "%s: err=%d addr=%02x, data=%02x\n",
  59.                                 __func__, err, data[0], data[1]);
  60.                         return -EIO;
  61.                 }
  62.         };

  63.         return 0;
  64. }

  65. static int ht1382_rtc_read_time(struct device *dev, struct rtc_time *tm)
  66. {
  67.         return ht1382_get_datetime(to_i2c_client(dev), tm);
  68. }

  69. static int ht1382_rtc_set_time(struct device *dev, struct rtc_time *tm)
  70. {
  71.         return ht1382_set_datetime(to_i2c_client(dev), tm);
  72. }
复制代码
上面是我写的读出数据和写入数据的驱动代码,运行时,读出数据会提示read error,(写数据也是错)报错部分的代码是:
/* read registers */
        if ((i2c_transfer(client->adapter, msgs, 2)) != 2) {
                dev_err(&client->dev, "%s: read error\n", __func__);
                return -EIO;
        }
下面的是ht1382手册中说的的读选项


还望高人指点,该如何来实现读的驱动代码,或者简单的给点代码指导,感觉我的代码中I2C_msg那里就是错的,第一次写I2C设备驱动,还望各位海涵
附件中是ht1382的手册,谢谢!

ht1382v140.pdf

317.13 KB, 下载次数: 24

论坛徽章:
0
2 [报告]
发表于 2013-12-27 10:00 |只看该作者
上示波器看波形,双通道一个SCL一个SDA,一目了然

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:15午马
日期:2015-02-04 12:00:07羊年新春福章
日期:2015-02-04 11:57:56双子座
日期:2014-12-02 11:44:59金牛座
日期:2014-10-08 16:47:08狮子座
日期:2014-08-29 13:37:46巳蛇
日期:2014-08-26 17:32:29NBA常规赛纪念章
日期:2015-05-04 22:32:03
3 [报告]
发表于 2014-01-17 16:27 |只看该作者
先看SCL,SDA有没有波形,确定时序和数据都是正确的,再看有没有收到数据。

论坛徽章:
0
4 [报告]
发表于 2014-01-18 23:37 |只看该作者
1.确认芯片及硬件电路无问题,可用在uboot命令行模式下,用iprobe命令探测i2c器件;
2.这种代码在内核/driver/rtc目录下应该有其他的芯片可参考吧;
3.其实还有一种测试方法,就是在应用层里调用i2c总线接口。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP