bsp_IIC.cpp bsp_IIC.h 本类实现软件IIC功能 依此类派生出其他软件IIC功能 /*---------------------------------------------------------------------------------------------------- # #Copyright(c)2022YuankangLiang(XerolySkinner) # #本软件按原样提供,无任何明示或暗示 #在任何情况下,作者都不承担任何损害赔偿责任 # #使用的许可声明: #1.不得歪曲本软件的来源,你不能声称你编写了原始软件. #2.免费授予以任何目的,前提是版权声明出现在所有副本中. #并且版权声明和许可声明同时出现. #3.你有使用,复制,修改,分发,和销售本软件的许可. #4.如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的. #5.本通知不得从任何来源删除或更改. # #YuankangLiang(XerolySkinner) #E-mail:zabbcccbbaz@163.com #QQ:2715099320 #MobilePhone:13005636215 # #Allrightsreserved. */ //---------------------------------------------------------------------------------------------------- //头文件 #include"bsp_IIC.h" //---------------------------------------------------------------------------------------------------- //底层程序 // voidbsp_IIC::IIC_Start(void){ IIC_SDA(IIC_SET); IIC_SDA(IIC_SET); IIC_SCK(IIC_SET); IIC_Delay(); IIC_SDA(IIC_RESET); IIC_Delay(); IIC_SCK(IIC_RESET);} //---------------------------------------------------------------------------------------------------- voidbsp_IIC::IIC_Stop(void){ IIC_SDA(IIC_RESET); IIC_SCK(IIC_SET); IIC_Delay(); IIC_SDA(IIC_SET); IIC_Delay();} //---------------------------------------------------------------------------------------------------- //发送应答或非应答信号 voidbsp_IIC::IIC_SendAck(u8ackbit){ IIC_SCK(IIC_RESET); IIC_SDA(ackbit); IIC_Delay(); IIC_SCK(IIC_SET); IIC_Delay(); IIC_SCK(IIC_RESET); IIC_SDA(IIC_SET); IIC_Delay();} //---------------------------------------------------------------------------------------------------- u8bsp_IIC::IIC_WaitAck(void){ u8ackbit; IIC_SCK(IIC_SET); IIC_Delay(); ackbit=IIC_SDA(IIC_READ); IIC_SCK(IIC_RESET); IIC_Delay(); returnackbit;} //---------------------------------------------------------------------------------------------------- voidbsp_IIC::IIC_SendByte(u8byt){ u8i; for(i=0;i<8;i++){ IIC_SCK(IIC_RESET); IIC_Delay(); IIC_SDA((byt&0x80)!=0); IIC_Delay(); IIC_SCK(IIC_SET); byt<<=1; IIC_Delay();} IIC_SCK(IIC_RESET);} //---------------------------------------------------------------------------------------------------- u8bsp_IIC::IIC_RecByte(void){ u8i=0,da=0; for(i=0;i<8;i++){ IIC_SCK(IIC_SET); IIC_Delay(); da<<=1; if(IIC_SDA(IIC_READ))da|=1; IIC_SCK(IIC_RESET); IIC_Delay();} returnda;} //---------------------------------------------------------------------------------------------------- //封装程序 // voidbsp_IIC::IIC_WriteOneByte(u8id,u8addr,u8dat){ IIC_Start(); IIC_SendByte(id<<1); IIC_WaitAck(); IIC_SendByte(addr); IIC_WaitAck(); IIC_SendByte(dat); IIC_WaitAck(); IIC_Stop();} //---------------------------------------------------------------------------------------------------- u8bsp_IIC::IIC_ReadOneByte(u8id,u8addr){ u8temp=0; IIC_Start(); IIC_SendByte(id<<1); IIC_WaitAck(); IIC_SendByte(addr); IIC_SendAck(0); IIC_Start(); IIC_SendByte((id<<1)|0x01); IIC_SendAck(0); temp=IIC_RecByte(); IIC_SendAck(1); IIC_Stop(); returntemp;} //---------------------------------------------------------------------------------------------------- voidbsp_IIC::IIC_Write(u8id,u8addr,u8*dat,u32len){ IIC_Start(); IIC_SendByte(id<<1); IIC_WaitAck(); IIC_SendByte(addr); IIC_WaitAck(); for(inti=0;i<len;i++){ IIC_SendByte(dat[i]); IIC_WaitAck();} IIC_Stop(); return;} //---------------------------------------------------------------------------------------------------- voidbsp_IIC::IIC_Read(u8id,u8addr,u8*dat,u32len){ IIC_Start(); IIC_SendByte(id<<1); IIC_WaitAck(); IIC_SendByte(addr); IIC_SendAck(0); IIC_Start(); IIC_SendByte((id<<1)|0x01); IIC_SendAck(0); for(inti=0;i<len;i++){ dat[i]=IIC_RecByte(); IIC_SendAck(i==(len-1));} IIC_Stop(); return;}