LIS2DH12 IIC

2019-08-13 22:19发布

本帖最后由 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]



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
meimengxing2014
1楼-- · 2019-08-14 04:11
 精彩回答 2  元偷偷看……
zxykklt
2楼-- · 2019-08-14 04:44
本帖最后由 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]
操作系统
3楼-- · 2019-08-14 05:23
本帖最后由 操作系统 于 2017-9-29 09:05 编辑

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

meimengxing2014
4楼-- · 2019-08-14 10:42
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);
}这样试试
meimengxing2014
5楼-- · 2019-08-14 15:56
u8 *ID=0; 申明了一个指针,但是没有给值(没给值的意思是没给一个固定的地址,就是没分配内存,只是一个申明),再把ID当参数那可不是一直为NULL? u8 ID =0;申明并分配内存地址,再当参数传递地址
zxykklt
6楼-- · 2019-08-14 18:23
 精彩回答 2  元偷偷看……

一周热门 更多>