C51 COMPILER V9.59.0.0 SPI 03/09/2021 14:04:13 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE SPI OBJECT MODULE PLACED IN .\list\spi.obj COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE spi.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\list\spi.lst) -TABS(2) OBJECT(.\list\spi.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 "spi.h" 14 15 u8 SPI_RxCnt; 16 u8 SPI_RxTimerOut; 17 u8 SPI_BUF_type SPI_RxBuffer[SPI_BUF_LENTH]; 18 bit B_SPI_Busy; //发送忙标志 19 20 21 //======================================================================== 22 // 函数: void SPI_Init(SPI_InitTypeDef *SPIx) 23 // 描述: SPI初始化程序. 24 // 参数: SPIx: 结构参数,请参考spi.h里的定义. 25 // 返回: none. 26 // 版本: V1.0, 2012-11-22 27 //======================================================================== 28 void SPI_Init(SPI_InitTypeDef *SPIx) 29 { 30 1 if(SPIx->SPI_SSIG == ENABLE) SPCTL &= ~(1<<7); //enable SS, conform Master or Slave by SS pin. 31 1 else SPCTL |= (1<<7); //disable SS, conform Master or Slave by SPI_Mode 32 1 if(SPIx->SPI_Module == ENABLE) SPCTL |= (1<<6); //SPI enable 33 1 else SPCTL &= ~(1<<6); //SPI disable 34 1 if(SPIx->SPI_FirstBit == SPI_LSB) SPCTL |= ~(1<<5); //LSB first 35 1 else SPCTL &= ~(1<<5); //MSB first 36 1 if(SPIx->SPI_Mode == SPI_Mode_Slave) SPCTL &= ~(1<<4); //slave 37 1 else SPCTL |= (1<<4); //master 38 1 if(SPIx->SPI_CPOL == SPI_CPOL_High) SPCTL |= (1<<3); //SCLK Idle High, Low Active. 39 1 else SPCTL &= ~(1<<3); //SCLK Idle Low, High Active. 40 1 if(SPIx->SPI_CPHA == SPI_CPHA_2Edge) SPCTL |= (1<<2); //sample at the second edge 41 1 else SPCTL &= ~(1<<2); //sample at the first edge 42 1 if(SPIx->SPI_Interrupt == ENABLE) IE2 |= (1<<1); 43 1 else IE2 &= ~(1<<1); 44 1 SPCTL = (SPCTL & ~3) | (SPIx->SPI_Speed & 3); //set speed 45 1 P_SW1 = (P_SW1 & ~(3<<2)) | SPIx->SPI_IoUse; 46 1 47 1 SPI_RxTimerOut = 0; 48 1 B_SPI_Busy = 0; 49 1 } 50 51 //======================================================================== 52 // 函数: void SPI_SetMode(u8 mode) 53 // 描述: SPI设置主从模式函数. 54 // 参数: mode: 指定模式, 取值 SPI_Mode_Master 或 SPI_Mode_Slave. C51 COMPILER V9.59.0.0 SPI 03/09/2021 14:04:13 PAGE 2 55 // 返回: none. 56 // 版本: V1.0, 2012-11-22 57 //======================================================================== 58 void SPI_SetMode(u8 mode) 59 { 60 1 if(mode == SPI_Mode_Slave) 61 1 { 62 2 SPCTL &= ~(1<<4); //重新设置为从机待机 63 2 SPCTL &= ~(1<<7); //SS引脚确定主从 64 2 } 65 1 else 66 1 { 67 2 SPCTL |= (1<<4); //使能 SPI 主机模式 68 2 SPCTL |= (1<<7); //忽略SS引脚功能 69 2 } 70 1 } 71 72 73 //======================================================================== 74 // 函数: void SPI_WriteByte(u8 dat) 75 // 描述: SPI发送一个字节数据. 76 // 参数: dat: 要发送的值. 77 // 返回: none. 78 // 版本: V1.0, 2020-09-14 79 //======================================================================== 80 void SPI_WriteByte(u8 dat) //SPI发送一个字节数据 81 { 82 1 SPDAT = dat; 83 1 B_SPI_Busy = 1; 84 1 while(B_SPI_Busy) ; 85 1 } 86 87 88 //======================================================================== 89 // 函数: void SPI_Transivion (void) interrupt SPI_VECTOR 90 // 描述: SPI中断函数. 91 // 参数: none. 92 // 返回: none. 93 // 版本: V1.0, 2012-11-22 94 //======================================================================== 95 void SPI_Transivion (void) interrupt SPI_VECTOR 96 { 97 1 if(SPCTL & 0x10) //主机模式 98 1 { 99 2 B_SPI_Busy = 0; 100 2 } 101 1 else //从机模式 102 1 { 103 2 if(SPI_RxCnt >= SPI_BUF_LENTH) SPI_RxCnt = 0; 104 2 SPI_RxBuffer[SPI_RxCnt++] = SPDAT; 105 2 SPI_RxTimerOut = 5; 106 2 } 107 1 SPSTAT = SPIF + WCOL; //清0 SPIF和WCOL标志 108 1 } 109 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 250 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = 128 ---- PDATA SIZE = ---- ---- C51 COMPILER V9.59.0.0 SPI 03/09/2021 14:04:13 PAGE 3 DATA SIZE = 2 ---- IDATA SIZE = ---- ---- BIT SIZE = 1 ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)