C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 1 C51 COMPILER V9.01, COMPILATION OF MODULE TWI OBJECT MODULE PLACED IN .\output\TWI.obj COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_drv\TWI.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore_Load.OR -C) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage;.\code_classb\iec60730_lib\include;.\code_c -lassb\iec60730_proc\Include;.\code_classb\config) DEBUG OBJECTEXTEND PRINT(.\output\TWI.lst) OBJECT(.\output\TWI.obj) line level source 1 /******************************************************************************** 2 Copyright (C), Sinowealth Electronic. Ltd. 3 Author: Sino 4 Version: V0.0 5 Date: 2020/04/26 6 History: 7 V2.0 2020/04/26 Preliminary 8 ********************************************************************************/ 9 #include "Main.h" 10 11 #ifdef TWI_Hardware_Module 12 13 U8 code CRC8Table[256]= 14 { //120424-1 CRC Table 15 0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D, 16 0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D, 17 0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD, 18 0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD, 19 0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA, 20 0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A, 21 0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A, 22 0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A, 23 0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4, 24 0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4, 25 0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44, 26 0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34, 27 0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63, 28 0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13, 29 0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83, 30 0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3 31 }; 32 /************************************************************************************************* 33 * 函数名: CRC8cal 34 * 参 数: *p:数据指针;counter:所需计算的长度 35 * 返回值: 无 36 * 描 述: CRC8就散 37 *************************************************************************************************/ 38 U8 CRC8cal(U8 *p, U8 counter) //look-up table calculte CRC 39 { 40 1 U8 crc8 = 0; 41 1 42 1 for( ; counter > 0; counter--) 43 1 { 44 2 crc8 = CRC8Table[crc8^*p]; 45 2 p++; 46 2 } 47 1 return(crc8); 48 1 } 49 50 51 52 53 /************************************************************************************************* C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 2 54 * 函数名: TWICheckStatus 55 * 参 数: Status:当前TWI的状态 56 * 返回值: 无 57 * 描 述: 检测TWI的各个状态是否正常 58 *************************************************************************************************/ 59 BOOL TWICheckStatus(U8 Status) 60 { 61 1 BOOL Result = 1; 62 1 U16 timeoutcount = 48000; //硬件IIC时timeoutcount大于100可正常通讯,软件IIC建议保持原值 (标准DEMO板 -) 63 1 64 1 while((TWICON&0x08)==0) //等待TWI通讯结束 65 1 { 66 2 McuWDTClear(); //清除看门狗 67 2 if(timeoutcount) 68 2 { 69 3 timeoutcount--; 70 3 } 71 2 else 72 2 { 73 3 break; 74 3 } 75 2 } 76 1 if((TWISTA&0xf8) != Status) 77 1 { 78 2 Result = 0; //Error 79 2 } 80 1 81 1 return Result; 82 1 } 83 84 85 86 87 /************************************************************************************************* 88 * 函数名: TwiWrite 89 * 参 数: SlaveID: Slave ID 90 WrAddr: 写入地址 91 AddrType:地址长度,0:长度为1Byte;1:长度为2Bytes 92 Length: 数据长度(不含CRC字节) 93 CrcFlg: Twi通讯是否支持CRC校验,0:不支持CRC,1:支持CRC 94 *WrBuf: 写入数据存放地址 95 * 返回值: 无 96 * 描 述: Twi写入操作,包括写入AFE(支持CRC)、RTC和EEPROM(地址长度为2Bytes) 97 *************************************************************************************************/ 98 BOOL TwiWrite(U8 SlaveID, U16 WrAddr, U8 AddrType, U8 Length, U8 CrcFlg, U8 xdata *WrBuf) 99 { 100 1 U8 i; 101 1 U8 TempBuf[4]; 102 1 BOOL Result = 1; 103 1 U16 timeoutcount = 48000; 104 1 105 1 TempBuf[0] = SlaveID; 106 1 TempBuf[1] = (U8)WrAddr; 107 1 TempBuf[2] = *WrBuf; 108 1 TempBuf[3] = CRC8cal(TempBuf, 3); 109 1 110 1 if(Length > 0) 111 1 { 112 2 HTimeoutChk(); 113 2 TWICON = 0x60; //Start 114 2 if((!TWICheckStatus(0x08))&&(!TWICheckStatus(0x10))) C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 3 115 2 { 116 3 Result = 0; 117 3 goto WrErr; 118 3 } 119 2 120 2 TWIDAT = SlaveID; //Slave地址 121 2 TWICON = 0x40; 122 2 if(!TWICheckStatus(0x18)) 123 2 { 124 3 Result = 0; 125 3 goto WrErr; 126 3 } 127 2 128 2 if(AddrType == TWI_ADDR_2B) 129 2 { 130 3 TWIDAT = (U8)(WrAddr>>8); //写寄存器高字节地址-仅针对外挂EEPROM 131 3 TWICON = 0x40; 132 3 if(!TWICheckStatus(0x28)) 133 3 { 134 4 Result = 0; 135 4 goto WrErr; 136 4 } 137 3 } 138 2 139 2 TWIDAT = (U8)WrAddr; //写寄存器地址 140 2 TWICON = 0x40; 141 2 if(!TWICheckStatus(0x28)) 142 2 { 143 3 Result = 0; 144 3 goto WrErr; 145 3 } 146 2 147 2 if(CrcFlg == TWI_CRC_YES) //如果是写AFE寄存器,则固定写一个字节+CRC 148 2 { 149 3 TWIDAT = *WrBuf; //Write Data 150 3 TWICON = 0x40; 151 3 if(!TWICheckStatus(0x28)) 152 3 { 153 4 Result = 0; 154 4 goto WrErr; 155 4 } 156 3 157 3 TWIDAT = TempBuf[3]; //Write CRC 158 3 TWICON = 0x40; 159 3 if(!TWICheckStatus(0x28)) 160 3 { 161 4 Result = 0; 162 4 goto WrErr; 163 4 } 164 3 } 165 2 else //写EEPROM和RTC 166 2 { 167 3 for(i=0; i 0) 224 1 { 225 2 HTimeoutChk(); 226 2 TWICON = 0x60; //Start 227 2 if((!TWICheckStatus(0x08))&&(!TWICheckStatus(0x10))) 228 2 { 229 3 Result = 0; 230 3 goto RdErr; 231 3 } 232 2 233 2 TWIDAT = SlaveID; //发送Slave写地址 234 2 TWICON = 0x40; 235 2 if(!TWICheckStatus(0x18)) 236 2 { 237 3 Result = 0; 238 3 goto RdErr; C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 5 239 3 } 240 2 241 2 if(AddrType == TWI_ADDR_2B) //地址为2Bytes 242 2 { 243 3 TWIDAT = (U8)(RdAddr>>8); //读寄存器高字节地址-仅针对外挂EEPROM 244 3 TWICON = 0x40; 245 3 if(!TWICheckStatus(0x28)) 246 3 { 247 4 Result = 0; 248 4 goto RdErr; 249 4 } 250 3 } 251 2 252 2 TWIDAT = (U8)RdAddr; //发送寄存器低字节地址 253 2 TWICON = 0x40; 254 2 if(!TWICheckStatus(0x28)) 255 2 { 256 3 Result = 0; 257 3 goto RdErr; 258 3 } 259 2 260 2 // if(SlaveID != AFE_ID) 261 2 // { 262 2 // TWIDAT = Length; //发送读取数据长度 263 2 // TWICON = 0x40; 264 2 // if(!TWICheckStatus(0x28)) 265 2 // { 266 2 // Result = 0; 267 2 // goto RdErr; 268 2 // } 269 2 // } 270 2 271 2 TWICON = 0x60; //发送RStart 272 2 if((!TWICheckStatus(0x08))&&(!TWICheckStatus(0x10))) 273 2 { 274 3 Result = 0; 275 3 goto RdErr; 276 3 } 277 2 278 2 TWIDAT = SlaveID|0x01; //发送Slave读地址 279 2 TWICON = 0x40; 280 2 if(!TWICheckStatus(0x40)) 281 2 { 282 3 Result = 0; 283 3 goto RdErr; 284 3 } 285 2 286 2 for(i=0; i= 10)&&(TWI_FREQ_KHz <= 400)) 375 1 // { 376 1 // #if TWIBR1 < 256 377 1 // TWIBR = TWIBR1; 378 1 // TWISTA |= 0x06; 379 1 // #elif TWIBR2 < 256 380 1 // TWIBR = TWIBR2; 381 1 // TWISTA |= 0x04; 382 1 // #elif TWIBR3 < 256 383 1 // TWIBR = TWIBR3; 384 1 // TWISTA |= 0x02; 385 1 // #elif TWIBR4 < 256 386 1 // TWIBR = TWIBR4; 387 1 // TWISTA |= 0x00; 388 1 // #endif 389 1 // } 390 1 // #else 391 1 // { 392 1 // #error: "Please enter a number(TWI_FREQ_KHz) from 10 to 400!"; 393 1 // } 394 1 // 395 1 // #endif 396 1 397 1 TWICON = 0x40; //ENTWI ,禁止高电平超时 398 1 TWTFREE = 0xff; //最大超时配置 399 1 TWIDAT = 0x00; 400 1 } 401 402 403 //void TwiInit(void) 404 //{ 405 // U16 i,k; 406 // U8 j; 407 // TWICR = 0x32; //默认配置:SCL--P0.5;SDA--P0.4 408 // TWITOUT = 0x00; //外部有上拉电阻,故芯片内部上拉不用使能 409 // i = (24000/TWI_FREQ_KHz-16)/2; //配置发送波特率,禁止总线超时判断,f=fsys/(16+2*CR*TWIBR)=24 -MHz/(16+2*16*TWIBR)=**KHz 410 // for(j=1;j<4;j++) 411 // { 412 // k =1<<(2*j-2); 413 // if(i / k <= 255) 414 // { 415 // TWIBR = i / k; 416 // switch (j) 417 // { 418 // case 1: 419 // TWISTA = 0x00; 420 // break; 421 // C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 8 422 // case 2: 423 // TWISTA = 0x02; 424 // break; 425 // 426 // case 3: 427 // TWISTA = 0x04; 428 // break; 429 // 430 // case 4: 431 // TWISTA = 0x06; 432 // break; 433 // } 434 // goto loop; 435 // } 436 // } 437 //loop: 438 //// TWISTA = 0x06; //16分频 439 // TWICON = 0x40; //ENTWI ,禁止高电平超时 440 // TWTFREE = 0xff; //最大超时配置 441 // TWIDAT = 0x00; 442 //} 443 444 #endif MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 858 ---- CONSTANT SIZE = 256 ---- XDATA SIZE = ---- 72 PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- 3 END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)