查看: 4936|回复: 18

[求助] kinetis i2c 驱动的疑惑

[复制链接]

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
发表于 2015-1-14 10:10:47 | 显示全部楼层 |阅读模式
本帖最后由 cjpx84 于 2015-1-14 13:53 编辑

我看了手把手学习官方例程三Kinetis100MHzI2C.pdf文档,对i2c读取数据接口有个地方不是很理解。下面直接上代码:
u8 hal_dev_mma8451_read_reg(u8 addr)
{
    u8 result;
    i2c_start(I2C0_B);
    i2c_write_byte(I2C0_B, I2C_ADDR_MMA8451 | I2C_WRITE);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);
    i2c_write_byte(I2C0_B, addr);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);
    i2c_repeated_start(I2C0_B);
    i2c_write_byte(I2C0_B, I2C_ADDR_MMA8451 | I2C_READ);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);

    i2c_set_rx_mode(I2C0_B);
    i2c_give_nack(I2C0_B); -----------这里进入receive模式之后

    result = i2c_read_byte(I2C0_B);---------这里为什么要清除1字节数据
    i2c_wait(I2C0_B);


    i2c_stop(I2C0_B);
    result = i2c_read_byte(I2C0_B);-----------而我们真实接收的数据是在这里,如果我要接收多个字节数据,应该怎么做?
    pause();
    return result;
}

我知道答案 目前已有18人回答
回复

使用道具 举报

该用户从未签到

1

主题

65

帖子

0

中级会员

Rank: 3Rank: 3

积分
233
最后登录
1970-1-1
发表于 2015-1-14 10:56:44 | 显示全部楼层
i2c_rx.png
1. 认真看 芯片 reference manual 哦
2. 这个 read_data_register 可以理解为 “ //读接收到的数据,并保存, 同时释放了总线,等待下一次传输。 ”  对于最后一个数据, 如果你master先读了data_register , 立刻马上slave 会发送下一个byte的数据, 所以 一般是 master 先给 slave 发一个stop信号, 然后再把保存在 master的data 读出来
3.貌似很多地方讨论了类似的问题,回答的不好的话, 你翻翻之前的帖子吧
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

65

帖子

0

中级会员

Rank: 3Rank: 3

积分
233
最后登录
1970-1-1
发表于 2015-1-14 10:58:08 | 显示全部楼层
wacaca 发表于 2015-1-14 10:56
1. 认真看 芯片 reference manual 哦
2. 这个 read_data_register 可以理解为 “ //读接收到的数据,并保 ...

补充一下,
   i2c_give_nack(I2C0_B); -----------这里进入receive模式之后

    result = i2c_read_byte(I2C0_B);---------这里为什么要清除1字节数据

不dummy read 一下, 不释放总线,slave 没法开始发数据的
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-1-14 11:43:39 | 显示全部楼层
本帖最后由 FSL_TICS_ZP 于 2015-1-14 11:45 编辑

2楼是正解。
楼主换个标题吧,原标题容易让人发生歧义!




回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-14 13:04:04 | 显示全部楼层
本帖最后由 cjpx84 于 2015-1-14 13:15 编辑

恩,没有注意手册上的内容,谢谢2楼!

unsigned short i2c_battery_read_word(unsigned char slaveID,unsigned int cmdCode)
{
  unsigned char result[2];
  unsigned short retval=0;
  unsigned char dumpbyte;
  /* send start signal */
   i2c_Start();
  /* Send Slave Address */
  i2c_send_slave_addr(slaveID,MWSR);
  /*wait the data transfer complete*/
  i2c_Wait();
i2c_get_ack();
  
  /* Write command code*/
  i2c_write_byte(cmdCode);
  i2c_Wait();
  i2c_get_ack();
  
  /* Do a repeated start */
  i2c_RepeatedStart();
  /* Send Slave Address */
  i2c_send_slave_addr(slaveID,MRSW);
  i2c_Wait();
  i2c_get_ack();
  
  /* Put in Rx Mode */
  i2c_EnterRxMode();
  /* Dummy read */
  dumpbyte = I2C0_D ;
  i2c_Wait();

  /*2nd to last byte to be read*/
  /*set txack*/
  i2c_give_nack();
  result[0] = I2C0_D;
  i2c_Wait();

/*last byte to be read generate stop signal*/
        i2c_Stop();
/* Read byte */
  result[1] = I2C0_D ;
  Pause();
  retval = result[1]<< 8 | result[0] ;

  return retval;
}


我按照协议写了一个接口,读出来的数据是0Xff,是不是我哪里写的还有问题?我的从设备是一个智能电池的充电芯片,是SMBUS总线。

回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-14 13:13:51 | 显示全部楼层
本帖最后由 cjpx84 于 2015-1-14 13:46 编辑
FSL_TICS_ZP 发表于 2015-1-14 11:43
2楼是正解。
楼主换个标题吧,原标题容易让人发生歧义!


这个怎么改,我对这个坛子不熟悉,没有找见。。。。。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-1-14 13:38:32 | 显示全部楼层
cjpx84 发表于 2015-1-14 13:13
这个怎么改,我对这个坛子不熟悉,没有找见。。。。。

编辑后,然后修改标题!
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-14 13:56:15 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-1-14 13:38
编辑后,然后修改标题!

已经修改过了。麻烦帮忙看看我写的那个读i2c的接口。现在读数据总感觉有问题。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-1-14 14:14:04 | 显示全部楼层
cjpx84 发表于 2015-1-14 13:56
已经修改过了。麻烦帮忙看看我写的那个读i2c的接口。现在读数据总感觉有问题。 ...

好的,你可以尝试用逻辑分析仪看看I2C的通信波形是如何!
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-14 14:27:49 | 显示全部楼层
抓过了,现在有一个奇怪的问题。我用的是coderwarrior开发的,直接运行程序,读出来的数据是正确的。单步调试的时候,会出现接收不到数据的ACK消息,即使接收到ACK消息,读取的数据是FF。示波器上抓的数据是正常的。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-23 05:11 , Processed in 0.106151 second(s), 31 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表