搜索
bottom↓
回复: 2

使用6050发现的奇怪现象

[复制链接]

出0入0汤圆

发表于 2013-5-10 15:53:47 | 显示全部楼层 |阅读模式
MPU6050的SDA线接在板子上时1602不能显示数据,把SDA拔下来时就能正常显示了,不是IO冲突的原因,是什么问题呢?(主控MSP430F149)
不应该是硬件的问题 换了个传感器还是这个问题 大家看下代码吧:
main.c
  1. #include <msp430f149.h>
  2. #include <intrinsics.h>
  3. #include "MPU6050.h"
  4. #include "LCD1602.h"
  5. #include "I2C.h"

  6. #define CPU_F ((double)8000000)
  7. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  8. /*--------------------------------------------------------
  9. 功能:     系统时钟初始化
  10. 输入参数: 无                                 
  11. 输出参数: 无            
  12. --------------------------------------------------------*/
  13. static void ClockInit(void)
  14. {
  15.           int i;
  16.     BCSCTL2 |= SELM1+SELS;                      //MCLK时钟源为XT2CLK,SMCLK时钟源为XT2CLK
  17.         do{
  18.     IFG1&=~OFIFG;                           //清除震荡标志
  19.     for(i=0;i<100;i++)
  20.        _NOP();                              //延时等待
  21.           }
  22.           while((IFG1&OFIFG)!=0);                   //如果标志为1 ,则继续循环等待
  23.           IFG1&=~OFIFG;
  24. }

  25. /*--------------------------------------------------------
  26. 功能:     I/O初始化
  27. 输入参数: 无                                 
  28. 输出参数: 无            
  29. --------------------------------------------------------*/
  30. static void GPIOInit(void)
  31. {
  32.           P2SEL = 0x00;                             //设置IO口为普通I/O模式
  33.         //P1SEL = 0x00;                       //设置IO口为普通I/O模式
  34.         //P1DIR = 0x00;                                                //P1作为输入                                        
  35. }

  36. /*--------------------------------------------------------
  37. 功能:     定时器A初始化
  38. 输入参数: 无                                 
  39. 输出参数: 无            
  40. --------------------------------------------------------*/
  41. static void TimerAInit(void)
  42. {
  43.           TACTL |= TASSEL_2+TACLR;                               
  44.         TACCTL0 |= CCIE;
  45.         TACTL |= ID_3+MC0;
  46.         TACCR0 = 1000;                                                //定时1ms       
  47. }

  48. /*--------------------------------------------------------
  49. 功能:     主函数
  50. 输入参数: 无                                 
  51. 输出参数: 无            
  52. --------------------------------------------------------*/
  53. void main(void)
  54. {
  55.         WDTCTL = WDTPW + WDTHOLD;
  56.   
  57.           /*各模块初始化*/
  58.           ClockInit();
  59.         GPIOInit();
  60.         TimerAInit();
  61.         LCDPort_init();
  62.         LCD_init();
  63.        
  64.         LCD_clear();
  65.         InitMPU6050();
  66.         delay_ms(10);
  67.        
  68.         //_EINT();                                                        //开总中断
  69.        
  70.         while(1)
  71.         {               
  72.                   LCD_write_str(1,1,"Welcome");
  73.                 //delay_ms(3);
  74.                 //Display10BitData(GetData(ACCEL_XOUT_H),2,1);        //显示X轴加速度
  75.                 //Display10BitData(GetData(ACCEL_YOUT_H),7,0);        //显示Y轴加速度
  76.                 //Display10BitData(GetData(ACCEL_ZOUT_H),12,0);        //显示Z轴加速
  77.         }
  78. }

  79. /*--------------------------------------------------------
  80. 功能:     定时器A中断服务程序           
  81. --------------------------------------------------------*/
  82. # pragma vector = TIMERA0_VECTOR               // 提供中断函数的入口地址
  83. __interrupt void TimerA(void)
  84. {       
  85.                 //P3OUT = ~P3OUT;                                        //控制灯闪烁
  86. }
