OpenEdv-开源电子网

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

LIS2DH12 IIC

[复制链接]

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
发表于 2017-9-29 07:37:44 | 显示全部楼层 |阅读模式
21金钱
本帖最后由 zxykklt 于 2017-9-29 08:24 编辑

最近研究LIS2 DH12,用IIC补充ST的驱动代码,通过方式一写可以正确将函数IIC_Read_Byte()的返回值传给指针Bufp所指的内存,但是通过方式二指针Bufp指向的位置不能被赋值,已经无助了,各位谁知道这是怎么回事???

方式一:
[mw_shl_code=c,true]status_t LIS2DH12_ACC_ReadReg(void *handle, u8_t Reg, u8_t *Bufp, u16_t len)
{
   
  //To be completed with either I2c or SPI writing function
  //i.e.: SPI_Mems_Write_Reg(Reg, Data);
  //I2Cx_Write(Bufp, LSM6DS3H_ACC_GYRO_I2C_ADDRESS, Reg, len);    //[Example]
        u8_t Data;
        IIC_Start();
        IIC_Send_Byte(0x30);
        IIC_Wait_Ack();
        IIC_Send_Byte(Reg);
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Send_Byte(0x31);
        IIC_Wait_Ack();
        Data=IIC_Read_Byte(0);
//        *Bufp=IIC_Read_Byte(0);
        IIC_Stop();
        Bufp=&Data;
  return MEMS_SUCCESS;
}[/mw_shl_code]



方式二:
[mw_shl_code=c,true]status_t LIS2DH12_ACC_ReadReg(void *handle, u8_t Reg, u8_t *Bufp, u16_t len)
{
   
  //To be completed with either I2c or SPI writing function
  //i.e.: SPI_Mems_Write_Reg(Reg, Data);
  //I2Cx_Write(Bufp, LSM6DS3H_ACC_GYRO_I2C_ADDRESS, Reg, len);    //[Example]
//        u8_t Data;
        IIC_Start();
        IIC_Send_Byte(0x30);
        IIC_Wait_Ack();
        IIC_Send_Byte(Reg);
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Send_Byte(0x31);
        IIC_Wait_Ack();
//        Data=IIC_Read_Byte(0);
        *Bufp=IIC_Read_Byte(0);
        IIC_Stop();
//        Bufp=&Data;
  return MEMS_SUCCESS;
}[/mw_shl_code]



最佳答案

