请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

各位大神求助 !!!!!急急急

[复制链接]
liuxingxyz 提问时间:2019-6-25 18:47 /
用STM32F042C6T6开发lis3dsh,用I2C开发,但是一直通信不上,给小弟支支招,谢谢.
收藏 评论17 发布时间:2019-6-25 18:47

举报

17个回答
liuxingxyz 回答时间:2019-6-26 12:30:32
安 发表于 2019-6-26 11:03
楼主,最好把你操作的代码发一下,要注意I2C读写的标志位。先是写地址操作,再是读取操作。 ...

u8_t LIS3DH_WriteReg(u8_t WriteAddr, u8_t Data) {
  
    uint8_t tmp[2];
    HAL_StatusTypeDef ret;

    tmp[0] = WriteAddr;
    tmp[1] = Data;
       
    ret = HAL_I2C_Master_Transmit(&hi2c1, LIS3DH_MEMS_I2C_ADDRESS<<1, tmp, sizeof(tmp), LIS3DHTR_COMM_TIMEOUT);
       
    if (HAL_OK != ret){
    //DbgPrintfD("I2C error, %d\r\n", ret, hi2c1.ErrorCode);
    }
   return ret;
}
u8_t LIS3DH_ReadReg(u8_t Reg, u8_t* data) {
  
    HAL_StatusTypeDef ret;
          
    //DbgPrintfD("%d\t%x\r\n", reg, data);
                ret = HAL_I2C_Master_Transmit(&hi2c1, LIS3DH_MEMS_I2C_ADDRESS<<1, &Reg, 1, LIS3DHTR_COMM_TIMEOUT);
    ret = HAL_I2C_Master_Receive(&hi2c1, LIS3DH_MEMS_I2C_ADDRESS<<1, data, 1, LIS3DHTR_COMM_TIMEOUT);
    if (HAL_OK != ret){
    //DbgPrintfD("I2C error, %d %u\r\n", ret, hi2c1.ErrorCode);
    }
   return ret;
}
void Lis3dhtrInit(void)
{
          uint8_t response=0;
                response=LIS3DH_WriteReg(LIS3DH_CTRL_REG1,0x47);     // 启动传感器,使能 X、 Y 和 Z
          ODR = 100 Hz
          DbgPrintfD("设置 ODR:%d\r\n",response);
                response=LIS3DH_SetMode(LIS3DH_NORMAL);              // 设置为正常模式
          DbgPrintfD("设置 MODE:%d\r\n",response);
          LIS3DH_WriteReg(LIS3DH_CTRL_REG2,0x00);     // 高通滤波器已禁用
          LIS3DH_WriteReg(LIS3DH_CTRL_REG3,0x40);     // 中断被驱动到 INT1 焊盘
          LIS3DH_WriteReg(LIS3DH_CTRL_REG4,0x00);     // FS = 2 g
          LIS3DH_WriteReg(LIS3DH_CTRL_REG5,0x08);     // 中断已锁存
          //LIS3DH_WriteReg(LIS3DH_CTRL_REG6,0x08);
          LIS3DH_WriteReg(LIS3DH_INT1_THS,0x16);      // 将自由落体阈值设为 350 mg
          LIS3DH_WriteReg(LIS3DH_INT1_DURATION,0x03); // 设置最短事件持续时间
          LIS3DH_WriteReg(LIS3DH_INT1_CFG,0x95);      // 配置自由落体识别
}
void Lis3dhtrPoll(void)
{
          uint8_t data;
          uint8_t ret,j;
          uint16_t i;
          ret=HAL_GPIO_ReadPin(GPIO_Acc_GPIO_Port, GPIO_Acc_Pin);
          for(i=0;i<5000;i++){}
                LIS3DH_WriteReg(LIS3DH_INT1_CFG,0x95);
       
                //j=LIS3DH_ReadReg(LIS3DH_INT1_SRC,&data);//清除中断请求  
    //j=LIS3DH_ReadReg(LIS3DH_WHO_AM_I,&data);                       
                if(j==1)
                {
                                DbgPrintfD("设备ID:%d\r\n",data);
                }       
                if(ret==0)
                {
                                //LIS3DH_ReadReg(LIS3DH_INT1_SRC,&data);//清除中断请求                 
                }
                else
                {
                    
                }
}
你看下有问题没?
废鱼 回答时间:2019-6-26 14:05:51
从代码上看没有问题,注意一下硬件地址是不是0x1E?先测试读取一下ID内容。下面是我以前测试的代码:
void MX_DS1308_READ(void)
{
        uint8_t data[8];       
        uint8_t ch;
       
        ch = 0x02;       
        if(HAL_I2C_Master_Transmit(&hi2c1,MX_RTC_ADDR,(uint8_t*)&ch,1,1000) != HAL_OK)
        {
                return;
        }       
        if(HAL_I2C_Master_Receive(&hi2c1,MX_RTC_ADDR,data1,7,1000) != HAL_OK)
        {
                return;
        }
}

