怎么打开后很多乱码的呢?
繁體的
自己轉下就好了 留名啀用谢谢楼主 {:titter:}{:titter:}{:titter:}{:titter:}马克火速留名 正在研究硬件IIC 请教下楼主ADXL345_I2C_ADDR是如何确定的啊 cjwmusic 发表于 2013-9-22 21:35 static/image/common/back.gif
请教下楼主ADXL345_I2C_ADDR是如何确定的啊
看 Datasheet 的 以后会用到先标记拉 楼主在吗 LSM303低8位 3轴加速计正常
但是高8位却是乱码
为什么呢? 静止不懂的时候 高8位应该是零才对吧
因为是16位的高8位有数据的话 左移8位的时候 数值变得很大了
有没有出现这情况的?
本帖最后由 john800422 于 2013-10-24 12:54 编辑
nds_shenzhen 发表于 2013-10-24 12:03 static/image/common/back.gif
LSM303低8位 3轴加速计正常
但是高8位却是乱码
为什么呢? 静止不懂的时候 高8位应该是零才对吧
u8 Read_A_HL = {0};
s16 Read_A = {0};
Read_A_HL = OUT_X_L_A (28h)
Read_A_HL = OUT_X_H_A (29h)
Read_A_HL = OUT_Y_L_A (2Ah)
Read_A_HL = OUT_Y_H_A (2Bh)
Read_A_HL = OUT_Z_L_A (2Ch)
Read_A_HL = OUT_Z_H_A (2Dh)
Read_A = (s16)((Read_A << 8) | Read_A);
Read_A = (s16)((Read_A << 8) | Read_A);
Read_A = (s16)((Read_A << 8) | Read_A);
連續讀取的話,先讀出來的是低 8 寄存器
不知道是否是這個原因? john800422 发表于 2013-10-24 12:49 static/image/common/back.gif
連續讀取的話,先讀出來的是低 8 寄存器
不知道是否是這個原因?
我的也是一样的
你帮我看看 是什么情况
LSM303低8位 3轴加速计正常
但是高8位却是乱码
为什么呢? 静止不懂的时候 高8位应该是零才对吧
因为是16位的高8位有数据的话 左移8位的时候 数值变得很大了
有没有出现这情况的?
void LSM303A_Init( void )
{
Single_Write(LSM303A_I2C_ADDR,LSM303A_CTRL_REG1,0x27);
delay_ms(5);
Single_Write(LSM303A_I2C_ADDR,LSM303A_CTRL_REG4,0x40);
delay_ms(5);
temp=Single_Read(LSM303A_I2C_ADDR,LSM303A_CTRL_REG1);
printf("DS: %2x\n",temp);
}
初始化 返回寄存器设置是正确的。
void LSM303A_Read_Multiple_printf(void)
{
unsigned char ACC_Data;
int Ax = 0;
int Ay = 0;
int Az = 0;
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_X_L);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_X_H);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Y_L);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Y_H);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Z_L);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Z_H);
// Ax = (int) ((ACC_Data&0x0F) << 8) + ACC_Data;
// Ay = (int) ((ACC_Data&0x0F) << 8) + ACC_Data;
// Az = (int) ((ACC_Data&0x0F) << 8) + ACC_Data;
Ax = ACC_Data;
Ay = ACC_Data;
Az = ACC_Data;
printf("LSM:Ax: %d,Ay: %d,Az: %d\n",Ax,Ay,Az);
}
静止状态下 打印信息 很乱
LSM:Ax: 192,Ay: 16,Az: 112
LSM:Ax: 128,Ay: 64,Az: 64
LSM:Ax: 224,Ay: 240,Az: 176
LSM:Ax: 160,Ay: 0,Az: 48
LSM:Ax: 160,Ay: 176,Az: 176
LSM:Ax: 144,Ay: 0,Az: 16
LSM:Ax: 192,Ay: 0,Az: 128
LSM:Ax: 144,Ay: 16,Az: 80
LSM:Ax: 176,Ay: 16,Az: 224
LSM:Ax: 224,Ay: 32,Az: 0
LSM:Ax: 96,Ay: 144,Az: 208
LSM:Ax: 160,Ay: 208,Az: 48
LSM:Ax: 0,Ay: 160,Az: 112
LSM:Ax: 64,Ay: 224,Az: 96
LSM:Ax: 208,Ay: 240,Az: 160
LSM:Ax: 32,Ay: 224,Az: 160
LSM:Ax: 224,Ay: 208,Az: 208
LSM:Ax: 96,Ay: 208,Az: 112
LSM:Ax: 0,Ay: 160,Az: 80
LSM:Ax: 48,Ay: 32,Az: 208
LSM:Ax: 96,Ay: 160,Az: 112
LSM:Ax: 48,Ay: 32,Az: 192
LSM:Ax: 64,Ay: 160,Az: 0
LSM:Ax: 64,Ay: 32,Az: 144
LSM:Ax: 80,Ay: 176,Az: 192
同样一个读取函数
void LSM303A_Read_Multiple_printf(void)
{
unsigned char ACC_Data;
int Ax = 0;
int Ay = 0;
int Az = 0;
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_X_L);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_X_H);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Y_L);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Y_H);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Z_L);
ACC_Data=Single_Read(LSM303A_I2C_ADDR,LSM303A_OUT_Z_H);
// Ax = (int) ((ACC_Data&0x0F) << 8) + ACC_Data;
// Ay = (int) ((ACC_Data&0x0F) << 8) + ACC_Data;
// Az = (int) ((ACC_Data&0x0F) << 8) + ACC_Data;
Ax = ACC_Data;
Ay = ACC_Data;
Az = ACC_Data;
printf("LSM:Ax: %d,Ay: %d,Az: %d\n",Ax,Ay,Az);
}
静止状态下打印信息很正确
LSM:Ax: 5,Ay: 2,Az: 67
LSM:Ax: 4,Ay: 2,Az: 66
LSM:Ax: 4,Ay: 3,Az: 66
LSM:Ax: 4,Ay: 3,Az: 66
LSM:Ax: 4,Ay: 3,Az: 65
LSM:Ax: 4,Ay: 3,Az: 66
LSM:Ax: 4,Ay: 3,Az: 66
LSM:Ax: 5,Ay: 2,Az: 66
LSM:Ax: 4,Ay: 2,Az: 67
LSM:Ax: 6,Ay: 2,Az: 66
LSM:Ax: 4,Ay: 2,Az: 66
LSM:Ax: 4,Ay: 2,Az: 67
LSM:Ax: 4,Ay: 3,Az: 67
LSM:Ax: 5,Ay: 3,Az: 66
LSM:Ax: 5,Ay: 3,Az: 67
LSM:Ax: 5,Ay: 2,Az: 66
LSM:Ax: 4,Ay: 3,Az: 68
LSM:Ax: 5,Ay: 3,Az: 66
LSM:Ax: 4,Ay: 2,Az: 65
LSM:Ax: 4,Ay: 2,Az: 66
LSM:Ax: 4,Ay: 2,Az: 65
LSM:Ax: 4,Ay: 2,Az: 66
LSM:Ax: 5,Ay: 2,Az: 66 你出现过这样的情况吗如果是高8位 移位和低8位 相加的话 那就变化很大了 本帖最后由 john800422 于 2013-10-24 14:43 编辑
nds_shenzhen 发表于 2013-10-24 13:43 static/image/common/back.gif
你出现过这样的情况吗如果是高8位 移位和低8位 相加的话 那就变化很大了
試試看這樣吧
void LSM303A_Read_Multiple_printf(void)
{
unsigned char ACC_Data = {0};
int Ax = 0;
int Ay = 0;
int Az = 0;
ACC_Data = Single_Read(LSM303A_I2C_ADDR, LSM303A_OUT_X_L);
ACC_Data = Single_Read(LSM303A_I2C_ADDR, LSM303A_OUT_X_H);
ACC_Data = Single_Read(LSM303A_I2C_ADDR, LSM303A_OUT_Y_L);
ACC_Data = Single_Read(LSM303A_I2C_ADDR, LSM303A_OUT_Y_H);
ACC_Data = Single_Read(LSM303A_I2C_ADDR, LSM303A_OUT_Z_L);
ACC_Data = Single_Read(LSM303A_I2C_ADDR, LSM303A_OUT_Z_H);
Ax = (int)((ACC_Data << 8) | ACC_Data);
Ay = (int)((ACC_Data << 8) | ACC_Data);
Az = (int)((ACC_Data << 8) | ACC_Data);
// Ax = ACC_Data;
// Ay = ACC_Data;
// Az = ACC_Data;
printf("ReadAcc: Ax: %d, Ay: %d, Az: %d\n", Ax, Ay, Az);
}
john800422 发表于 2013-10-24 14:41 static/image/common/back.gif
試試看這樣吧
Ax = (int)((ACC_Data << 8) | ACC_Data);
Ay = (int)((ACC_Data << 8) | ACC_Data);
Az = (int)((ACC_Data << 8) | ACC_Data);
得到的结果如下
LSM:Ax: 49407,Ay: 28672,Az: 49218
LSM:Ax: 45311,Ay: 1,Az: 61506
LSM:Ax: 41215,Ay: 40960,Az: 49218
LSM:Ax: 0,Ay: 36864,Az: 20547
LSM:Ax: 24831,Ay: 1,Az: 49219
LSM:Ax: 45310,Ay: 8193,Az: 53314
LSM:Ax: 61695,Ay: 20481,Az: 53314
LSM:Ax: 37119,Ay: 40961,Az: 16451
LSM:Ax: 33023,Ay: 40960,Az: 61506
LSM:Ax: 49406,Ay: 12289,Az: 8259
LSM:Ax: 16639,Ay: 32769,Az: 16451
LSM:Ax: 45311,Ay: 4097,Az: 24643
LSM:Ax: 4351,Ay: 57344,Az: 20547
LSM:Ax: 24831,Ay: 4097,Az: 20547
LSM:Ax: 28927,Ay: 16385,Az: 12354
LSM:Ax: 37119,Ay: 36864,Az: 66
LSM:Ax: 61695,Ay: 24577,Az: 16451
LSM:Ax: 16384,Ay: 49152,Az: 24642
LSM:Ax: 16639,Ay: 20481,Az: 61506
LSM:Ax: 4096,Ay: 4097,Az: 16451
LSM:Ax: 57598,Ay: 53248,Az: 61507
LSM:Ax: 37119,Ay: 1,Az: 4163
LSM:Ax: 37119,Ay: 49152,Az: 32834
LSM:Ax: 28927,Ay: 36864,Az: 53314
LSM:Ax: 61695,Ay: 12288,Az: 53314
LSM:Ax: 24831,Ay: 40961,Az: 67
LSM:Ax: 33023,Ay: 32769,Az: 57410
LSM:Ax: 45311,Ay: 49152,Az: 32835
LSM:Ax: 57599,Ay: 12289,Az: 12355
LSM:Ax: 33023,Ay: 49152,Az: 4163
LSM:Ax: 20735,Ay: 12289,Az: 53314
LSM:Ax: 12543,Ay: 4097,Az: 67
LSM:Ax: 24831,Ay: 1,Az: 20546
LSM:Ax: 37118,Ay: 4097,Az: 32835
LSM:Ax: 33023,Ay: 61440,Az: 28738
LSM:Ax: 45311,Ay: 32769,Az: 12355
LSM:Ax: 53503,Ay: 45057,Az: 57410
LSM:Ax: 61695,Ay: 32769,Az: 32834
LSM:Ax: 45310,Ay: 53248,Az: 12355
LSM:Ax: 16384,Ay: 4097,Az: 24643
LSM:Ax: 61695,Ay: 24576,Az: 45122
LSM:Ax: 61694,Ay: 4097,Az: 41027
LSM:Ax: 49407,Ay: 40960,Az: 16450
LSM:Ax: 0,Ay: 20481,Az: 57410
LSM:Ax: 16639,Ay: 36864,Az: 20548
LSM:Ax: 28927,Ay: 57344,Az: 20547
LSM:Ax: 41215,Ay: 28672,Az: 24642
LSM:Ax: 4351,Ay: 24576,Az: 4163
很奇怪的。。。
{:smile:}恩恩。 楼主 我也是刚开始做四轴想用IIC+DMA _Read_Multiple这个是什么意思,每个器件头文件里面都有小弟新手 我想问,这个代码硬件iic加dma用着稳定吗?iic还挂载了多个器件,我硬件iic总是跑飞 楼主,能够正常初始化,但是却读不到设备的ID,ID总是0,这是为什么呀? 膜拜一下大神的杰作 太好了~ 顶一个啊 谢谢分享,下载留名~ mark。 john800422 发表于 2012-8-27 22:01
已经可以了
谢谢~
谢谢分享!
mark一下子啊~!有空也想做四轴 很有用,收藏了 楼主问一下这个函数作用是什么?
void I2C1_Recv_DMA_IRQ( void )
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC7)) {
if(I2C1->SR2 & 0x01) {
I2C_DMACmd(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
PV_flag_1 = 0;
}
DMA_ClearFlag(DMA1_FLAG_TC7);
}
if(DMA_GetFlagStatus(DMA1_FLAG_GL7))
DMA_ClearFlag(DMA1_FLAG_GL7);
if(DMA_GetFlagStatus(DMA1_FLAG_HT7))
DMA_ClearFlag(DMA1_FLAG_HT7);
} 我是冲着硬件IIC来的,希望楼主给力 以前弄过,回头找找给你! LZ有没有做数据融合? 谢谢分析!学习下LSM303. 被GD32 的i2c搞死了 本来还想说竟然用洞洞板搭,一看时间2012年!!
厉害! 我就想知道lsm303怎么焊接啊,太他妈小了 好东西标志
页:
1
[2]