查看完整内容[请看2#楼]

嗯 问题解决就好,指针在使用之前一定要有所指向,即要指向一个地址,否则编译器不报错,在大型程序中很难发现问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-9-29 07:37:45 | 显示全部楼层
嗯 问题解决就好,指针在使用之前一定要有所指向,即要指向一个地址,否则编译器不报错,在大型程序中很难发现问题
坚持不懈的努力!
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
 楼主| 发表于 2017-9-29 07:45:42 | 显示全部楼层
本帖最后由 zxykklt 于 2017-9-29 08:25 编辑

通过方式一填充LIS2DH12_ACC_ReadReg()这个函数,但是在主函数里面调用这个函数读设备的ID,结果运行到函数里面能得到0x33的正确值,但是主函数里面定义的指针ID所指的值还是0,这个又是怎么回事,小弟C语言很久没复习了?是我写的有问题吗??各位求教啊,搞懵了。。。
[mw_shl_code=c,true]int main(void)
{
        u8_t *ID=0;

        delay_init();                    //Ñóê±oˉêy3õê¼»ˉ          
        uart_init(9600);                 //′®¿ú3õê¼»ˉÎa9600
        LCD_Init();
        IIC_Init();
       
        POINT_COLOR=RED;
       
        LIS2DH12_ACC_ReadReg(0,LIS2DH12_WHO_AM_I_REG,ID,1);
        LCD_ShowString(10,10,100,24,24,ID);
}[/mw_shl_code]
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-9-29 09:02:47 | 显示全部楼层
本帖最后由 操作系统 于 2017-9-29 09:05 编辑

你的指针指向的地址为0,还把这个指针做参数传递出去了.不死机就是好的了.指针应该指向一个正确的地址.地址为0的指针是无效指针.指针这个名词是外国人发明的.建议你直接理解指针为  地址变量. 地址变量里面的内容一定要是 一个 普通的变量的地址,如果他的内容是0,是无效地址.

回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-9-29 09:12:05 | 显示全部楼层
int main(void)
{
    u8_t ID=0;

    delay_init();           //Ñóê±oˉêy3õê¼»ˉ      
    uart_init(9600);        //′®¿ú3õê¼»ˉÎa9600
    LCD_Init();
    IIC_Init();
     
    POINT_COLOR=RED;
     
    LIS2DH12_ACC_ReadReg(0,LIS2DH12_WHO_AM_I_REG,&ID,1);
    LCD_ShowString(10,10,100,24,24,ID);
}这样试试
坚持不懈的努力!
回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-9-29 09:18:51 | 显示全部楼层
u8 *ID=0; 申明了一个指针,但是没有给值(没给值的意思是没给一个固定的地址,就是没分配内存,只是一个申明),再把ID当参数那可不是一直为NULL? u8 ID =0;申明并分配内存地址,再当参数传递地址
坚持不懈的努力!
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
 楼主| 发表于 2017-9-29 09:25:49 | 显示全部楼层
本帖最后由 zxykklt 于 2017-9-29 09:29 编辑

meimengxing2014 发表于 2017-9-29 09:12
int main(void)
{
    u8_t ID=0;楼主你看,问题是这样的  我打断点运行到LIS2DH12_ACC_ReadReg()这个函数里面,得到了正确值0x33,但是不知道为什么主函数里面ID的值没有被修改,而且不知道为什么一直都是0x70这个值,一直是0x70不变
@操作系统

2017-09-29_9-23-06.png
2017-09-29_9-24-26.png
2017-09-29_9-25-07.png
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
 楼主| 发表于 2017-9-29 09:39:27 | 显示全部楼层
操作系统 发表于 2017-9-29 09:02
你的指针指向的地址为0,还把这个指针做参数传递出去了.不死机就是好的了.指针应该指向一个正确的地址.地址 ...

楼主,确实我理解不对  像这样写可以了    这样直接在主函数调试可以     但是像下面几楼说的那样调用函数  就不能了  能帮忙看看吗   2017-09-29_9-37-06.png
回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-9-29 09:44:06 | 显示全部楼层
zxykklt 发表于 2017-9-29 09:25
meimengxing2014 发表于 2017-9-29 09:12
int main(void)
{

0x70不对么?不是你要读取的ID?
坚持不懈的努力!
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
 楼主| 发表于 2017-9-29 09:48:34 | 显示全部楼层
meimengxing2014 发表于 2017-9-29 09:44
0x70不对么?不是你要读取的ID?

0x33 才是  运行到函数里面得到的值是0x33
但是主函数调用后  没有修改ID的值  一直保持0x70不变 0x70也不知道是哪里来的
回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-9-29 09:51:45 | 显示全部楼层
int main(void)
{
    u8_t ID=0;   //初始化一下,赋值为0
坚持不懈的努力!
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
 楼主| 发表于 2017-9-29 09:57:02 | 显示全部楼层
meimengxing2014 发表于 2017-9-29 09:51
int main(void)
{
    u8_t ID=0;   //初始化一下,赋值为0

初始化了  这样就变成一直是0不变了   为什么调用函数不能修改ID的值啊
回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-9-29 10:12:33 | 显示全部楼层
zxykklt 发表于 2017-9-29 09:57
初始化了  这样就变成一直是0不变了   为什么调用函数不能修改ID的值啊

我这样完全没有问题
QQ截图20170929101043.jpg
坚持不懈的努力!
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
 楼主| 发表于 2017-9-29 10:14:59 | 显示全部楼层
meimengxing2014 发表于 2017-9-29 09:51
int main(void)
{
    u8_t ID=0;   //初始化一下,赋值为0

好吧  楼主 我刚也弄好了  还是指针用的不对 这样写就好了
wKgcQlnNq2WATbcxAACXuHGGBgU295thumbnail.png
wKgcQlnNq3SAUqGKAAB6aEOH64E963thumbnail.png


回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-20
在线时间
48 小时
 楼主| 发表于 2017-9-29 10:15:56 | 显示全部楼层
meimengxing2014 发表于 2017-9-29 10:12
我这样完全没有问题

刚刚Q群里面有人也说是指针的问题 然后我这有改了下试试  结果好了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 20:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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