- #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
复制代码 |