andey 回答时间:2019-6-26 11:07:35
提示: 作者被禁止或删除 内容自动屏蔽
zhang7309 回答时间:2019-6-25 19:01:46
用硬件I2C吗?
示波器看看输出波形

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

andey 回答时间:2019-6-25 20:45:14
提示: 作者被禁止或删除 内容自动屏蔽
你若安好_清风徐来 回答时间:2019-6-26 09:35:32
建议软件I2C  等待应答  应答给死循环  示波器什么的看波形 看看有什么问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

liuxingxyz 回答时间:2019-6-26 09:58:56
zhang7309 发表于 2019-6-25 19:01
用硬件I2C吗?
示波器看看输出波形

是的,用的是硬件I2C,lis3dsh地址是0x3c;cs也拉高,SA0接地;用逻辑分析仪测到的波形,地址也发的对,但是就是没有回ACK??有没有例子参考下,谢谢!
liuxingxyz 回答时间:2019-6-26 09:59:40
你若安好_清风徐来 发表于 2019-6-26 09:35
建议软件I2C  等待应答  应答给死循环  示波器什么的看波形 看看有什么问题

用的是硬件I2C,lis3dsh地址是0x3c;cs也拉高,SA0接地;用逻辑分析仪测到的波形,地址也发的对,但是就是没有回ACK??有没有例子参考下,谢谢!
liuxingxyz 回答时间:2019-6-26 10:00:22
andeyqi 发表于 2019-6-25 20:45
先用示波器看看波形,看下数据发送的有没有问题,没有问题再确认下芯片手册,逐步排查下问题。 ...

用的是硬件I2C,lis3dsh地址是0x3c;cs也拉高,SA0接地;用逻辑分析仪测到的波形,地址也发的对,但是就是没有回ACK??有没有例子参考下,谢谢!
废鱼 回答时间:2019-6-26 11:03:05
楼主,最好把你操作的代码发一下,要注意I2C读写的标志位。先是写地址操作,再是读取操作。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

liuxingxyz 回答时间:2019-6-26 11:25:55
安 发表于 2019-6-26 11:03
楼主,最好把你操作的代码发一下,要注意I2C读写的标志位。先是写地址操作,再是读取操作。 ...

I2C底层是生成的,问一下有没有ST官方STM32F407VG加速度(lis3dsh)例程?
liuxingxyz 回答时间:2019-6-26 11:27:37
andeyqi 发表于 2019-6-26 11:07
没用过硬件32的硬件iic,一直都用的软件模拟的,IIC为什么还有CS呢,上述的地址3c是7bit的地址还是八位的 ...

8位的,速率100khz,I2C底层是生成的,问一下有没有ST官方STM32F407VG加速度(lis3dsh)例程?
大陶 回答时间:2019-6-26 11:44:07
有411的 LIS2DH 模拟的IIC 你需要吗?
jeffhe1 回答时间:2019-6-26 11:57:10
cs 應該是 SPI 才有的詞 , I2C 不就 SDA SCL , 要不要先對 EEPROM 讀寫看是否成功 , 再依IC protcol 發 cmd

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版