查看: 2806|回复: 4

[求助] 请教一个关于ke02 iic问题

[复制链接]

该用户从未签到

4

主题

22

帖子

0

注册会员

Rank: 2

积分
115
最后登录
2020-8-27
发表于 2015-1-4 16:38:30 | 显示全部楼层 |阅读模式
我在调试iic读MB85RC16时
     I2C0_C1 |= I2C_C1_IICEN_MASK ;    //使能IIC
     I2C0_S   |= I2C_S_IICIF_MASK;        //清中断位
     //=======================
     I2C0_C1 |= I2C_C1_TX_MASK ;         //写使能
     I2C0_C1 |= I2C_C1_MST_MASK ;      //开始信号
     //-----------------------
     I2C0_D = 0xA0;                              //发送芯片地址,写命令
     delay(10);
     while(!I2C_S_IICIF_MASK )              //等待发送完成
              ;
     I2C0_S |= I2C_S_IICIF_MASK;         //清中断位
     //===================
     I2C0_D=0x00;                               //发送地址
     delay(10);
     while(!I2C_S_IICIF_MASK)              //等待发送完成
          ;
     I2C0_S |= I2C_S_IICIF_MASK;        //清中断位
     //--------------------
    I2C0_C1 |= I2C_C1_RSTA_MASK;   //重启start信号
    。。。。。。。。
    运行到此处时,I2C0_C1(I2C_C1_RSTA_MASK)位没办法置位,请问大家,这是为什么?多谢!



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

使用道具 举报

该用户从未签到

11

主题

835

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1795
最后登录
2016-4-2
发表于 2015-1-15 01:18:18 | 显示全部楼层
分享一个IAR的I2c给兄台参考下:

KE02硬件IIC读取5883.rar

1.9 MB, 下载次数: 54, 下载积分: 威望 1

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

825

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1687
最后登录
2015-2-10
发表于 2015-1-31 23:59:46 | 显示全部楼层
本帖最后由 回眸一笑百媚生 于 2015-2-2 14:08 编辑

K64FRDM
/******************************************************************************
* File:    isr.h
* Purpose: Define interrupt service routines referenced by the vector table.
* Note: Only "vectors.c" should include this header file.
******************************************************************************/

#ifndef __ISR_H
#define __ISR_H








#endif
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

