国产电子罗盘QMC5883L基于STM32

2019-07-21 00:34发布

网上很多HMC5883L的程序,没找到国产的QMC5883的程序,自己在HMC5883上面修改最终弄出来的QMC5883,共同学习,相互探讨。
#include "include.h"
u8 IIC_buf[14];
void QMC5883L_I2C_Init_IO(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;       
       
        RCC_APB2PeriphClockCmd(QMC5883L_I2C_RCC_APBxPeriph_GPIOx,ENABLE);

        GPIO_InitStructure.GPIO_Pin=QMC5883L_I2C_SCL|QMC5883L_I2C_SDA;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(QMC5883L_GPIO_I2C,&GPIO_InitStructure);

        QMC5883L_I2C_SCL_H;
        QMC5883L_I2C_SDA_H;
}

void QMC5883L_I2C_SDA_OUT()
{
     GPIO_InitTypeDef GPIO_InitStructure;       
       
        GPIO_InitStructure.GPIO_Pin=QMC5883L_I2C_SDA;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(QMC5883L_GPIO_I2C,&GPIO_InitStructure);
}


void QMC5883L_I2C_SDA_IN(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;       
       
        GPIO_InitStructure.GPIO_Pin=QMC5883L_I2C_SDA;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(QMC5883L_GPIO_I2C,&GPIO_InitStructure);
}

//产生起始信号
void QMC5883L_I2C_Start(void)
{
     QMC5883L_I2C_SDA_OUT();
       
        QMC5883L_I2C_SDA_H;
        QMC5883L_I2C_SCL_H;
        delay_us(4);
        QMC5883L_I2C_SDA_L;
        delay_us(4);
        QMC5883L_I2C_SCL_L;
}

//产生停止信号
void QMC5883L_I2C_Stop(void)
{
   QMC5883L_I2C_SDA_OUT();

   QMC5883L_I2C_SCL_L;
   QMC5883L_I2C_SDA_L;
   delay_us(4);
   QMC5883L_I2C_SCL_H;
   QMC5883L_I2C_SDA_H;
   delay_us(4);
}

//主机产生应答信号ACK
void QMC5883L_I2C_Ack(void)
{
   QMC5883L_I2C_SCL_L;
   QMC5883L_I2C_SDA_OUT();
   QMC5883L_I2C_SDA_L;
   delay_us(2);
   QMC5883L_I2C_SCL_H;
   delay_us(2);
   QMC5883L_I2C_SCL_L;
}

//主机不产生应答信号NACK
void QMC5883L_I2C_NAck(void)
{
   QMC5883L_I2C_SCL_L;
   QMC5883L_I2C_SDA_OUT();
   QMC5883L_I2C_SDA_H;
   delay_us(2);
   QMC5883L_I2C_SCL_H;
   delay_us(2);
   QMC5883L_I2C_SCL_L;
}
//等待从机应答信号
//返回值:1 接收应答失败
//                  0 接收应答成功
u8 QMC5883L_I2C_Wait_Ack(void)
{
        u8 tempTime=0;

        QMC5883L_I2C_SDA_IN();

        QMC5883L_I2C_SDA_H;
        delay_us(1);
        QMC5883L_I2C_SCL_H;
        delay_us(1);

        while(GPIO_ReadInputDataBit(QMC5883L_GPIO_I2C,QMC5883L_I2C_SDA))
        {
                tempTime++;
                if(tempTime>250)
                {
                        QMC5883L_I2C_Stop();
                        return 1;
                }         
        }

        QMC5883L_I2C_SCL_L;
        return 0;
}
//I2C 发送一个字节
void QMC5883L_I2C_Send_Byte(u8 txd)
{
        u8 i=0;

        QMC5883L_I2C_SDA_OUT();
        QMC5883L_I2C_SCL_L;//拉低时钟开始数据传输

        for(i=0;i<8;i++)
        {
                if((txd&0x80)>0) //0x80  1000 0000
                        QMC5883L_I2C_SDA_H;
                else
                        QMC5883L_I2C_SDA_L;

                txd<<=1;
                QMC5883L_I2C_SCL_H;
                delay_us(2); //发送数据
                QMC5883L_I2C_SCL_L;
                delay_us(2);
        }
}

//I2C 读取一个字节

u8 QMC5883L_I2C_Read_Byte(void)
{
   u8 i=0,receive=0;

   QMC5883L_I2C_SDA_IN();
   for(i=0;i<8;i++)
   {
                   QMC5883L_I2C_SCL_L;
                delay_us(2);
                QMC5883L_I2C_SCL_H;
                receive<<=1;
                if(GPIO_ReadInputDataBit(QMC5883L_GPIO_I2C,QMC5883L_I2C_SDA))
                   receive++;
                delay_us(1);       
   }
        return receive;
}





0条回答

一周热门 更多>