注册 登录
查看: 747|回复: 8

[K60] 关于K60硬件IIC读取HMC5883L数据的问题

[复制链接]
发表于 2014-8-1 14:08:09 | 显示全部楼层 |阅读模式
这几天在弄磁力计,但是花了很多时间,读取都出错,求大神帮帮忙啊!

我先对磁力计进行了初始化
  1. void HMC5883_Init()
  2. {
  3.     i2c_write_reg(I2C1, 0x3c, 0x02,0x00);  //连续测量模式;        0x01:单一
  4.    i2c_write_reg(I2C1, 0x3c, 0x01,0xe0);  //测量增益范围设置
  5.    i2c_write_reg(I2C1, 0x3c, 0x00,0x78);  //最高速测量
  6. }
然后我就一直读它的寄存器
  1. void Multiple_read_HMC5883(void)
  2. {
  3.      uint8 i;
  4.      for(i=0;i<6;i++)
  5.      {
  6.               HMC5883_BUFF[i] = i2c_read_reg(I2C1, 0x3c, 0x03 + i);
  7.      }
  8. }
最后我用printf函数把数组HMC5883_BUFF中的值打印出来,但是它却一直显示的是255,不知道是哪的问题....
IIC的速度是400K!
回复

使用道具 举报

发表于 2014-8-1 14:26:37 | 显示全部楼层
试下降低波特率,另外,从机地址配置是否正确?
最好用示波器采集波形来看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 15:48:29 | 显示全部楼层
山外メ雲ジ 发表于 2014-8-1 14:26
试下降低波特率,另外,从机地址配置是否正确?
最好用示波器采集波形来看

请问程序这样有问题吗?因为我看到磁力计给的例程中是用模拟IIC这样写的
  1. void Multiple_read_HMC5883(void)
  2. {   uchar i;
  3.     HMC5883_Start();                          //起始信号
  4.     HMC5883_SendByte(SlaveAddress);           //发送设备地址+写信号
  5.     HMC5883_SendByte(0x03);                   //发送存储单元地址,从0x3开始       
  6.     HMC5883_Start();                          //起始信号
  7.     HMC5883_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  8.          for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
  9.     {
  10.         BUF[i] = HMC5883_RecvByte();          //BUF[0]存储数据
  11.         if (i == 5)
  12.         {
  13.            HMC5883_SendACK(1);                //最后一个数据需要回NOACK
  14.         }
  15.         else
  16.         {
  17.           HMC5883_SendACK(0);                //回应ACK
  18.        }
  19.    }
  20.     HMC5883_Stop();                          //停止信号
  21.     Delay5ms();
  22. }
另外波特率是指IIC的速度还是串口的波特率啊?从机的写地址是0x3C,读地址是0x3D
示波器采集的波形主要看什么?
回复 支持 反对

使用道具 举报

发表于 2014-8-1 19:03:21 | 显示全部楼层
风一样的丶man 发表于 2014-8-1 15:48
请问程序这样有问题吗?因为我看到磁力计给的例程中是用模拟IIC这样写的另外波特率是指IIC的速度还是串口 ...

我们的例程,从机地址,是指 7bit 的,即你的是 (0x3C>>1)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 19:21:10 | 显示全部楼层
山外メ雲ジ 发表于 2014-8-1 19:03
我们的例程,从机地址,是指 7bit 的,即你的是 (0x3C>>1)

非常感谢你的回答,终于找到原因了

但是为什么程序只能运行几秒钟就卡死在i2c_Wait()这个函数了呢?
回复 支持 反对

使用道具 举报

发表于 2014-8-1 19:48:29 | 显示全部楼层
风一样的丶man 发表于 2014-8-1 19:21
非常感谢你的回答,终于找到原因了

但是为什么程序只能运行几秒钟就卡死在i2c_Wait()这个函 ...

I2C ,每次读和每次写的时候,中间都加个延时试试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 19:59:27 | 显示全部楼层
山外メ雲ジ 发表于 2014-8-1 19:48
I2C ,每次读和每次写的时候,中间都加个延时试试。

一样效果呢,我程序中只有IIC和串口程序,其他什么都没有,IIC的速度是400K,串口的速度是115200,我把串口全关闭也是一样会卡死
回复 支持 反对

使用道具 举报

发表于 2014-8-1 20:16:40 | 显示全部楼层
风一样的丶man 发表于 2014-8-1 19:59
一样效果呢,我程序中只有IIC和串口程序,其他什么都没有,IIC的速度是400K,串口的速度是115200,我把串 ...

I2C 400K  是最高波特率速度了,调低一下I2C的波特率看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 20:27:10 | 显示全部楼层
山外メ雲ジ 发表于 2014-8-1 20:16
I2C 400K  是最高波特率速度了,调低一下I2C的波特率看看。

我换成100K也不行啊,快崩溃了
就这几行代码
  1. void HMC5883_Init()
  2. {
  3.     i2c_write_reg(I2C0, 0x3c >> 1, 0x02,0x00);  //连续测量模式;        0x01:单一
  4.         i2c_write_reg(I2C0, 0x3c >> 1, 0x01,0xE0);  //测量增益范围设置
  5.         i2c_write_reg(I2C0, 0x3c >> 1, 0x00,0x78);  //最高速测量
  6. }

  7. void Multiple_read_HMC5883(void)
  8. {
  9.         uint8 i;
  10.         for(i=0;i<6;i++)
  11.         {
  12.                 HMC5883_BUFF[i] = i2c_read_reg(I2C0, 0x3c >> 1, 0x03+i);
  13.         }
  14. }

  15. void main()
  16. {
  17.     DELAY_MS(100);
  18.         i2c_init(I2C0,100*1000);
  19.         HMC5883_Init();
  20.         while(1)
  21.         {
  22.                 Multiple_read_HMC5883();
  23.                 DELAY_MS(100);
  24.         }
  25. }
回复 支持 反对

使用道具 举报

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

本版积分规则

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