你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
安 发表于 2019-6-26 11:03 楼主,最好把你操作的代码发一下,要注意I2C读写的标志位。先是写地址操作,再是读取操作。 ...
查看全部评分
zhang7309 发表于 2019-6-25 19:01 用硬件I2C吗? 示波器看看输出波形
你若安好_清风徐来 发表于 2019-6-26 09:35 建议软件I2C 等待应答 应答给死循环 示波器什么的看波形 看看有什么问题
andeyqi 发表于 2019-6-25 20:45 先用示波器看看波形,看下数据发送的有没有问题,没有问题再确认下芯片手册,逐步排查下问题。 ...
andeyqi 发表于 2019-6-26 11:07 没用过硬件32的硬件iic,一直都用的软件模拟的,IIC为什么还有CS呢,上述的地址3c是7bit的地址还是八位的 ...
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
{
}
}
你看下有问题没?
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;
}
}
示波器看看输出波形
评分
查看全部评分
评分
查看全部评分
是的,用的是硬件I2C,lis3dsh地址是0x3c;cs也拉高,SA0接地;用逻辑分析仪测到的波形,地址也发的对,但是就是没有回ACK??有没有例子参考下,谢谢!
用的是硬件I2C,lis3dsh地址是0x3c;cs也拉高,SA0接地;用逻辑分析仪测到的波形,地址也发的对,但是就是没有回ACK??有没有例子参考下,谢谢!
用的是硬件I2C,lis3dsh地址是0x3c;cs也拉高,SA0接地;用逻辑分析仪测到的波形,地址也发的对,但是就是没有回ACK??有没有例子参考下,谢谢!
评分
查看全部评分
I2C底层是生成的,问一下有没有ST官方STM32F407VG加速度(lis3dsh)例程?
8位的,速率100khz,I2C底层是生成的,问一下有没有ST官方STM32F407VG加速度(lis3dsh)例程?
评分
查看全部评分