复制代码
1602.c:
  1. /*********************************************************
  2.                     LCD1602驱动
  3. *********************************************************/
  4. #include <msp430x14x.h>

  5. typedef unsigned int uint;
  6. typedef unsigned char uchar;

  7. #define CPU_F ((double)8000000)
  8. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  9. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  10. #define P55 5
  11. #define P56 6
  12. #define P57 7

  13. #define RS_CLR        P5OUT &= ~(1 << P55)        //RS置低
  14. #define RS_SET        P5OUT |= (1 << P55)         //RS置高

  15. #define RW_CLR        P5OUT &= ~(1 << P56)        //RW置低
  16. #define RW_SET        P5OUT |= (1 << P56)         //RW置高

  17. #define EN_CLR        P5OUT &= ~(1 << P57)        //E置低
  18. #define EN_SET        P5OUT |= (1 << P57)         //E置高

  19. #define DataPort      P4OUT                 //P4口为数据口

  20. /*--------------------------------------------------------
  21. 功能:     显示屏IO初始化函数
  22. 输入参数: 无                                 
  23. 输出参数: 无            
  24. --------------------------------------------------------*/
  25. extern void LCDPort_init(void)
  26. {
  27.        
  28.         P4SEL = 0x00;
  29.     P4DIR = 0xFF;
  30.     P5SEL = 0x00;
  31.     P5DIR|= BIT5 + BIT6 + BIT7;     //控制口设置为输出模式
  32. }

  33. /*--------------------------------------------------------
  34. 功能:     显示屏命令写入函数
  35. 输入参数: com        要写入的命令                                
  36. 输出参数: 无            
  37. --------------------------------------------------------*/
  38. static void LCD_write_com(unsigned char com)
  39. {       
  40.         RS_CLR;
  41.         RW_CLR;
  42.         EN_SET;
  43.         DataPort = com;                 //命令写入端口
  44.         delay_ms(5);
  45.         EN_CLR;
  46. }

  47. /*--------------------------------------------------------
  48. 功能:     显示屏数据写入函数
  49. 输入参数: data        要写入的数据                                 
  50. 输出参数: 无            
  51. --------------------------------------------------------*/
  52. static void LCD_write_data(unsigned char data)
  53. {
  54.         RS_SET;
  55.         RW_CLR;
  56.         EN_SET;
  57.         DataPort = data;                //数据写入端口
  58.         delay_ms(5);
  59.         EN_CLR;
  60. }

  61. /*--------------------------------------------------------
  62. 功能:     显示屏清空
  63. 输入参数: 无                                 
  64. 输出参数: 无            
  65. --------------------------------------------------------*/
  66. extern void LCD_clear(void)
  67. {
  68.         LCD_write_com(0x01);            //清屏幕显示
  69.         delay_ms(5);
  70. }

  71. /*--------------------------------------------------------
  72. 功能:     显示屏字符串写入函数
  73. 输入参数: x        横坐标
  74.                    y        纵坐标(0 1)
  75.                    *s   指向字符串的指针
  76. 输出参数: 无            
  77. --------------------------------------------------------*/
  78. extern void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
  79. {
  80.        
  81.     if (y == 0)
  82.     {
  83.             LCD_write_com(0x80 + x);        //第一行显示
  84.     }
  85.     else
  86.     {
  87.             LCD_write_com(0xC0 + x);        //第二行显示
  88.     }
  89.    
  90.     while (*s)
  91.     {
  92.             LCD_write_data( *s);
  93.             s ++;
  94.     }
  95. }

  96. /*--------------------------------------------------------
  97. 功能:     显示屏单字符写入函数
  98. 输入参数: x        横坐标
  99.                    y    纵坐标(0 1)
  100.                    data 字符
  101. 输出参数: 无            
  102. --------------------------------------------------------*/
  103. extern void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
  104. {
  105.        
  106.     if (y == 0)
  107.     {
  108.             LCD_write_com(0x80 + x);        //第一行显示
  109.     }
  110.     else
  111.     {
  112.             LCD_write_com(0xC0 + x);        //第二行显示
  113.     }
  114.    
  115.     LCD_write_data( data);  
  116. }

  117. /*--------------------------------------------------------
  118. 功能:     显示屏初始化函数
  119. 输入参数: 无                                 
  120. 输出参数: 无            
  121. --------------------------------------------------------*/
  122. extern void LCD_init(void)
  123. {
  124.     LCD_write_com(0x38);                //显示模式设置  
  125.     delay_ms(5);
  126.     LCD_write_com(0x08);                //显示关闭
  127.     delay_ms(5);
  128.     LCD_write_com(0x01);                //显示清屏
  129.     delay_ms(5);
  130.     LCD_write_com(0x06);                //显示光标移动设置
  131.     delay_ms(5);
  132.     LCD_write_com(0x0C);                //显示开及光标设置
  133.     delay_ms(5);
  134. }

  135. //****************************************
  136. //LCD1602显示字符串
  137. //****************************************
  138. void DisplayListChar(uchar X,uchar Y,uchar *DData,uchar L)
  139. {
  140.         uchar ListLength=0;
  141.         Y&=0x1;               
  142.         X&=0xF;               
  143.         while(L--)            
  144.         {                       
  145.                 LCD_write_char(X,Y,DData[ListLength]);
  146.                 ListLength++;  
  147.                 X++;                        
  148.         }   
  149. }
