请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

飞比ZigBee智能家居及照明(物联网方案与教育平台专家)

搜索
123
查看: 13758|回复: 13

cc2530 模拟IIC 无法读取 MPU6050的数据 , 总是读到0xff

[复制链接]
shawyou 发表于 2014-3-18 20:54:36 | 显示全部楼层 |阅读模式
本帖最后由 shawyou 于 2014-3-18 22:09 编辑

wifi0s0-3412144651395146328585.jpg
  1. #include <ioCC2530.h>
  2. #include <string.h>
  3. #include <math.h>   
  4. #include <stdio.h>   
  5. #define ushort unsigned short
  6. #define uint16 unsigned short
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. #define bit int
  10. #define TRUE 1
  11. #define FALSE 0


  12. //****************************************
  13. // 定义51单片机端口
  14. //****************************************

  15. #define    SCL P1_0                //IIC时钟引脚定义
  16. #define    SDA P1_1                //IIC数据引脚定义

  17. //****************************************
  18. // 定义MPU6050内部地址
  19. //****************************************
  20. #define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
  21. #define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)
  22. #define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  23. #define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
  24. #define        ACCEL_XOUT_H        0x3B
  25. #define        ACCEL_XOUT_L        0x3C
  26. #define        ACCEL_YOUT_H        0x3D
  27. #define        ACCEL_YOUT_L        0x3E
  28. #define        ACCEL_ZOUT_H        0x3F
  29. #define        ACCEL_ZOUT_L        0x40
  30. #define        TEMP_OUT_H                0x41
  31. #define        TEMP_OUT_L                0x42
  32. #define        GYRO_XOUT_H                0x43
  33. #define        GYRO_XOUT_L                0x44        
  34. #define        GYRO_YOUT_H                0x45
  35. #define        GYRO_YOUT_L                0x46
  36. #define        GYRO_ZOUT_H                0x47
  37. #define        GYRO_ZOUT_L                0x48
  38. #define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)
  39. #define        WHO_AM_I                        0x75        //IIC地址寄存器(默认数值0x68,只读)
  40. #define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取
  41. //****************************************
  42. //定义类型及变量
  43. //****************************************
  44. uchar dis[4];                                                        //显示数字(-511至512)的字符数组
  45. int        dis_data;        
  46. char Txdata[14]={0};     //变量

  47. //int        Temperature,Temp_h,Temp_l;        //温度及高低位数据
  48. //****************************************
  49. //函数声明
  50. //****************************************
  51. void  delay(unsigned int k);                                        //延时
  52. //MPU6050操作函数
  53. void  InitMPU6050();                                                                                                        //初始化MPU6050
  54. void  Delay5us();
  55. void  I2C_Start();
  56. void  I2C_Stop();
  57. void  I2C_SendACK(bit ack);
  58. bit   I2C_RecvACK();
  59. void  I2C_SendByte(uchar dat);
  60. uchar I2C_RecvByte();
  61. void  I2C_ReadPage();
  62. void  I2C_WritePage();
  63. uchar Single_ReadI2C(uchar REG_Address);                                                //读取I2C数据
  64. void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        
  65. void Sendstr(char * Data,int len);

  66. //**************************************
  67. //Delay5us
  68. //**************************************
  69. void  Delay5us()
  70. {
  71.   int i=5;
  72.   while(i--)
  73.   {
  74.      asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  75.      asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  76.      asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  77.      asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  78.      asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  79.      asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  80.      asm("nop"); asm("nop");
  81.   }
  82. }

  83. void I2C_Start()
  84. {
  85.     SDA = 1;                    //拉高数据线
  86.     SCL = 1;                    //拉高时钟线
  87.     Delay5us();                 //延时
  88.     SDA = 0;                    //产生下降沿
  89.     Delay5us();                 //延时
  90.     SCL = 0;                    //拉低时钟线
  91. }
  92. //**************************************
  93. //I2C停止信号
  94. //**************************************
  95. void I2C_Stop()
  96. {
  97.     SDA =0;
  98.     SCL =1;
  99.     Delay5us();
  100.     SDA=1;
  101.     Delay5us();

  102. }
  103. //**************************************
  104. //I2C发送应答信号
  105. //入口参数:ack (0:ACK 1:NAK)
  106. //**************************************
  107. void I2C_SendACK(bit ack)
  108. {
  109.     SDA = ack;                  //写应答信号
  110.     SCL = 1;                    //拉高时钟线
  111.     Delay5us();                 //延时
  112.     SCL = 0;                    //拉低时钟线
  113.     Delay5us();                 //延时
  114. }
  115. //**************************************
  116. //I2C接收应答信号
  117. //**************************************
  118. bit I2C_RecvACK()
  119. {
  120.     SCL = 1;                    //拉高时钟线
  121.     Delay5us();                 //延时
  122.     CY = SDA;                   //读应答信号
  123.     SCL = 0;                    //拉低时钟线
  124.     Delay5us();                 //延时
  125.     return CY;
  126. }
  127. //**************************************
  128. //向I2C总线发送一个字节数据
  129. //**************************************
  130. void I2C_SendByte(uchar dat)
  131. {
  132.     uchar i;
  133.     for (i=0; i<8; i++)         //8位计数器
  134.     {
  135.         dat <<= 1;              //移出数据的最高位
  136.         SDA = CY;               //送数据口
  137.         SCL = 1;                //拉高时钟线
  138.         Delay5us();             //延时
  139.         SCL = 0;                //拉低时钟线
  140.         Delay5us();             //延时
  141.     }
  142.     I2C_RecvACK();
  143. }
  144. //**************************************
  145. //从I2C总线接收一个字节数据
  146. //**************************************
  147. uchar I2C_RecvByte()
  148. {
  149.     uchar i;
  150.     uchar dat = 0;
  151.     SDA = 1;                    //使能内部上拉,准备读取数据,
  152.     for (i=0; i<8; i++)         //8位计数器
  153.     {
  154.         dat <<= 1;
  155.         SCL = 1;                //拉高时钟线
  156.         Delay5us();             //延时
  157.         dat |= SDA;             //读数据               
  158.         SCL = 0;                //拉低时钟线
  159.         Delay5us();             //延时
  160.     }
  161.     return dat;
  162. }
  163. //**************************************
  164. //向I2C设备写入一个字节数据
  165. //**************************************
  166. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  167. {
  168.     I2C_Start();                  //起始信号
  169.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
  170.     I2C_SendByte(REG_Address);    //内部寄存器地址,
  171.     I2C_SendByte(REG_data);       //内部寄存器数据,
  172.     I2C_Stop();                   //发送停止信号
  173. }
  174. //**************************************
  175. //从I2C设备读取一个字节数据
  176. //**************************************
  177. uchar Single_ReadI2C(uchar REG_Address)
  178. {
  179.         uchar REG_data;
  180.         I2C_Start();                   //起始信号
  181.         I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
  182.         I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始        
  183.         I2C_Start();                   //起始信号
  184.         I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
  185.         REG_data=I2C_RecvByte();       //读出寄存器数据
  186.         I2C_SendACK(1);                //接收应答信号
  187.         I2C_Stop();                    //停止信号
  188.         return REG_data;
  189. }
  190. //**************************************
  191. //初始化MPU6050
  192. //**************************************
  193. void InitMPU6050()
  194. {
  195.         Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
  196.         Single_WriteI2C(SMPLRT_DIV, 0x07);
  197.         Single_WriteI2C(CONFIG, 0x06);
  198.         Single_WriteI2C(GYRO_CONFIG, 0x18);
  199.         Single_WriteI2C(ACCEL_CONFIG, 0x01);
  200. }
  201. //**************************************
  202. //合成数据
  203. //**************************************
  204. int GetData(uchar REG_Address)
  205. {
  206.         uchar H,L;
  207.         H=Single_ReadI2C(REG_Address);
  208.         Sendstr(&H,1);
  209.         L=Single_ReadI2C(REG_Address+1);
  210.         Sendstr(&L,1);
  211.         return (H<<8)+L;   //合成数据
  212.         
  213. }

  214. /******************************************************************************
  215. * @fn  wait_ms
  216. *
  217. * @brief
  218. *      Delay time milliseconds.
  219. *
  220. * Parameters:
  221. *
  222. * @param  time
  223. *
  224. * @return void
  225. *
  226. ******************************************************************************/
  227. void wait_ms(uint16 time)
  228. {
  229.   uint16 a;
  230.   unsigned short i;
  231.   for(i = 0;i < time;i++)
  232.     for(a = 1067;a > 0;a--)
  233.       asm("NOP");
  234. }



  235. /******************************************************************************
  236. * @fn  initUART
  237. *
  238. * @brief
  239. *      Initializes components for the UART application example.
  240. *
  241. * Parameters:
  242. *
  243. * @param  void
  244. *
  245. * @return void
  246. *
  247. ******************************************************************************/
  248. void initUART(void)
  249. {
  250.   P1DIR |= 0x03; //P1.0和P1.1设置为输出
  251.   
  252.   CLKCONCMD &= ~0X40;     //设置系统时钟源为32MHz晶振
  253.   while(CLKCONSTA&0X40);  //等待晶振稳定
  254.   CLKCONCMD &= ~0X47;     //设置系统主时钟频率为32MHz
  255.   
  256.   PERCFG = 0X00;          //设置外设控制为P0
  257.   P0SEL = 0X3C;           //选择P0.2,P0.3,P0.4,P0.5作为外设
  258.   P2DIR &= ~0XC0;         //P0优先级作为UART0
  259.   
  260.   U0CSR |= 0X80;          //UART方式
  261.   U0GCR |= 9;         
  262.   U0BAUD |= 59;           //波特率设置为19200
  263.   UTX0IF |= 0;            //UART0 TX 中断标志初始置为0
  264. }

  265. void Sendstr(char * Data,int len)
  266. {
  267.   uint i;
  268.   for(i=0;i<len;i++)
  269.   {
  270.     U0DBUF = *Data++; //将数据填充到串口数据寄存器
  271.     while(UTX0IF==0); //等待串口发送完毕
  272.     UTX0IF=0;         //将串口中断置为0,准备下一次的发送
  273.   }
  274. }

  275. /***************************************
  276. 初始化接口,将SCL和SDA设置为输入
  277. **************************************/
  278. void Init_IO(void)
  279. {
  280.   P1DIR |= 0x03;
  281. }


  282. void main()
  283. {
  284.   
  285.   int temp;
  286.   wait_ms(500);
  287.   Init_IO();
  288.   InitMPU6050();
  289.   initUART();
  290.   Sendstr("Hello\n",6);
  291.   while(1)
  292.   {
  293.     Sendstr("Hello\n\n",7);
  294.     Txdata[0]=GetData(GYRO_XOUT_H)+0x30;
  295.     Txdata[1]=GetData(GYRO_YOUT_H)+0x30;
  296.     Txdata[2]=GetData(GYRO_ZOUT_H)+0x30;
  297.     Sendstr(Txdata,6);
  298.     wait_ms(200);
  299.   }
  300. }
