本帖最后由 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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>