复制代码
MPU6050.c:
  1. /*********************************************************
  2.                     MPU6050驱动
  3. *********************************************************/
  4. #include "MPU6050.h"
  5. #include "LCD1602.h"
  6. #include "I2C.h"

  7. uchar dis[4];                                                        //显示数字(-511至512)的字符数组
  8. int        dis_data;                                                //变量

  9. //**************************************
  10. //初始化MPU6050
  11. //**************************************
  12. void InitMPU6050()
  13. {
  14.         Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
  15.         Single_WriteI2C(SMPLRT_DIV, 0x07);
  16.         Single_WriteI2C(CONFIG, 0x06);
  17.         Single_WriteI2C(GYRO_CONFIG, 0x18);
  18.         Single_WriteI2C(ACCEL_CONFIG, 0x01);
  19. }

  20. //**************************************
  21. //合成数据
  22. //**************************************
  23. int GetData(uchar REG_Address)
  24. {
  25.         char H,L;
  26.         H=Single_ReadI2C(REG_Address);
  27.         L=Single_ReadI2C(REG_Address+1);
  28.         return (H<<8)+L;   //合成数据
  29. }

  30. //**************************************
  31. //在1602上显示10位数据
  32. //**************************************
  33. void Display10BitData(int value,uchar x,uchar y)
  34. {
  35.         value/=64;                                                        //转换为10位数据
  36.         lcd_printf(dis, value);                        //转换数据显示
  37.         LCD_write_str(x,y,dis);
  38.         //DisplayListChar(x,y,dis,4);        //启始列,行,显示数组,显示长度
  39. }

  40. /*--------------------------------------------------------------------
  41. 功能:整数转字符串(便于在1602上显示)
  42. --------------------------------------------------------------------*/
  43. void lcd_printf(uchar *s,int temp_data)
  44. {
  45.         if(temp_data<0)
  46.         {
  47.                 temp_data=-temp_data;
  48.                 *s='-';
  49.         }
  50.         else *s=' ';
  51.         *++s =temp_data/100+0x30;
  52.         temp_data=temp_data%100;     //取余运算
  53.         *++s =temp_data/10+0x30;
  54.         temp_data=temp_data%10;      //取余运算
  55.         *++s =temp_data+0x30;        
  56. }