复制代码
GetData中读出的数据H和L都是0xff,这个与没有接上MPU6050传感器是一样的结果,各位大侠,帮帮忙,找下问题在哪里?
 楼主| shawyou 发表于 2014-3-18 22:06:15 | 显示全部楼层
哈~~沙发 自己顶个
 楼主| shawyou 发表于 2014-3-19 09:04:38 | 显示全部楼层
120742915 发表于 2014-3-19 08:54
用示波器观察输入是不是正常的

你这个是自己写的还是从别人那直接拿的

这个是修改别人的,不过别人没有完整的代码,我是自己添加一些的。
 楼主| shawyou 发表于 2014-3-19 12:20:32 | 显示全部楼层
120742915 发表于 2014-3-19 09:19
这个就是你的问题啦,肯定要自己研究的,哪有什么都一帆风顺的。

如果你时序都对了,主要问题就是延时 ...

那你知道如何用示波器测试这个MPU6050吗? 是连接好电路再测试吗?
supercai 发表于 2014-3-27 20:27:47 | 显示全部楼层
同学我也是差不多遇到同样的问题,我用的是串口,什么也没收到,想问一下你怎么解决的
purefriendship 发表于 2014-3-28 09:46:03 | 显示全部楼层
使用示波器是最好的方法,对着IIC的协议看波形,一步一步的找问题。很多时候调试的过程更能学到东西。
nonplus 发表于 2014-4-1 12:02:46 | 显示全部楼层
延时问题
就这么简单,2x30就是这么奇特
我卡壳了N久最后发现的
karel100200 发表于 2014-4-1 18:49:25 | 显示全部楼层
你端口方向没设置,每次都要修改,PxDIR
znwoai123 发表于 2014-5-12 08:30:01 | 显示全部楼层
楼上正解,CC2530操作端口要比C51麻烦,楼主可以参考http://www.feibit.com/forum.php?mod=viewthread&tid=10101http://www.feibit.com/forum.php?mod=viewthread&tid=228这两个帖子
wkq321654 发表于 2014-10-9 11:06:21 | 显示全部楼层
nonplus 发表于 2014-4-1 12:02
延时问题
就这么简单,2x30就是这么奇特
我卡壳了N久最后发现的

我也卡住了。。。cc2530,32MHz,读取BMP180的数据出不来。。。能问一下延时应该设置多少?还有这个 asm("nop")空操作是一个指令周期,不应该是12个时钟周期么。。。那么1us怎么会是32个空操作?看2530自带的延时函数,三个空操作就是1us。。。哪个正确?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

深圳市飞比电子科技有限公司 ( 粤ICP备10064384号  

GMT+8, 2017-10-22 12:27 , Processed in 0.151586 second(s), 26 queries .

Powered by Discuz! X3.1  Template by:迪恩网络

© 2001-2013 Comsenz Inc.

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