HMC5883L模块我用战舰版测试,没有反应!望大神指点!!!

2019-10-16 04:41发布

本帖最后由 chenghuayou 于 2016-12-4 11:19 编辑

HMC5883L模块我用战舰版测试,没有反应!望大神指点!!!
其中最大的问题就是我用PB6和PB7来做IIC的时钟线和数据线(因为这两个引脚在战舰版上与EEPROM连接时有上拉电阻)发送HMC5883L的地址(0x3c)然后等待应答,根本就收不到应答。
请问是我的IIC时序有问题吗?还是我买的这个模块有问题。
请各位大神指点迷津。


#ifndef __iic_h
#define __iic_h
#include "sys.h"


#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}


#define IIC_SCL   PBout(6)
#define IIC_SDA_OUT   PBout(7)
#define IIC_SDA_IN   PBin(7)


void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
u8 IIC_Wait_Ack(void);
void IIC_Master_Answer(void);
void IIC_Master_No_Answer(void);
void IIC_Send_Data(u8 data);
u8 IIC_Read_Data(u8 ack);



#endif


#include "stm32f10x.h"
#include "iic.h"
#include "sys.h"
#include "delay.h"


void IIC_Init()
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
           
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高
}


void IIC_Start()//起始信号
{
        SDA_OUT();
        IIC_SDA_OUT=1;
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA_OUT=0;
        delay_us(4);
        IIC_SCL=0;        
}


void IIC_Stop()//停止信号
{
        SDA_OUT();
        IIC_SCL=0;
        IIC_SDA_OUT=0;
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA_OUT=1;
        delay_us(4);
}


u8 IIC_Wait_Ack()//主机接收应答
{
        u8 ucErrTime=0;
        SDA_IN();//上拉或下拉输入模式
        IIC_SDA_OUT=1;delay_us(1);
        IIC_SCL=1;delay_us(1);
        while(IIC_SDA_IN)//设置为上拉输入模式使该条线默认状态下为1
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;
        return 0;
}


void IIC_Master_Answer()//主机发送应答或非应答
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA_OUT=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}


void IIC_Master_No_Answer()//主机发送应答或非应答
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA_OUT=1;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}



void IIC_Send_Data(u8 data)//主机发送一个字节
{
        u8 t;
        SDA_OUT();
        IIC_SCL=0;
        for(t=0;t<8;t++)
        {
                if((data&0x80)>>7)
                        IIC_SDA_OUT=1;
                else
                        IIC_SDA_OUT=0;
                data<<=1;
                delay_us(2);
                IIC_SCL=1;
                delay_us(2);
                IIC_SCL=0;
                delay_us(2);
        }
}


u8 IIC_Read_Data(u8 ack)//主机读取一个字节
{
        u8 i,receive=0;
        SDA_IN();
        for(i=0;i<8;i++)
        {
                IIC_SCL=0;
                delay_us(2);
                IIC_SCL=1;
                receive<<=1;
                if(IIC_SDA_IN)
                        receive++;
                delay_us(1);
        }
        if(!ack)IIC_Master_No_Answer();
        else IIC_Master_Answer();
        return receive;
}



#include "iic.h"
#include "hmc5883l.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"


void Write_HMC5883L(u8 address,u8 data)
{
        u8 u;
        IIC_Start();
        IIC_Send_Data(SlaveAddress);
        u=IIC_Wait_Ack();
        printf("%d ",u);//这里根本收不到应答
        IIC_Send_Data(address);
        IIC_Wait_Ack();
        IIC_Send_Data(data);
        IIC_Wait_Ack();
        IIC_Stop();
        delay_ms(10);
}


u8 Read_HMC5883L(u8 reg_address)
{
        u8 reg_data;
        IIC_Start();
        IIC_Send_Data(SlaveAddress);
        IIC_Wait_Ack();
        IIC_Send_Data(reg_address);
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Send_Data(SlaveAddress+1);
        IIC_Wait_Ack();
        reg_data=IIC_Read_Data(0);
        IIC_Stop();
        delay_ms(5);
        return reg_data;
}


void Multiple_Read_HMC5883L(u8* buff)
{
        u8 i;
        IIC_Start();
        IIC_Send_Data(SlaveAddress);
        IIC_Wait_Ack();
        IIC_Send_Data(0x03);
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Send_Data(SlaveAddress+1);
        IIC_Wait_Ack();
        for(i=0;i<6;i++)
        {
                if(i==5)
                        buff=IIC_Read_Data(0);
                else
                        buff=IIC_Read_Data(1);
        }
        IIC_Stop();
}


void HCM5883L_Init()
{
        IIC_Init();
        delay_ms(50);
        Write_HMC5883L(0x00,0x70);
        Write_HMC5883L(0x01,0xa0);
        Write_HMC5883L(0x02,0x00);
        delay_ms(10);
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。