复制代码
I2C.c:
  1. /*********************************************************
  2.                     I2C驱动
  3. *********************************************************/
  4. #include"msp430x14x.h"  
  5. #include "MPU6050.h"
  6. //#define        SDA     P2.1  
  7. //#define        SCL     P2.0  
  8.   
  9. #define     SDA_1        P2OUT |= BIT1 //SDA = 1  
  10. #define     SDA_0        P2OUT &= ~BIT1 //SDA = 0  
  11. #define     SCL_1        P2OUT |= BIT0 //SCL = 1  
  12. #define     SCL_0        P2OUT &= ~BIT0 //SCL = 0  
  13. #define     DIR_IN       P2DIR &= ~BIT1 //I/O 口为输入  
  14. #define     DIR_OUT      P2DIR |= BIT1 //SDA 输出数据  
  15. #define     SDA_IN       ((P2IN >> 1) & 0x01)  
  16. #define     TIME        5            //I2C 时序延时时间

  17. unsigned int uiSendDataBuffer[8];  
  18. unsigned int uiReceiveDataBuffer[8];

  19. /****************************************  
  20. *FUNCTION NAME: I2CDelay();  
  21. *CREATE DATE:2006.09.07  
  22. *CREATED BY:DreamHW  
  23. *FUNCTION:I2C 总线必要的延时程序
  24. Y DATE:  
  25. *INPUT:n->延时时间数 相当于指令周期数  
  26. *OUTPUT:nop  
  27. *RETURN:nop  
  28. ****************************************/  
  29. void I2CDelay(unsigned int n)  
  30. {  
  31.     unsigned int i;  
  32.     for(i = 0;i < n;i++)  
  33.     {  
  34.          ;  
  35.     }  
  36. }

  37. /****************************************  
  38. *FUNCTION NAME: I2CStart();  
  39. *CREATE DATE:2006.09.07  
  40. *CREATED BY:DreamHW  
  41. *FUNCTION:I2C 总线启动时序  
  42. *MODIFY DATE:  
  43. *INPUT:nop  
  44. *OUTPUT:nop  
  45. *RETURN:nop  
  46. ****************************************/  
  47. void I2CStart(void)  
  48. {  
  49.     DIR_OUT;  
  50.     SDA_1;  
  51.     I2CDelay(TIME);  
  52.     SCL_1;  
  53.     I2CDelay(TIME);  
  54.     SDA_0;  
  55.     I2CDelay(TIME);  
  56.     SCL_0;  
  57. }

  58. /****************************************  
  59. *FUNCTION NAME: I2CStop();  
  60. *CREATE DATE:2006.09.07  
  61. *CREATED BY:DreamHW  
  62. *FUNCTION:I2C 总线停止时序  
  63. *MODIFY DATE:  
  64. *INPUT:nop  
  65. *OUTPUT:nop
  66. RETURN:nop  
  67. ****************************************/  
  68. void I2CStop(void)  
  69. {  
  70.     DIR_OUT;  
  71.     SDA_0;  
  72.     I2CDelay(TIME);  
  73.     SCL_1;  
  74.     I2CDelay(TIME);  
  75.     SDA_1;  
  76. }

  77. /****************************************  
  78. *FUNCTION NAME: I2CReceiveACK();
  79. CREATE DATE:    2006.09.08  
  80. *CREATED BY:DreamHW  
  81. *FUNCTION:等待接受 ACK 信号,完成一次操作  
  82. *MODIFY DATE:  
  83. *INPUT:nop  
  84. *OUTPUT:nop  
  85. *RETURN:nop  
  86. ****************************************/  
  87. void I2CReceiveACK(void)  
  88. {  
  89.     SCL_1;  
  90.     I2CDelay(TIME);//  
  91.     DIR_IN;  
  92.     while(SDA_IN);  
  93.     DIR_OUT;  
  94.     SCL_0;  
  95.     I2CDelay(TIME);  
  96. }

  97. /****************************************  
  98. *FUNCTION NAME: I2CSendByte();  
  99. *CREATE DATE: 2006.09.08  
  100. *CREATED BY:DreamHW  
  101. *FUNCTION:I2C 送一个字节的数据  
  102. *MODIFY DATE:  
  103. *INPUT:ucWRData  
  104. *OUTPUT:nop  
  105. *RETURN:nop  
  106. ****************************************/  
  107. void I2CSendByte(unsigned char ucWRData)  
  108. {  
  109.     DIR_OUT;  
  110.     unsigned int i;  
  111.     for(i = 0;i < 8;i++)  
  112.     {  
  113.         SCL_0;  
  114.         I2CDelay(TIME);  
  115.         if((ucWRData >> 7) & 0x01) SDA_1;//最高位是否为 1,为则SDA= 1  
  116.         else SDA_0;                      //否则 SDA=0  
  117.         I2CDelay(TIME);  
  118.         SCL_1;  
  119.         I2CDelay(TIME);  
  120.         ucWRData <<= 1 ;  //数据左移一位,进入下一轮送数  
  121.     }  
  122.     SCL_0;  //  
  123.     SDA_1;  //等待ack  
  124.     I2CDelay(TIME);
  125.        
  126.         I2CReceiveACK();       
  127. }  



  128. /****************************************  
  129. *FUNCTION NAME: I2CReceiveByte();  
  130. *CREATE DATE:2006.09.08  
  131. *CREATED BY:DreamHW  
  132. *FUNCTION:接受一个字节的数据  
  133. *MODIFY DATE:  
  134. *INPUT:nop  
  135. *OUTPUT:ucRDData  
  136. *RETURN:ucRDData  
  137. ****************************************/  
  138. unsigned char I2CReceiveByte(void)  
  139. {  
  140.     unsigned char i;  
  141.     unsigned char ucRDData = 0;//返回值  
  142.     unsigned char ucDataBit = 0;//每一个 clk 接受到的数据  
  143.     SCL_0;  
  144.     I2CDelay(TIME);  
  145.     SDA_1;  
  146.     DIR_IN;  
  147.     for(i = 0;i < 8;i++)  
  148.     {  
  149.         SCL_1;  
  150.         I2CDelay(TIME);  
  151.         ucDataBit = SDA_IN;  
  152.         I2CDelay(TIME);
  153.                 ucRDData = ((ucRDData << 1) | ucDataBit);//将数据依次存入 ucRDData  
  154.         SCL_0;  
  155.         I2CDelay(TIME);  
  156.     }  
  157.     return(ucRDData);  
  158. }

  159. /****************************************  
  160. *FUNCTION NAME: I2CAcknowledge();  
  161. *CREATE DATE:    2006.09.08  
  162. *CREATED BY:DreamHW  
  163. *FUNCTION:接受数据后发送一个 ACK 信号  
  164. *MODIFY DATE:  
  165. *INPUT:nop  
  166. *OUTPUT:nop  
  167. *RETURN:nop  
  168. ****************************************/  
  169. void I2CAcknowledge(void)  
  170. {  
  171.     SCL_0;  
  172.     DIR_OUT;  
  173.     SDA_0;  
  174.     I2CDelay(TIME);  
  175.     SCL_1;  
  176.     I2CDelay(TIME);  
  177.     SCL_0;  
  178. }
  179. ///////////////////////////////////////////////////////////////////////////////////////////////////
  180. /*--------------------------------------------------------
  181. 功能:     向I2C设备写入一个字节数据
  182. 输入参数:                                 
  183. 输出参数: 无            
  184. --------------------------------------------------------*/
  185. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  186. {
  187.     I2CStart();                  //起始信号
  188.     I2CSendByte(SlaveAddress);   //发送设备地址+写信号
  189.     I2CSendByte(REG_Address);    //内部寄存器地址,
  190.     I2CSendByte(REG_data);       //内部寄存器数据,
  191.     I2CStop();                   //发送停止信号
  192. }

  193. /*--------------------------------------------------------
  194. 功能:     从I2C设备读取一个字节数据
  195. 输入参数:                                 
  196. 输出参数: 无            
  197. --------------------------------------------------------*/
  198. unsigned char Single_ReadI2C(uchar REG_Address)
  199. {
  200.         uchar REG_data;
  201.         I2CStart();                   //起始信号
  202.         I2CSendByte(SlaveAddress);    //发送设备地址+写信号
  203.         I2CSendByte(REG_Address);     //发送存储单元地址,从0开始       
  204.         I2CStart();                   //起始信号
  205.         I2CSendByte(SlaveAddress+1);  //发送设备地址+读信号
  206.         REG_data=I2CReceiveByte();       //读出寄存器数据
  207.         I2CAcknowledge();                //接收应答信号
  208.         I2CStop();                    //停止信号
  209.         return REG_data;
  210. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-5-17 16:56:50 | 显示全部楼层
我的也是这样  楼主 解决问题没有呀

出0入0汤圆

 楼主| 发表于 2013-5-17 17:53:39 | 显示全部楼层
lijungei 发表于 2013-5-17 16:56
我的也是这样  楼主 解决问题没有呀

IIC等到握手信号没等到呗 然后程序就一直while在等待握手信号那句代码了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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