注册 登录
查看: 516|回复: 14

[其他] k60的I2c程序报错

[复制链接]
发表于 2014-7-31 12:32:44 | 显示全部楼层 |阅读模式
  1. I2C_WriteAddr(I2C1,MS561101BA_ADDR_CSB_HIGH, _addr,0);
  2.   //three part datas ,akonwleage 0   
  3.   /* Send Slave Address */
  4.     I2C_StartTransmission (I2C1, MS561101BA_ADDR_CSB_HIGH, MWSR);
  5.     i2c_Wait(I2C1);

  6.     /* Write Register Address */
  7.     i2c_write_byte(I2C1 ,_addr);
  8.     i2c_Wait(I2C1);

  9.     /* Do a repeated start */
  10.     i2c_RepeatedStart(I2C1);

  11.     /* Send Slave Address */
  12.     i2c_write_byte(I2C1, ( MS561101BA_ADDR_CSB_HIGH << 1) | MRSW );
  13.     i2c_Wait(I2C1);

  14.     /* Put in Rx Mode */
  15.     //i2c_PutinRxMode(i2cn);
  16.     i2c_EnterRxMode(I2C1)//应答模式
  17.     /*  ACK since this is second to last byte being read*/   
  18.     /* Dummy read 虚假读取*/
  19.     conversion0 = I2C_D_REG(I2Cx1);
  20.     i2c_Wait(I2C1);//
  21.     conversion1 = I2C_D_REG(I2Cx1);
  22.     i2c_Wait(I2C1);
  23.     conversion2 = I2C_D_REG(I2Cx1);
  24.     /* Send stop since about to read last byte */
  25.     i2c_Stop(I2C1);

  26.     /* Read byte */
  27.     conversion = conversion0 *65536+ conversion1 *256 + conversion2;
  28.    
  29.   return conversion;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-7-31 12:33:21 | 显示全部楼层
直接用我们的例程也报错?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 12:37:45 | 显示全部楼层
出错段代码是05,23,
  1. /*************************************************************************
  2. *                             山外嵌入式开发工作室
  3. *
  4. *  函数名称:I2C_ReadAddr
  5. *  功能说明:读取I2C设备指定地址寄存器的数据
  6. *  参数说明:I2Cn        模块号(I2C0、I2C1)
  7. *            SlaveID     7位从机地址
  8. *            Addr        从机的寄存器地址
  9. *  函数返回:从机寄存器的数据
  10. *  修改时间:2012-1-20
  11. *  备    注:
  12. *************************************************************************/
  13. u8 I2C_ReadAddr(I2Cn i2cn, u8 SlaveID, u8 Addr)
  14. {
  15.     u8 result;

  16.     /* Send Slave Address */
  17.     I2C_StartTransmission (i2cn, SlaveID, MWSR);
  18.     i2c_Wait(i2cn);

  19.     /* Write Register Address */
  20.     i2c_write_byte(i2cn, Addr);
  21.     i2c_Wait(i2cn);

  22.     /* Do a repeated start */
  23.     i2c_RepeatedStart(i2cn);

  24.     /* Send Slave Address */
  25.     i2c_write_byte(i2cn, ( SlaveID << 1) | MRSW );
  26.     i2c_Wait(i2cn);

  27.     /* Put in Rx Mode */
  28.     i2c_PutinRxMode(i2cn);

  29.     /* Turn off ACK since this is second to last byte being read*/
  30.     i2c_DisableAck(i2cn); //不应答

  31.     /* Dummy read 虚假读取*/
  32.     result = I2C_D_REG(I2Cx[i2cn]);
  33.     i2c_Wait(i2cn);

  34.     /* Send stop since about to read last byte */
  35.     i2c_Stop(i2cn);

  36.     /* Read byte */
  37.     result = I2C_D_REG(I2Cx[i2cn]);

  38.     return result;
  39. }
