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)例程?

dataozi 发表于 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:o

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;
    HAL_StatusTypeDef ret;

    tmp = WriteAddr;
    tmp = 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;       
        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;
        }
}

liuxingxyz 发表于 2019-6-26 14:31:56

主要是先发芯片地址,LIS3DH没有回ACK,往下就不能进行了。你用的是什么型号单片机,可否把代码发我参考一下,谢谢。

你若安好_清风徐来 发表于 2019-6-27 11:01:45

liuxingxyz 发表于 2019-6-26 10:00
用的是硬件I2C,lis3dsh地址是0x3c;cs也拉高,SA0接地;用逻辑分析仪测到的波形,地址也发的对,但是就是 ...

没有没用过你这个系列

middle1102 发表于 2019-8-16 11:29:09

很简单,先不用看代码,直接用示波器挂在I2C的两个脚上,看看你发出的器件地址第一个字节对不,如果确认地址是对的,再看第9位从机有没有应答
页: 1 [2]
查看完整版本: 各位大神求助 !!!!!急急急