• 大小: 8KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-24
  • 语言: C/C++
  • 标签: HMC5883  STM32  

资源简介

HMC5883接口 驱动,STM32直接使用,其他MCU可移植,C语言!

资源截图

代码片段和文件信息

#ifndef   __HMC5883_C_
#define   __HMC5883_C_

#include    
#include    


#include “stm32f10x.h“

#include “HMC5883.h“



uint8_t BUF[7];


/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Configure the used I/O ports pin
  * @param  None
  * @retval None
  */
void I2C_GPIO_Config_HMC5883(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure; 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ENABLE);

  // Configure I2C  pins: SCL and SDA
  GPIO_InitStructure.GPIO_Pin =  I2C_HMC5883_SCL | I2C_HMC5883_SDA; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_Init(I2C_HMC5883_GPIO &GPIO_InitStructure);
}

void HMC5883_Start(void)
{
SDAH;
SCLH;
    SysTimDelay1uS(SampleDelayCnt);          
    SDAL;                
    SysTimDelay1uS(SampleDelayCnt);       
SCLL;  

}

void HMC5883_Stop(void)
{
SDAL;
SCLH;
    SysTimDelay1uS(SampleDelayCnt);             
    SDAH;
    SysTimDelay1uS(SampleDelayCnt);           
}

void HMC5883_SendACK(u8 ack)
{
if(ack)
SDAL;
else
SDAH;
    SCLH;               
    SysTimDelay1uS(SampleDelayCnt);          
    SCLL;                
    SysTimDelay1uS(SampleDelayCnt);           
}

u8 HMC5883_RecvACK(void)
{
   u8 CY;
 
    SCLH;
    SysTimDelay1uS(SampleDelayCnt);               
    CY= Read_SDA;            
    SCLL;                  
    SysTimDelay1uS(SampleDelayCnt);       

    return CY;
}
void HMC5883_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)    
    {
  if(dat>=0x80)
SDAH;
else
SDAL;
        dat <<= 1;        
        SCLH;          
        SysTimDelay1uS(SampleDelayCnt);   
        SCLL;          
        SysTimDelay1uS(SampleDelayCnt);     
    }
    HMC5883_RecvACK();
}

BYTE HMC5883_RecvByte(void)
{
    BYTE i;
    BYTE dat = 0;

    SDAH;                  
    for (i=0; i<8; i++)    
    {
        dat <<= 1;
        SCLH;             
        SysTimDelay1uS(SampleDelayCnt);  
        dat |= Read_SDA;   
        SCLL;         
        SysTimDelay1uS(SampleDelayCnt);    
    }
    return dat;
}

//***************************************************

void Single_Write_HMC5883(unsigned char REG_Addressunsigned char REG_data)
{
    HMC5883_Start();                 
    HMC5883_SendByte(I2C_SLAVE_ADDRESS7);  
    HMC5883_SendByte(REG_Address);    
    HMC5883_SendByte(REG_data);      
    HMC5883_Stop();   
}
unsigned char Single_Read_HMC5883(unsigned char REG_Address)
{  
    unsigned char REG_data;
 
    HMC5883_Start();                       
    HMC5883_SendByte(I2C_SLAVE_ADDRESS7);  
    HMC5883_SendByte(REG_Address);       
    HMC5883_Start();                
    HMC5883_SendByte(I2C_SLAVE_ADDRESS7+1);     
    REG_data=HMC5883_RecvByte(); 
HMC5883_SendACK(0); /// 1   最后一个数据需要回NOACK
HM

评论

共有 条评论