27,这是i2c.h和i2c_cfg.h里的定义,自带库里I2c配置函数里读数据的为不应答模式,不知道改为应答模式如何读数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 12:40:40 | 显示全部楼层
  1. u32 doConversion(u8 command) {
  2.   u32 conversion0 = 0,conversion1 = 0,conversion2 = 0,conversion  = 0;
  3.   // initialize pressure conversion
  4.   I2C_WriteAddr(I2C1,MS561101BA_ADDR_CSB_HIGH, _addr,command);
  5.   
  6.   // start read sequence开始读数据
  7.   I2C_WriteAddr(I2C1,MS561101BA_ADDR_CSB_HIGH, _addr,0);
  8.   //three part datas ,akonwleage 0   
  9.   /* Send Slave Address */
  10.     I2C_StartTransmission (I2C1, MS561101BA_ADDR_CSB_HIGH, MWSR);
  11.     i2c_Wait(I2C1);

  12.     /* Write Register Address */
  13.     i2c_write_byte(I2C1 ,_addr);
  14.     i2c_Wait(I2C1);

  15.     /* Do a repeated start */
  16.     i2c_RepeatedStart(I2C1);

  17.     /* Send Slave Address */
  18.     i2c_write_byte(I2C1, ( MS561101BA_ADDR_CSB_HIGH << 1) | MRSW );
  19.     i2c_Wait(I2C1);

  20.     /* Put in Rx Mode */
  21.     //i2c_PutinRxMode(i2cn);
  22.     i2c_EnterRxMode(I2C1)//应答模式
  23.     /*  ACK since this is second to last byte being read*/   
  24.     /* Dummy read 虚假读取*/
  25.     conversion0 = I2C_D_REG(I2Cx1);
  26.     i2c_Wait(I2C1);//
  27.     conversion1 = I2C_D_REG(I2Cx1);
  28.     i2c_Wait(I2C1);
  29.     conversion2 = I2C_D_REG(I2Cx1);
  30.     /* Send stop since about to read last byte */
  31.     i2c_Stop(I2C1);

  32.     /* Read byte */
  33.     conversion = conversion0 *65536+ conversion1 *256 + conversion2;
  34.    
  35.   return conversion;
  36. }
这是我改的应答模式,直接写在MS561101BA.h里的,也就是这里的i2c_Wait(I2C1);出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 12:45:20 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-31 12:33
直接用我们的例程也报错?

例程里的24c02是没错的,但是MS56110得I2c操作比24车复杂,不能直接移植,所以我自己改的MS5611驱动程序,其他的都没改过,应该是我写的驱动有问题,但是不知道错在哪里
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 12:51:32 | 显示全部楼层
MS561101的datesheet,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-7-31 12:53:31 | 显示全部楼层
I2Cx1   这个提示没定义
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 12:57:08 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-31 12:53
I2Cx1   这个提示没定义

I2c.c里的原句是result = I2C_D_REG(I2Cx[i2cn]);不懂神么意思
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:05:07 | 显示全部楼层
整个文件夹如何上传啊,我压缩成rar文件也传不上来。。。。。
回复 支持 反对

使用道具 举报

发表于 2014-7-31 13:16:13 | 显示全部楼层
柒夜 发表于 2014-7-31 12:57
I2c.c里的原句是result = I2C_D_REG(I2Cx);不懂神么意思

应该是 I2C1 吧
回复 支持 反对

使用道具 举报

发表于 2014-7-31 13:16:31 | 显示全部楼层
柒夜 发表于 2014-7-31 13:05
整个文件夹如何上传啊,我压缩成rar文件也传不上来。。。。。

删掉临时文件,再上传才行的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:35:18 | 显示全部楼层
文件太大无法上传,只上传了MS561101的驱动函数

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:36:29 | 显示全部楼层
i2c_Wait(I2C1);这个也报错,,,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:39:28 | 显示全部楼层
http://pan.baidu.com/s/1gd1P9eV已传至网盘,如果有时间的话,您可以看一下
回复 支持 反对

使用道具 举报

发表于 2014-7-31 14:16:55 | 显示全部楼层
柒夜 发表于 2014-7-31 13:39
http://pan.baidu.com/s/1gd1P9eV已传至网盘,如果有时间的话,您可以看一下

漏了在头文件里加入数组声明:
extern  volatile struct I2C_MemMap *I2Cx[2] ;
回复 支持 反对

使用道具 举报

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

本版积分规则

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