使用面向对象的编程思想封装IIC驱动,将IIC的属性和操作封装成一个库,在需要创建一个IIC设备时只需要实例化一个IIC对象即可,本文是基于STM32和HAL库做进一步封装的。 底层驱动方法不重要,封装的思想很重要。在完成对IIC驱动的封装之后借助继承特性实现AT24C64存储器的驱动开发...
return HAL_ERROR;} /* Process Locked */ __HAL_LOCK(hi2c);/* Init tickstart for timeout ...
使用面向对象的编程思想封装IIC驱动,将IIC的属性和操作封装成一个库,在需要创建一个IIC设备时只需要实例化一个IIC对象即可,本文是基于STM32和HAL库做进一步封装的。 底层驱动方法不重要,封装的思想很重要。在完成对IIC驱动的封装之后借助继承特性实现AT24C64存储器的驱动开发,仍使用面向对象的思想封装AT24C64驱动。 二....
else if(HAL_ERROR == ret) {HAL_UART_Transmit(&huart3,"EEPROM_ERROR\r\n", strlen("EEPROM_ERROR\r\n"),100); return EEPROM_ERROR; } else if(HAL_BUSY == ret) {HAL_UART_Transmit(&huart3,"HAL_BUSY\r\n", strlen("HAL_BUSY\r\n"),100); return HAL_BUSY; } else if(HAL_TIMEO...
//IIC_Wait_ack 返回HAL_OK表示wait成功,返回HAL_ERROR表示wait失败 static uint8_t IIC_Wait_Ack_t(const struct IIC_Type* IIC_Type_t) //IIC_Wait_ack,返回wait失败或是成功 { uint8_t ucErrTime = 0; SDA_IN(IIC_Type_t); //SDA设置为输入 ...
(&I2C_24CXX, ADDR_24CXX, 20); e = HAL_I2C_Mem_Read_DMA(&I2C_24CXX, ADDR_24CXX, 0, ADD_SIZE_24CXX,\ ReadBuffer, 2 * PAGE_SIZE_24CXX);//读取数据 if(e==HAL_ERROR)printf("EEPROM读取出错 %d",e); for(i=0; i< 2 * PAGE_SIZE_24CXX; i++) printf("ReadBuffer[%d]=0x...
//IIC_Wait_ack返回HAL_OK表示wait成功,返回HAL_ERROR表示wait失败 staticuint8_tIIC_Wait_Ack_t(conststruct IIC_Type*IIC_Type_t)//IIC_Wait_ack,返回wait失败或是成功 { uint8_tucErrTime=0; SDA_IN(IIC_Type_t);//SDA设置为输入 IIC_SDA(IIC_Type_t,1);IIC_Type_t->delay_us(1); ...
HAL_GPIO_WritePin(IIC_Type_t->GPIOx_SCL,IIC_Type_t->GPIO_SCL,GPIO_PIN_RESET);//设置SCL为低电平} }//设置SDA电平staticvoidIIC_SDA(conststruct IIC_Type* IIC_Type_t,intn){if(n ==1) { HAL_GPIO_WritePin(IIC_Type_t->GPIOx_SDA,IIC_Type_t->GPIO_SDA,GPIO_PIN_SET);//设置SDA为高...
最近正在DIY一款智能电池,需要使用STM32F030F4P6和TI的电池管理芯片BQ40Z50进行SMBUS通信。SMBUS本质上就是IIC通信,项目用到STM32CubeMX+HAL库,使用硬件IIC完成MCU对芯片的寄存器数据的读取和改写。 整篇博客主要是梳理一下IIC的通信流程,并记录一下项目实现的过程,如有错的地方,欢迎各位读者批评指正。
return IIC_HAL_ERROR; } else { //uart_printf("等待状态0X%02X失败,超时错误,SR:0x%X\r\n", Status, pHandle->IICx->SR); return IIC_TIMEOUT; } }//发送ACK static void IIC_SendACK(IIC_HANDLE* pHandle) { pHandle->IICx->CR1 &= ~BIT10; ...