STM32硬件IIC卡死问题和DMA发送数据异常问题

STM32硬件IIC卡死问题和DMA发送数据异常问题

问题1描述:
一直听说STM32的硬件IIC有问题,我平时做项目一直没有遇到过,这次做项目发现硬件IIC居然会自己卡死,现象就是IIC发不出数据,用逻辑分析仪捕捉不到任何电平,必须要重启单片机才能正常,接下来说一下我的硬件环境:STM32作为主机,IIC总线上挂载这AT24C02和一个流量传感器,但是这个流量传感器有问题,他在不上电的时候IIC总线一直输出1.8V(IIC信号线反向给流量传感器供电导致的),这就导致STM32初始话完IIC后就处于卡死状态(STM32检测到IIC线异常后就直接卡死了,不管你程序怎么发送信号电平),所以最终解决办法是要等到流量传感器完全上电之后,复位一下硬件IIC。

void devIICReset(void)
{
	HAL_I2C_DeInit(&hi2c1);
	HAL_Delay(1);
	I2C1->CR1 |= I2C_CR1_SWRST;
	HAL_Delay(1);
	I2C1->CR1 &= ~I2C_CR1_SWRST;
	HAL_Delay(1);
	MX_I2C1_Init();
	HAL_Delay(1);
}

问题2描述:
承接上面我的硬件环境,总线上挂着AT24C02和流量传感器,我需要实时获取流量传感器数据(10ms就读取一次花费时间0.3ms/次),当掉电不丢失数据改变时我需要写AT24C02(写一次花费时间1ms),这就让我觉得太占用资源了,需要用到DMA来干活了,发现如果两次读取时间间隔过短,比如小于1ms,用逻辑分析仪捕捉不到任何波形,也不清楚IIC是否是卡死了,还是不能这样操作,暂时没有找到有效解决办法,替代方案是:提高IIC通讯速度或者是每次DMA操作后延时1ms(还不如不用DMA了,直接用阻塞方式发送算了)

#define FLOW_ADDR 			0x49
#define FLOW_ADDR_WRITE 	0x92
#define FLOW_ADDR_READ 		0x93
if(HAL_I2C_Master_Receive_DMA(&hi2c1,FLOW_ADDR_READ,data,len) != HAL_OK)
{
	Debug_error("flowSensorRead fail!!!");
}

你可能感兴趣的:(STM32开发经验,stm32,嵌入式硬件,单片机)