825

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1687
最后登录
2015-2-10
发表于 2015-2-2 14:06:56 | 显示全部楼层
  1. #include "common.h"
  2. #include "math.h"
  3. #include "isr.h"
  4. #include "uart.h"
  5. #include "i2c.h"

  6. #define   uchar unsigned char
  7. #define   uint unsigned int

  8. #define SlaveAddress 0x3c   //定义器件在IIC总线中的从地址

  9. int X,Y,Z;
  10. double Angle1,Angle2,Angle3;
  11. uchar Rec_Data[6];
  12. uint Acr1,Acr2,Acr3;

  13. void Delay(uint t)
  14. {
  15. while(t--);
  16. }

  17. void pause(void)
  18. {
  19.     int n;
  20.     for(n=0; n<100; n++);
  21. }

  22. void Single_Write_HMC5883(uint8 REG_Address,uint8 REG_data)
  23. {
  24.     I2C_start(I2C0_BASE_PTR);                  //起始信号
  25.    
  26.    
  27.     I2C_write_byte(I2C0_BASE_PTR,SlaveAddress);   //发送设备地址+写信号
  28.     I2C_wait(I2C0_BASE_PTR);
  29.     I2C_get_ack(I2C0_BASE_PTR);

  30.     I2C_write_byte(I2C0_BASE_PTR,REG_Address);    //内部寄存器地址
  31.     I2C_wait(I2C0_BASE_PTR);
  32.     I2C_get_ack(I2C0_BASE_PTR);
  33.    
  34.     I2C_write_byte(I2C0_BASE_PTR,REG_data);       //内部寄存器数据
  35.     I2C_wait(I2C0_BASE_PTR);
  36.     I2C_get_ack(I2C0_BASE_PTR);
  37.    
  38.     I2C_stop(I2C0_BASE_PTR);                   //发送停止信号
  39.     pause();
  40. }

  41. uchar Single_Read_HMC5883(uint8 REG_Address)
  42. {  
  43.     uint8 result;
  44.     I2C_start(I2C0_BASE_PTR);                           //起始信号
  45.    
  46.     I2C_write_byte(I2C0_BASE_PTR,SlaveAddress);           //发送设备地址+写信号
  47.     I2C_wait(I2C0_BASE_PTR);
  48.     I2C_get_ack(I2C0_BASE_PTR);
  49.    
  50.     I2C_write_byte(I2C0_BASE_PTR,REG_Address);            //发送存储单元地址,从0开始   
  51.     I2C_wait(I2C0_BASE_PTR);
  52.     I2C_get_ack(I2C0_BASE_PTR);
  53.    
  54.     I2C_repeated_start(I2C0_BASE_PTR);                          //起始信号
  55.    
  56.     I2C_write_byte(I2C0_BASE_PTR,SlaveAddress+1);         //发送设备地址+读信号
  57.     I2C_wait(I2C0_BASE_PTR);
  58.     I2C_get_ack(I2C0_BASE_PTR);
  59.       
  60.     I2C_set_rx_mode(I2C0_BASE_PTR);

  61.     I2C_give_nack(I2C0_BASE_PTR);
  62.     result = I2C_read_byte(I2C0_BASE_PTR);
  63.     I2C_wait(I2C0_BASE_PTR);

  64.     I2C_stop(I2C0_BASE_PTR);
  65.     result = I2C_read_byte(I2C0_BASE_PTR);
  66.     pause();
  67.     return result;
  68. }

  69. void dis()
  70. {
  71.   Rec_Data[0]=Single_Read_HMC5883(0x03);
  72.   Rec_Data[1]=Single_Read_HMC5883(0x04);   
  73.   Rec_Data[2]=Single_Read_HMC5883(0x05);   
  74.   Rec_Data[3]=Single_Read_HMC5883(0x06);   
  75.   Rec_Data[4]=Single_Read_HMC5883(0x07);   
  76.   Rec_Data[5]=Single_Read_HMC5883(0x08);  
  77.   Delay(1000);
  78.   X=Rec_Data[0]<<8 | Rec_Data[1];//Combine MSB and LSB of X Data output register
  79.   Z=Rec_Data[2]<<8 | Rec_Data[3];//Combine MSB and LSB of Z Data output register
  80.   Y=Rec_Data[4]<<8 | Rec_Data[5];//Combine MSB and LSB of Y Data output register
  81.   if(X>=32768)
  82.     X=X-65536;
  83.   if(Y>=32768)
  84.     Y=Y-65536;
  85.   if(Z>=32768)
  86.     Z=Z-65536;   
  87.   Angle1=atan2((double)Y,(double)X)*(180/3.1415)+180;
  88.   Angle2=atan2((double)X,(double)Z)*(180/3.1415)+180;  
  89.   Angle3=atan2((double)Z,(double)Y)*(180/3.1415)+180;  
  90.   Acr1=(uint)Angle1;
  91.   Acr2=(uint)Angle2;  
  92.   Acr3=(uint)Angle3;  
  93.   printf("Acr1=%d  Acr2=%d  Acr3=%d   \n",Acr1,Acr2,Acr3);
  94. }



  95. int main(void)
  96. {
  97.   printf("Hellow");
  98.   GPIOA_PDDR |= (1<<3);
  99.   I2C_Init(I2C0_BASE_PTR);
  100.   I2C_set_master_mode(I2C0_BASE_PTR);
  101.   Single_Write_HMC5883(0x02,0x00);
  102.   while(1)
  103.   {
  104.     dis();
  105.   }
  106. }
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

22

帖子

0

注册会员

Rank: 2

积分
115
最后登录
2020-8-27
 楼主| 发表于 2015-6-5 12:09:37 | 显示全部楼层

你好,多谢你的回复
有一点不明白,为啥要两次读数据?
好像第二次才正确
还有,连读的话,好像不行,多谢
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-17 23:54 , Processed in 0.094094 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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