bsp_IIC.cpp D:/gitt/MicrochipFor32/bsp_Device/bsp_IIC.cpp 浏览该文件的文档.00001 /*---------------------------------------------------------------------------------------------------- 00002 # 00003 # Copyright (c) 2022 Yuankang Liang(XerolySkinner) 00004 # 00005 # 本软件按原样提供,无任何明示或暗示 00006 # 在任何情况下,作者都不承担任何损害赔偿责任 00007 # 00008 # 使用的许可声明: 00009 # 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件. 00010 # 2. 免费授予以任何目的,前提是版权声明出现在所有副本中. 00011 # 并且版权声明和许可声明同时出现. 00012 # 3. 你有使用,复制,修改,分发,和销售本软件的许可. 00013 # 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的. 00014 # 5. 本通知不得从任何来源删除或更改. 00015 # 00016 # Yuankang Liang(XerolySkinner) 00017 # E-mail:zabbcccbbaz@163.com 00018 # QQ:2715099320 00019 # Mobile Phone:13005636215 00020 # 00021 # All rights reserved. 00022 */ 00023 00037 //---------------------------------------------------------------------------------------------------- 00038 // 头文件 00039 #include "bsp_IIC.h" 00041 //---------------------------------------------------------------------------------------------------- 00042 // 底层程序 00043 // 00047 void bsp_IIC::IIC_Start(void) { 00048 IIC_SDA(IIC_SET); 00049 IIC_SDA(IIC_SET); 00050 IIC_SCK(IIC_SET); 00051 IIC_Delay(); 00052 IIC_SDA(IIC_RESET); 00053 IIC_Delay(); 00054 IIC_SCK(IIC_RESET);} 00055 //---------------------------------------------------------------------------------------------------- 00059 void bsp_IIC::IIC_Stop(void) { 00060 IIC_SDA(IIC_RESET); 00061 IIC_SCK(IIC_SET); 00062 IIC_Delay(); 00063 IIC_SDA(IIC_SET); 00064 IIC_Delay();} 00065 //---------------------------------------------------------------------------------------------------- 00066 //发送应答或非应答信号 00071 void bsp_IIC::IIC_SendAck(u8 ackbit) { 00072 IIC_SCK(IIC_RESET); 00073 IIC_SDA(ackbit); 00074 IIC_Delay(); 00075 IIC_SCK(IIC_SET); 00076 IIC_Delay(); 00077 IIC_SCK(IIC_RESET); 00078 IIC_SDA(IIC_SET); 00079 IIC_Delay();} 00080 //---------------------------------------------------------------------------------------------------- 00085 u8 bsp_IIC::IIC_WaitAck(void) { 00086 u8 ackbit; 00087 IIC_SCK(IIC_SET); 00088 IIC_Delay(); 00089 ackbit = IIC_SDA(IIC_READ); 00090 IIC_SCK(IIC_RESET); 00091 IIC_Delay(); 00092 return ackbit;} 00093 //---------------------------------------------------------------------------------------------------- 00098 void bsp_IIC::IIC_SendByte(u8 byt) { 00099 u8 i; 00100 for (i = 0; i < 8; i++) { 00101 IIC_SCK(IIC_RESET); 00102 IIC_Delay(); 00103 IIC_SDA((byt & 0x80) != 0); 00104 IIC_Delay(); 00105 IIC_SCK(IIC_SET); 00106 byt <<= 1; 00107 IIC_Delay();} 00108 IIC_SCK(IIC_RESET);} 00109 //---------------------------------------------------------------------------------------------------- 00114 u8 bsp_IIC::IIC_RecByte(void) { 00115 u8 i=0, da=0; 00116 for (i = 0; i < 8; i++) { 00117 IIC_SCK(IIC_SET); 00118 IIC_Delay(); 00119 da <<= 1; 00120 if (IIC_SDA(IIC_READ))da |= 1; 00121 IIC_SCK(IIC_RESET); 00122 IIC_Delay();} 00123 return da;} 00125 //---------------------------------------------------------------------------------------------------- 00126 // 封装程序 00127 // 00136 void bsp_IIC::IIC_WriteOneByte(u8 id, u8 addr, u8 dat) { 00137 IIC_Start(); 00138 IIC_SendByte(id << 1); 00139 IIC_WaitAck(); 00140 IIC_SendByte(addr); 00141 IIC_WaitAck(); 00142 IIC_SendByte(dat); 00143 IIC_WaitAck(); 00144 IIC_Stop();} 00145 //---------------------------------------------------------------------------------------------------- 00153 u8 bsp_IIC::IIC_ReadOneByte(u8 id, u8 addr) { 00154 u8 temp = 0; 00155 IIC_Start(); 00156 IIC_SendByte(id << 1); 00157 IIC_WaitAck(); 00158 IIC_SendByte(addr); 00159 IIC_SendAck(0); 00160 IIC_Start(); 00161 IIC_SendByte((id << 1) | 0x01); 00162 IIC_SendAck(0); 00163 temp = IIC_RecByte(); 00164 IIC_SendAck(1); 00165 IIC_Stop(); 00166 return temp;} 00167 //---------------------------------------------------------------------------------------------------- 00177 void bsp_IIC::IIC_Write(u8 id,u8 addr,u8* dat,u32 len){ 00178 IIC_Start(); 00179 IIC_SendByte(id<<1); 00180 IIC_WaitAck(); 00181 IIC_SendByte(addr); 00182 IIC_WaitAck(); 00183 for(int i=0;i<len;i++){ 00184 IIC_SendByte(dat[i]); 00185 IIC_WaitAck();} 00186 IIC_Stop(); 00187 return;} 00188 //---------------------------------------------------------------------------------------------------- 00198 void bsp_IIC::IIC_Read(u8 id,u8 addr,u8* dat,u32 len){ 00199 IIC_Start(); 00200 IIC_SendByte(id<<1); 00201 IIC_WaitAck(); 00202 IIC_SendByte(addr); 00203 IIC_SendAck(0); 00204 IIC_Start(); 00205 IIC_SendByte((id<<1)|0x01); 00206 IIC_SendAck(0); 00207 for(int i=0;i<len;i++){ 00208 dat[i]=IIC_RecByte(); 00209 IIC_SendAck(i==(len-1));} 00210 IIC_Stop(); 00211 return;} 00213