2 /*******************************************************************************
\r
3 // GY-52 MPU3050 IIC²âÊÔ³ÌÐò
\r
4 // ʹÓõ¥Æ¬»úSTM32F103C8T6
\r
6 // ±àÒë»·¾³ Keil uVision4
\r
7 // ʱ¼ä£º2011Äê9ÔÂ1ÈÕ
\r
8 // ÓëÄ£¿éÁ¬½Ó GPIOB6->SCL GPIOB7->SDA
\r
9 // ʹÓãºSTM32F103C8T6´®¿Ú1Á¬½ÓµçÄÔ
\r
10 // µçÄÔ´®¿ÚÖúÊÖÏÔʾ£¬²¨ÌØÂÊ£º115200
\r
12 *******************************************************************************/
\r
14 #include "stm32f10x_lib.h"
\r
15 #include <math.h> //Keil library
\r
17 GPIO_InitTypeDef GPIO_InitStructure;
\r
18 ErrorStatus HSEStartUpStatus;
\r
20 #define uchar unsigned char
\r
21 #define uint unsigned int
\r
23 //¶¨ÒåMPU3050ÄÚ²¿µØÖ·********************
\r
38 //****************************
\r
40 #define MPU3050_Addr 0xD0 //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä
\r
42 unsigned char TX_DATA[4]; //ÏÔʾ¾Ý»º´æÇø
\r
43 unsigned char BUF[10]; //½ÓÊÕÊý¾Ý»º´æÇø
\r
44 char test=0; //IICÓõ½
\r
45 short T_X,T_Y,T_Z,T_T; //X,Y,ZÖᣬζÈ
\r
47 //************************************
\r
48 /*Ä£ÄâIIC¶Ë¿ÚÊä³öÊäÈ붨Òå*/
\r
49 #define SCL_H GPIOB->BSRR = GPIO_Pin_6
\r
50 #define SCL_L GPIOB->BRR = GPIO_Pin_6
\r
52 #define SDA_H GPIOB->BSRR = GPIO_Pin_7
\r
53 #define SDA_L GPIOB->BRR = GPIO_Pin_7
\r
55 #define SCL_read GPIOB->IDR & GPIO_Pin_6
\r
56 #define SDA_read GPIOB->IDR & GPIO_Pin_7
\r
58 /* º¯ÊýÉêÃ÷ -----------------------------------------------*/
\r
59 void RCC_Configuration(void);
\r
60 void GPIO_Configuration(void);
\r
61 void NVIC_Configuration(void);
\r
62 void USART1_Configuration(void);
\r
63 void WWDG_Configuration(void);
\r
64 void Delay(u32 nTime);
\r
65 void Delayms(vu32 m);
\r
66 /* ±äÁ¿¶¨Òå ----------------------------------------------*/
\r
68 /*******************************/
\r
69 void DATA_printf(uchar *s,short temp_data)
\r
72 temp_data=-temp_data;
\r
76 *++s =temp_data/100+0x30;
\r
77 temp_data=temp_data%100; //È¡ÓàÔËËã
\r
78 *++s =temp_data/10+0x30;
\r
79 temp_data=temp_data%10; //È¡ÓàÔËËã
\r
80 *++s =temp_data+0x30;
\r
83 /*******************************************************************************
\r
84 * Function Name : I2C_GPIO_Config
\r
85 * Description : Configration Simulation IIC GPIO
\r
89 ****************************************************************************** */
\r
90 void I2C_GPIO_Config(void)
\r
92 GPIO_InitTypeDef GPIO_InitStructure;
\r
94 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
\r
95 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
\r
96 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
\r
97 GPIO_Init(GPIOB, &GPIO_InitStructure);
\r
99 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
\r
100 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
\r
101 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
\r
102 GPIO_Init(GPIOB, &GPIO_InitStructure);
\r
105 /*******************************************************************************
\r
106 * Function Name : I2C_delay
\r
107 * Description : Simulation IIC Timing series delay
\r
111 ****************************************************************************** */
\r
112 void I2C_delay(void)
\r
115 u8 i=30; //ÕâÀï¿ÉÒÔÓÅ»¯ËÙ¶È £¬¾²âÊÔ×îµÍµ½5»¹ÄÜдÈë
\r
122 void delay5ms(void)
\r
131 /*******************************************************************************
\r
132 * Function Name : I2C_Start
\r
133 * Description : Master Start Simulation IIC Communication
\r
136 * Return : Wheather Start
\r
137 ****************************************************************************** */
\r
138 bool I2C_Start(void)
\r
143 if(!SDA_read)return FALSE; //SDAÏßΪµÍµçƽÔò×ÜÏßæ,Í˳ö
\r
146 if(SDA_read) return FALSE; //SDAÏßΪ¸ßµçƽÔò×ÜÏß³ö´í,Í˳ö
\r
151 /*******************************************************************************
\r
152 * Function Name : I2C_Stop
\r
153 * Description : Master Stop Simulation IIC Communication
\r
157 ****************************************************************************** */
\r
158 void I2C_Stop(void)
\r
169 /*******************************************************************************
\r
170 * Function Name : I2C_Ack
\r
171 * Description : Master Send Acknowledge Single
\r
175 ****************************************************************************** */
\r
187 /*******************************************************************************
\r
188 * Function Name : I2C_NoAck
\r
189 * Description : Master Send No Acknowledge Single
\r
193 ****************************************************************************** */
\r
194 void I2C_NoAck(void)
\r
205 /*******************************************************************************
\r
206 * Function Name : I2C_WaitAck
\r
207 * Description : Master Reserive Slave Acknowledge Single
\r
210 * Return : Wheather Reserive Slave Acknowledge Single
\r
211 ****************************************************************************** */
\r
212 bool I2C_WaitAck(void) //·µ»ØΪ:=1ÓÐACK,=0ÎÞACK
\r
230 /*******************************************************************************
\r
231 * Function Name : I2C_SendByte
\r
232 * Description : Master Send a Byte to Slave
\r
233 * Input : Will Send Date
\r
236 ****************************************************************************** */
\r
237 void I2C_SendByte(u8 SendByte) //Êý¾Ý´Ó¸ßλµ½µÍλ//
\r
255 /*******************************************************************************
\r
256 * Function Name : I2C_RadeByte
\r
257 * Description : Master Reserive a Byte From Slave
\r
260 * Return : Date From Slave
\r
261 ****************************************************************************** */
\r
262 unsigned char I2C_RadeByte(void) //Êý¾Ý´Ó¸ßλµ½µÍλ//
\r
281 return ReceiveByte;
\r
284 //µ¥×Ö½ÚдÈë*******************************************
\r
286 bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data) //void
\r
288 if(!I2C_Start())return FALSE;
\r
289 I2C_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//ÉèÖøßÆðʼµØÖ·+Æ÷¼þµØÖ·
\r
290 if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
\r
291 I2C_SendByte(REG_Address ); //ÉèÖõÍÆðʼµØÖ·
\r
293 I2C_SendByte(REG_data);
\r
300 //µ¥×Ö½Ú¶ÁÈ¡*****************************************
\r
301 unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
\r
302 { unsigned char REG_data;
\r
303 if(!I2C_Start())return FALSE;
\r
304 I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//ÉèÖøßÆðʼµØÖ·+Æ÷¼þµØÖ·
\r
305 if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}
\r
306 I2C_SendByte((u8) REG_Address); //ÉèÖõÍÆðʼµØÖ·
\r
309 I2C_SendByte(SlaveAddress+1);
\r
312 REG_data= I2C_RadeByte();
\r
321 ********************************************************************************
\r
322 ** º¯ÊýÃû³Æ £º RCC_Configuration(void)
\r
323 ** º¯Êý¹¦ÄÜ £º ʱÖÓ³õʼ»¯
\r
327 ********************************************************************************
\r
329 void RCC_Configuration(void)
\r
331 /* RCC system reset(for debug purpose) */
\r
335 RCC_HSEConfig(RCC_HSE_ON);
\r
337 /* Wait till HSE is ready */
\r
338 HSEStartUpStatus = RCC_WaitForHSEStartUp();
\r
340 if(HSEStartUpStatus == SUCCESS)
\r
342 /* HCLK = SYSCLK */
\r
343 RCC_HCLKConfig(RCC_SYSCLK_Div1);
\r
346 RCC_PCLK2Config(RCC_HCLK_Div1);
\r
348 /* PCLK1 = HCLK/2 */
\r
349 RCC_PCLK1Config(RCC_HCLK_Div2);
\r
351 /* Flash 2 wait state */
\r
352 FLASH_SetLatency(FLASH_Latency_2);
\r
353 /* Enable Prefetch Buffer */
\r
354 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
\r
356 /* PLLCLK = 8MHz * 9 = 72 MHz */
\r
357 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
\r
360 RCC_PLLCmd(ENABLE);
\r
362 /* Wait till PLL is ready */
\r
363 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
\r
367 /* Select PLL as system clock source */
\r
368 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
\r
370 /* Wait till PLL is used as system clock source */
\r
371 while(RCC_GetSYSCLKSource() != 0x08)
\r
375 /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
\r
376 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
\r
377 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE);
\r
378 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF , ENABLE);
\r
379 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE);
\r
383 ********************************************************************************
\r
384 ** º¯ÊýÃû³Æ £º GPIO_Configuration(void)
\r
385 ** º¯Êý¹¦ÄÜ £º ¶Ë¿Ú³õʼ»¯
\r
389 ********************************************************************************
\r
391 void GPIO_Configuration(void)
\r
393 GPIO_InitTypeDef GPIO_InitStructure;
\r
394 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE );
\r
395 /* Configure USART1 Tx (PA.09) as alternate function push-pull */
\r
396 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // Ñ¡ÖйܽÅ9
\r
397 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ¸´ÓÃÍÆÍìÊä³ö
\r
398 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // ×î¸ßÊä³öËÙÂÊ50MHz
\r
399 GPIO_Init(GPIOA, &GPIO_InitStructure); // Ñ¡ÔñA¶Ë¿Ú
\r
401 /* Configure USART1 Rx (PA.10) as input floating */
\r
402 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //Ñ¡ÖйܽÅ10
\r
403 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë
\r
404 GPIO_Init(GPIOA, &GPIO_InitStructure); //Ñ¡ÔñA¶Ë¿Ú
\r
409 ********************************************************************************
\r
410 ** º¯ÊýÃû³Æ £º USART1_Configuration(void)
\r
411 ** º¯Êý¹¦ÄÜ £º ´®¿Ú1³õʼ»¯
\r
415 ********************************************************************************
\r
417 void USART1_Configuration(void)
\r
420 USART_InitTypeDef USART_InitStructure;
\r
421 USART_ClockInitTypeDef USART_ClockInitStructure;
\r
423 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 |RCC_APB2Periph_USART1, ENABLE );
\r
425 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; // ʱÖӵ͵çƽ»î¶¯
\r
426 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; // ʱÖӵ͵çƽ
\r
427 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; // ʱÖÓµÚ¶þ¸ö±ßÑؽøÐÐÊý¾Ý²¶»ñ
\r
428 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; // ×îºóһλÊý¾ÝµÄʱÖÓÂö³å²»´ÓSCLKÊä³ö
\r
429 /* Configure the USART1 synchronous paramters */
\r
430 USART_ClockInit(USART1, &USART_ClockInitStructure); // ʱÖÓ²ÎÊý³õʼ»¯ÉèÖÃ
\r
432 USART_InitStructure.USART_BaudRate = 115200; // ²¨ÌØÂÊΪ£º115200
\r
433 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8λÊý¾Ý
\r
434 USART_InitStructure.USART_StopBits = USART_StopBits_1; // ÔÚÖ¡½áβ´«Êä1¸öֹͣλ
\r
435 USART_InitStructure.USART_Parity = USART_Parity_No ; // ÆæżʧÄÜ
\r
436 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // Ó²¼þÁ÷¿ØÖÆʧÄÜ
\r
438 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // ·¢ËÍʹÄÜ+½ÓÊÕʹÄÜ
\r
439 /* Configure USART1 basic and asynchronous paramters */
\r
440 USART_Init(USART1, &USART_InitStructure);
\r
442 /* Enable USART1 */
\r
443 USART_ClearFlag(USART1, USART_IT_RXNE); //ÇåÖжϣ¬ÒÔÃâÒ»ÆôÓÃÖжϺóÁ¢¼´²úÉúÖжÏ
\r
444 USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //ʹÄÜUSART1ÖжÏÔ´
\r
445 USART_Cmd(USART1, ENABLE); //USART1×Ü¿ª¹Ø£º¿ªÆô
\r
450 ********************************************************************************
\r
451 ** º¯ÊýÃû³Æ £º NVIC_Configuration(void)
\r
452 ** º¯Êý¹¦ÄÜ £º Öжϳõʼ»¯
\r
456 ********************************************************************************
\r
458 void NVIC_Configuration(void)
\r
460 NVIC_InitTypeDef NVIC_InitStructure;
\r
461 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
\r
463 NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;
\r
464 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
\r
465 NVIC_Init(&NVIC_InitStructure);
\r
470 ********************************************************************************
\r
471 ** º¯ÊýÃû³Æ £º WWDG_Configuration(void)
\r
472 ** º¯Êý¹¦ÄÜ £º ¿´ÃŹ·³õʼ»¯
\r
476 ********************************************************************************
\r
478 void WWDG_Configuration(void)
\r
480 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
\r
481 WWDG_SetPrescaler(WWDG_Prescaler_8); // WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms)
\r
482 WWDG_SetWindowValue(0x41); // Set Window value to 0x41
\r
483 WWDG_Enable(0x50); // Enable WWDG and set counter value to 0x7F, WWDG timeout = ~4 ms * 64 = 262 ms
\r
484 WWDG_ClearFlag(); // Clear EWI flag
\r
485 WWDG_EnableIT(); // Enable EW interrupt
\r
489 ********************************************************************************
\r
490 ** º¯ÊýÃû³Æ £º Delay(vu32 nCount)
\r
491 ** º¯Êý¹¦ÄÜ £º ÑÓʱº¯Êý
\r
495 ********************************************************************************
\r
497 void Delay(vu32 nCount)
\r
499 for(; nCount != 0; nCount--);
\r
503 ********************************************************************************
\r
504 ** º¯ÊýÃû³Æ £º void Delayms(vu32 m)
\r
505 ** º¯Êý¹¦ÄÜ £º ³¤ÑÓʱº¯Êý m=1,ÑÓʱ1ms
\r
509 ********************************************************************************
\r
511 void Delayms(vu32 m)
\r
515 for(; m != 0; m--)
\r
516 for (i=0; i<50000; i++);
\r
520 ********************************************************************************
\r
521 ** º¯ÊýÃû³Æ £º WWDG_IRQHandler(void)
\r
522 ** º¯Êý¹¦ÄÜ £º ´°¿ÚÌáÇ°»½ÐÑÖжÏ
\r
526 ********************************************************************************
\r
529 void WWDG_IRQHandler(void)
\r
531 /* Update WWDG counter */
\r
532 WWDG_SetCounter(0x50);
\r
534 /* Clear EWI flag */
\r
537 //************************************************
\r
538 void USART1_SendData(uchar SendData)
\r
540 USART_SendData(USART1, SendData);
\r
543 //³õʼ»¯MPU3050£¬¸ù¾ÝÐèÒªÇë²Î¿¼pdf½øÐÐÐÞ¸Ä************************
\r
544 void Init_MPU3050(void)
\r
546 Single_Write(MPU3050_Addr,PWR_M, 0x80); //
\r
547 Single_Write(MPU3050_Addr,SMPL, 0x07); //
\r
548 Single_Write(MPU3050_Addr,DLPF, 0x1E); //¡À2000¡ã
\r
549 Single_Write(MPU3050_Addr,INT_C, 0x00 ); //
\r
550 Single_Write(MPU3050_Addr,PWR_M, 0x00); //
\r
553 //******¶ÁÈ¡MPU3050Êý¾Ý****************************************
\r
554 void READ_MPU3050(void)
\r
556 BUF[0]=Single_Read(MPU3050_Addr,GX_L);
\r
557 BUF[1]=Single_Read(MPU3050_Addr,GX_H);
\r
558 T_X= (BUF[1]<<8)|BUF[0];
\r
559 T_X/=16.4; //¶ÁÈ¡¼ÆËãXÖáÊý¾Ý
\r
561 BUF[2]=Single_Read(MPU3050_Addr,GY_L);
\r
562 BUF[3]=Single_Read(MPU3050_Addr,GY_H);
\r
563 T_Y= (BUF[3]<<8)|BUF[2];
\r
564 T_Y/=16.4; //¶ÁÈ¡¼ÆËãYÖáÊý¾Ý
\r
565 BUF[4]=Single_Read(MPU3050_Addr,GZ_L);
\r
566 BUF[5]=Single_Read(MPU3050_Addr,GZ_H);
\r
567 T_Z= (BUF[5]<<8)|BUF[4];
\r
568 T_Z/=16.4; //¶ÁÈ¡¼ÆËãZÖáÊý¾Ý
\r
570 BUF[6]=Single_Read(MPU3050_Addr,TMP_L);
\r
571 BUF[7]=Single_Read(MPU3050_Addr,TMP_H);
\r
572 T_T=(BUF[7]<<8)|BUF[6];
\r
573 T_T = 35+ ((double) (T_T + 13200)) / 280;// ¶ÁÈ¡¼ÆËã³öζÈ
\r
575 //********´®¿Ú·¢ËÍÊý¾Ý***************************************
\r
576 void Send_data(uchar axis)
\r
578 USART1_SendData(axis);
\r
579 USART1_SendData(':');
\r
580 for(i=0;i<4;i++)USART1_SendData(TX_DATA[i]);
\r
581 USART1_SendData(' ');
\r
582 USART1_SendData(' ');
\r
586 ********************************************************************************
\r
587 ** º¯ÊýÃû³Æ £º main(void)
\r
588 ** º¯Êý¹¦ÄÜ £º Ö÷º¯Êý
\r
592 ********************************************************************************
\r
596 RCC_Configuration(); //ÅäÖÃRCC
\r
597 GPIO_Configuration(); //ÅäÖÃGPIO
\r
598 USART1_Configuration(); //ÅäÖô®¿Ú1
\r
599 I2C_GPIO_Config(); //ÅäÖÃIICʹÓö˿Ú
\r
600 Delayms(10); //ÑÓʱ
\r
601 Init_MPU3050(); //³õʼ»¯MPU3050
\r
604 READ_MPU3050(); //¶ÁÈ¡MPU3050Êý¾Ý
\r
605 DATA_printf(TX_DATA,T_X);//ת»»XÖáÊý¾Ýµ½Êý×é
\r
606 Send_data('X'); //·¢ËÍXÖáÊý
\r
607 DATA_printf(TX_DATA,T_Y);//ת»»YÖáÊý¾Ýµ½Êý×é
\r
608 Send_data('Y'); //·¢ËÍYÖáÊý
\r
609 DATA_printf(TX_DATA,T_Z);//ת»»ZÖáÊý¾Ýµ½Êý×é
\r
610 Send_data('Z'); //·¢ËÍZÖáÊý
\r
611 DATA_printf(TX_DATA,T_T);//ת»»Î¶ÈÊý¾Ýµ½Êý×é
\r
612 Send_data('T'); //·¢ËÍζÈÊý¾Ý
\r
613 USART1_SendData(0X0D); //»»ÐÐ
\r
614 USART1_SendData(0X0A); //»Ø³µ
\r
619 /*************½áÊø***************/
\r