OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7003|回复: 1

基于STM32-F4的HMC5883L的数据传输问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-7-11
在线时间
0 小时
发表于 2015-7-11 19:32:51 | 显示全部楼层 |阅读模式
5金钱

[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]





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-7-11 22:51:29 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 20:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表