- #include "GY30.h"
- #include "stm32f10x.h"
- #include "stm32f10x_gpio.h"
- #include "stm32f10x_rcc.h"
- //工程使用iic通信
- //SDA接的管腳為 PB0
- //SCL接的管腳為 PB1
- void GPIOConfig(void)//io口初始化
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鐘
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- void Delay_mms(uint16_t tmp)//延時毫秒
- {
- uint16_t i=0;
- while(tmp--)
- {
- i = 12000;
- while(i--);
- }
- }
- void Delay_5us(void) //延時5um
- {
- uint16_t i =0 ;
- uint16_t timer =5;
- while(timer--)
- {
- i =10;
- while(i--);
- }
- }
- void GY30_Start() //開始信號
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_0); //拉高數據線
- GPIO_SetBits(GPIOB,GPIO_Pin_1); //拉高時鐘線
- Delay_5us();
- GPIO_ResetBits(GPIOB,GPIO_Pin_0); //產生下降沿
- Delay_5us();
- GPIO_ResetBits(GPIOB,GPIO_Pin_1); //拉低時鐘線
- }
- void GY30_Stop() //停止信號
- {
- GPIO_ResetBits(GPIOB,GPIO_Pin_0); //拉低數據線
- GPIO_SetBits(GPIOB,GPIO_Pin_1); //拉高時鐘線
- Delay_5us();
- GPIO_SetBits(GPIOB,GPIO_Pin_0); //產生上升沿
- Delay_5us();
- }
- void GY30_SendACK(int ack) //發送應答信號
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //SDA
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- if(ack ==1)
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_0);
- }
- else if(ack ==0 )
- {
- GPIO_ResetBits(GPIOB,GPIO_Pin_0);
- }
- else
- return;
- GPIO_SetBits(GPIOB,GPIO_Pin_1);
- Delay_5us();
- GPIO_ResetBits(GPIOB,GPIO_Pin_1);
- Delay_5us();
- }
- int GY30_RecvACK() //接受應答信號
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO_Pin_0 0 GPIO_Pin_1 1
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOB,GPIO_Pin_1);
- Delay_5us();
-
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 1)
- mcy = 1;
- else
- mcy =0;
-
- GPIO_ResetBits(GPIOB,GPIO_Pin_1); //拉低時鐘線
- Delay_5us();
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- return mcy;
- }
- void GY30_SendByte(uchar dat)
- {
- uchar i;
- for(i=0; i<8;i++)
- {
- if(0x80 & dat)
- GPIO_SetBits(GPIOB,GPIO_Pin_0);
- else
- GPIO_ResetBits(GPIOB,GPIO_Pin_0);
- dat <<= 1;
-
- GPIO_SetBits(GPIOB,GPIO_Pin_1);
- Delay_5us();
- GPIO_ResetBits(GPIOB,GPIO_Pin_1);
- Delay_5us();
-
- }
- GY30_RecvACK();
- }
- uchar GY30_RecvByte()
- {
- uchar i;
- uchar dat=0;
- uchar bit;
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //SDA
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOB,GPIO_Pin_0); //使能內部上拉,準備接受數據
- for(i=0; i<8;i++)
- {
- dat <<= 1;
- GPIO_SetBits(GPIOB,GPIO_Pin_1); //拉高時鐘線
- Delay_5us();
- if(SET == GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0))
- bit = 0x01;
- else
- bit = 0x00;
- dat |= bit; //讀數據
- GPIO_ResetBits(GPIOB,GPIO_Pin_1);
- Delay_5us();
- }
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //輸入上拉
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- return dat;
-
- }
- void Single_Write_GY30(uchar REG_Address)
- {
- GY30_Start(); //起使信號
- GY30_SendByte(SlaveAddress); //發送設備地址+寫信號
- GY30_SendByte(REG_Address); //內部寄存器地址
- GY30_Stop();
- }
- void Init_GY30()
- {
- Single_Write_GY30(0x01);
- }
- void mread(void)
- {
- uchar i;
- GY30_Start();
- GY30_SendByte(SlaveAddress + 1); //發送設備地址+讀信號
- for(i=0; i<3;i++)
- {
- BUF[i] = GY30_RecvByte();
- if(i ==3)
- {
- GY30_SendACK(1); //最后一個回應NOACK
- }
- else
- {
- GY30_SendACK(0);
- }
- }
- GY30_Stop();
- Delay_mms(5);
- }
- #ifndef __GY30_H
- #define __GY30_H
- #include "stm32f10x.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define SlaveAddress 0x46
- extern uchar BUF[8]; //接受數據緩存區域
- extern int dis_data; //變量
- extern int mcy; //進位
- void GPIOConfig(void);
- void Delay_mms(uint16_t tmp);
- void Delay_5us(void);
- void GY30_Start(void); //開始信號
- void GY30_Stop(void); //停止信號
- void GY30_SendACK(int ack);
- int GY30_RecvACK(void);
- void GY30_SendByte(uchar dat);
- uchar GY30_RecvByte(void);
- void Single_Write_GY30(uchar REG_Address);
- void Init_GY30(void);
- void mread(void);
- #endif
復制代碼 |