[mw_shl_code=c,true]IIC的代码都是正点哥的,编译什么的都通过,但是,xyz的数据始终是95,刚接触了俩礼拜,还没有掌握太好,希望各路大神,帮忙指导下~~~[/mw_shl_code]
[mw_shl_code=c,true]#define __HMC5883L_H
#include "myiic.h"
#include "sys.h"
#define SlaveAddress 0x3c
void HMC5883L_Init(void);
void Write_HMC5883(u8 add, u8 da);
u8 Read_HMC5883(u8 REG_Address);
void Multiple_read_HMC5883(u8*BUF);
[/mw_shl_code]
[mw_shl_code=c,true]
#include "HMC5883L.h"
#include "delay.h"
void HMC5883L_Init(void)
{
IIC_Init();
Write_HMC5883(0x02, 0x00);
}
void Multiple_read_HMC5883(u8*BUF)
{ u8 i;
IIC_Start();
IIC_Send_Byte(SlaveAddress);[/mw_shl_code]
[mw_shl_code=c,true] IIC_Wait_Ack();
IIC_Send_Byte(0x03);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
IIC_Wait_Ack();
for (i=0; i<6; i++)
{
if (i == 5)
{
BUF = IIC_Read_Byte(0);
}
else
{
BUF = IIC_Read_Byte(1);
}
}
IIC_Stop();
}
void Write_HMC5883(u8 add, u8 da)
{
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(add);[/mw_shl_code]
[mw_shl_code=c,true] IIC_Wait_Ack();
IIC_Send_Byte(da);
IIC_Wait_Ack();
IIC_Stop();
}
u8 Read_HMC5883(u8 REG_Address)
{
u8 REG_data;
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(REG_Address); [/mw_shl_code]
[mw_shl_code=c,true] IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
IIC_Wait_Ack();
REG_data=IIC_Read_Byte(0);
IIC_Stop();
return REG_data;
}
[/mw_shl_code]
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "HMC5883L.h"
[/mw_shl_code]
[mw_shl_code=c,true]u8 BUF[6];
int main(void)
{
int x,y,z;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
delay_init(168);
uart_init(115200);
LCD_Init(); [/mw_shl_code]
[mw_shl_code=c,true] IIC_Init();
HMC5883L_Init();
POINT_COLOR=RED;
while(1)
{
Multiple_read_HMC5883(BUF);
x=BUF[0] << 8 | BUF[1];
z=BUF[2] << 8 | BUF[3];
y=BUF[4] << 8 | BUF[5];
if(x>32768)
x = -(0xFFFF - x + 1);
if(z>32768)
z = -(0xFFFF - z + 1);
if(y>32768)
y = -(0xFFFF - y + 1);
delay_ms(10);
LCD_ShowNum(30+40,150,x,2,16);
LCD_ShowNum(30+40,170,y,2,16);
LCD_ShowNum(30+40,190,z,2,16);
}
}
[/mw_shl_code]
[mw_shl_code=c,true] [/mw_shl_code]
[mw_shl_code=c,true] [/mw_shl_code]
[mw_shl_code=c,true] [/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"
#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;}
#define IIC_SCL PBout(8) [/mw_shl_code]
[mw_shl_code=c,true]#define IIC_SDA PBout(9)
#define READ_SDA PBin(9)
void IIC_Init(void);
void IIC_Start(void); [/mw_shl_code]
[mw_shl_code=c,true]void IIC_Stop(void); [/mw_shl_code]
[mw_shl_code=c,true]void IIC_Send_Byte(u8 txd);
u8 IIC_Read_Byte(unsigned char ack);[/mw_shl_code]
[mw_shl_code=c,true]u8 IIC_Wait_Ack(void); [/mw_shl_code]
[mw_shl_code=c,true]void IIC_Ack(void);
void IIC_NAck(void);
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
#endif
[mw_shl_code=c,true]#include "myiic.h"
#include "delay.h"
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure;
IIC_SCL=1;
IIC_SDA=1;
}
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;
delay_us(4);
IIC_SCL=0;
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();//·???nACK
else
IIC_Ack(); //·???ACK
return receive;
}
[/mw_shl_code]
[/mw_shl_code]
[/mw_shl_code]
|