C51 COMPILER V9.59.0.0 STC8A_I2C 06/10/2021 10:06:08 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE STC8A_I2C OBJECT MODULE PLACED IN .\list\STC8A_I2C.obj COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE STC8A_I2C.c OMF2 OPTIMIZE(8,SPEED) BROWSE DEBUG PRINT(.\list\STC8A_I2C.l -st) TABS(2) OBJECT(.\list\STC8A_I2C.obj) line level source 1 /*---------------------------------------------------------------------*/ 2 /* --- STC MCU Limited ------------------------------------------------*/ 3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/ 4 /* --- Mobile: (86)13922805190 ----------------------------------------*/ 5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ 6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ 7 /* --- Web: www.STCMCU.com --------------------------------------------*/ 8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/ 9 /* --- QQ: 800003751 -------------------------------------------------*/ 10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */ 11 /*---------------------------------------------------------------------*/ 12 13 #include "STC8A_I2C.h" 14 15 u8 xdata I2C_Buffer[I2C_BUF_LENTH]; 16 //u8 xdata *I2C_Buffer; 17 18 #define SLAW 0xA2 19 #define SLAR 0xA3 20 21 //======================================================================== 22 // 函数: void I2C_Init(I2C_InitTypeDef *I2Cx) 23 // 描述: I2C初始化程序. 24 // 参数: I2Cx: 结构参数,请参考I2C.h里的定义. 25 // 返回: none. 26 // 版本: V1.0, 2012-11-22 27 //======================================================================== 28 void I2C_Init(I2C_InitTypeDef *I2Cx) 29 { 30 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */ 31 1 32 1 if(I2Cx->I2C_Mode == I2C_Mode_Master) 33 1 { 34 2 I2C_Master(); //设为主机 35 2 I2CMSST = 0x00; //清除I2C主机状态寄存器 36 2 I2C_SetSpeed(I2Cx->I2C_Speed); 37 2 if(I2Cx->I2C_MS_WDTA == ENABLE) I2C_WDTA_EN(); //使能自动发送 38 2 else I2C_WDTA_DIS(); //禁止自动发送 39 2 } 40 1 else 41 1 { 42 2 I2C_Slave(); //设为从机 43 2 I2CSLST = 0x00; //清除I2C从机状态寄存器 44 2 I2C_Address(I2Cx->I2C_SL_ADR); 45 2 if(I2Cx->I2C_SL_MA == ENABLE) I2C_MATCH_EN(); //从机地址比较功能,只接受相匹配地址 46 2 else I2C_MATCH_DIS(); //禁止从机地址比较功能,接受所有设备地址 47 2 } 48 1 49 1 I2C_Function(I2Cx->I2C_Enable); 50 1 51 1 // if(I2C_Buffer){free(I2C_Buffer);I2C_Buffer = NULL;} //free memory 52 1 // I2C_Buffer = (u8*)malloc(sizeof(u8)*I2C_BUF_LENTH); 53 1 54 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */ C51 COMPILER V9.59.0.0 STC8A_I2C 06/10/2021 10:06:08 PAGE 2 55 1 } 56 57 //======================================================================== 58 // 函数: void Wait (void) 59 // 描述: 等待主机模式I2C控制器执行完成I2CMSCR. 60 // 参数: mode: 指定模式, 取值 I2C_Mode_Master 或 I2C_Mode_Slave. 61 // 返回: none. 62 // 版本: V1.0, 2012-11-22 63 //======================================================================== 64 void Wait() 65 { 66 1 while (!(I2CMSST & 0x40)); 67 1 I2CMSST &= ~0x40; 68 1 } 69 70 //======================================================================== 71 // 函数: void Start (void) 72 // 描述: I2C总线起始函数. 73 // 参数: none. 74 // 返回: none. 75 // 版本: V1.0, 2020-09-15 76 //======================================================================== 77 void Start() 78 { 79 1 I2CMSCR = 0x01; //发送START命令 80 1 Wait(); 81 1 } 82 83 //======================================================================== 84 // 函数: void SendData (char dat) 85 // 描述: I2C发送一个字节数据函数. 86 // 参数: 发送的数据. 87 // 返回: none. 88 // 版本: V1.0, 2020-09-15 89 //======================================================================== 90 void SendData(char dat) 91 { 92 1 I2CTXD = dat; //写数据到数据缓冲区 93 1 I2CMSCR = 0x02; //发送SEND命令 94 1 Wait(); 95 1 } 96 97 //======================================================================== 98 // 函数: void RecvACK (void) 99 // 描述: I2C获取ACK函数. 100 // 参数: none. 101 // 返回: none. 102 // 版本: V1.0, 2020-09-15 103 //======================================================================== 104 void RecvACK() 105 { 106 1 I2CMSCR = 0x03; //发送读ACK命令 107 1 Wait(); 108 1 } 109 110 //======================================================================== 111 // 函数: char RecvData (void) 112 // 描述: I2C读取一个字节数据函数. 113 // 参数: none. 114 // 返回: 读取数据. 115 // 版本: V1.0, 2020-09-15 116 //======================================================================== C51 COMPILER V9.59.0.0 STC8A_I2C 06/10/2021 10:06:08 PAGE 3 117 char RecvData() 118 { 119 1 I2CMSCR = 0x04; //发送RECV命令 120 1 Wait(); 121 1 return I2CRXD; 122 1 } 123 124 //======================================================================== 125 // 函数: void SendACK (void) 126 // 描述: I2C发送ACK函数. 127 // 参数: none. 128 // 返回: none. 129 // 版本: V1.0, 2020-09-15 130 //======================================================================== 131 void SendACK() 132 { 133 1 I2CMSST = 0x00; //设置ACK信号 134 1 I2CMSCR = 0x05; //发送ACK命令 135 1 Wait(); 136 1 } 137 138 //======================================================================== 139 // 函数: void SendNAK (void) 140 // 描述: I2C发送NAK函数. 141 // 参数: none. 142 // 返回: none. 143 // 版本: V1.0, 2020-09-15 144 //======================================================================== 145 void SendNAK() 146 { 147 1 I2CMSST = 0x01; //设置NAK信号 148 1 I2CMSCR = 0x05; //发送ACK命令 149 1 Wait(); 150 1 } 151 152 //======================================================================== 153 // 函数: void Stop (void) 154 // 描述: I2C总线停止函数. 155 // 参数: none. 156 // 返回: none. 157 // 版本: V1.0, 2020-09-15 158 //======================================================================== 159 void Stop() 160 { 161 1 I2CMSCR = 0x06; //发送STOP命令 162 1 Wait(); 163 1 } 164 165 //======================================================================== 166 // 函数: void I2C_WriteNbyte(u8 addr, u8 *p, u8 number) 167 // 描述: I2C写入数据函数. 168 // 参数: addr: 指定地址, *p写入数据存储位置, number写入数据个数. 169 // 返回: none. 170 // 版本: V1.0, 2020-09-15 171 //======================================================================== 172 void I2C_WriteNbyte(u8 addr, u8 *p, u8 number) /* WordAddress,First Data Address,Byte lenth */ 173 { 174 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */ 175 1 Start(); //发送起始命令 176 1 SendData(SLAW); //发送设备地址+写命令 177 1 RecvACK(); 178 1 SendData(addr); //发送存储地址 C51 COMPILER V9.59.0.0 STC8A_I2C 06/10/2021 10:06:08 PAGE 4 179 1 RecvACK(); 180 1 do 181 1 { 182 2 SendData(*p++); 183 2 RecvACK(); 184 2 } 185 1 while(--number); 186 1 Stop(); //发送停止命令 187 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */ 188 1 } 189 190 //======================================================================== 191 // 函数: void I2C_ReadNbyte(u8 addr, u8 *p, u8 number) 192 // 描述: I2C读取数据函数. 193 // 参数: addr: 指定地址, *p读取数据存储位置, number读取数据个数. 194 // 返回: none. 195 // 版本: V1.0, 2020-09-15 196 //======================================================================== 197 void I2C_ReadNbyte(u8 addr, u8 *p, u8 number) /* WordAddress,First Data Address,Byte lenth */ 198 { 199 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */ 200 1 Start(); //发送起始命令 201 1 SendData(SLAW); //发送设备地址+写命令 202 1 RecvACK(); 203 1 SendData(addr); //发送存储地址 204 1 RecvACK(); 205 1 Start(); //发送起始命令 206 1 SendData(SLAR); //发送设备地址+读命令 207 1 RecvACK(); 208 1 do 209 1 { 210 2 *p = RecvData(); 211 2 p++; 212 2 if(number != 1) SendACK(); //send ACK 213 2 } 214 1 while(--number); 215 1 SendNAK(); //send no ACK 216 1 Stop(); //发送停止命令 217 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */ 218 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 342 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = 8 ---- PDATA SIZE = ---- ---- DATA SIZE = ---- 10 IDATA SIZE = ---- ---- BIT SIZE = ---- ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)