C51 COMPILER V7.05 EVENTLOOP 03/14/2005 09:10:54 PAGE 1 C51 COMPILER V7.05, COMPILATION OF MODULE EVENTLOOP OBJECT MODULE PLACED IN eventloop.OBJ COMPILER INVOKED BY: C:\Disk2\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe eventloop.c DB OE stmt level source 1 //----------------------------------------------------------------------------- 2 // bounce.c 3 //----------------------------------------------------------------------------- 4 //----------------------------------------------------------------------------- 5 // Includes 6 //----------------------------------------------------------------------------- 7 #include 8 #include 9 #include "USB_API.h" 10 11 // Command codes. 12 // NB: The same codes are used between USB host and MCU and between SPISlave and MCU 13 14 enum { 15 Data = 0x1, 16 DataAcknowledge = 0x2, 17 Status = 0x3, 18 StatusRequest = 0x4, 19 FlushRequest = 0x5, 20 PacketRequest = 0x6, 21 GenerateLHCbEvent = 0x7, 22 P12Write = 0x8, 23 P12Read = 0x9, 24 GenerateALICEEvent = 0xa, 25 ResetRequest = 0xb, 26 ConfigurationData = 0xc, 27 Idle = 0xa5, 28 Idle2 = 0x25 29 }; 30 31 typedef struct devicePacket_t 32 { 33 unsigned char cmd; 34 unsigned char dummy; 35 unsigned short length; 36 unsigned char cdata[64]; 37 } devicePacket_t; 38 39 //----------------------------------------------------------------------------- 40 // Global CONSTANTS 41 //----------------------------------------------------------------------------- 42 43 sbit Led1 = P2^2; // LED='1' means OFF 44 sbit Led2 = P2^3; 45 sbit SPISlaveResetIn_b = P0^3; // ='1' when slave is ready 46 sbit SPISlaveResetOut = P0^6; // Assert to reset slave 47 48 unsigned short nByte; 49 unsigned short nPacket; 50 unsigned short resetRequest = 0; 51 devicePacket_t packet; 52 unsigned short L1Count = 0; 53 unsigned short L1CountLast = 0; 54 55 void SPI0_Init(void); C51 COMPILER V7.05 EVENTLOOP 03/14/2005 09:10:54 PAGE 2 56 57 //----------------------------------------------------------------------------- 58 // Main Routine 59 //----------------------------------------------------------------------------- 60 void main(void) 61 { 62 1 unsigned short i,status_cnt; 63 1 unsigned rc; 64 1 BYTE sdata; 65 1 66 1 PCA0MD &= ~0x40; // Disable Watchdog timer 67 1 68 1 69 1 OSCICN |= 0x3; // System clock divide. Set for fastest system clock speed. 70 1 71 1 SPI0_Init(); 72 1 73 1 IT01CF = 0x0c; // P0.4 INT0, active high 74 1 IT0 = 0; 75 1 // INT0 type: 0=level 1=edge sensitive 76 1 P0MDIN = 0xFF; // P0.0-7 set digital input 77 1 P0MDOUT = 0x45; // P0.0,2,6 set push-pull (SCK,MOSI,ResetOut) 78 1 P0 = ~0x45; // Open-drain outputs set high impedance 79 1 P1MDIN = 0xFF; // P1.0-7 set digital input 80 1 P1MDOUT = 0xFF; // P1.0-7 set push-pull 81 1 P1 = 0x00; // P1.0-7 set low 82 1 P2MDIN = 0xFF; // P2.0-7 set digital input 83 1 P2MDOUT = 0x0C; // P2.2,3 set push-pull (LEDs) 84 1 P2 = ~0x0C; // Open-drain outputs set high impedance 85 1 86 1 XBR0 = 0x02; // Enable SPI IO 87 1 XBR1 = 0x40; // Enable Crossbar 88 1 89 1 Led1 = 1; 90 1 Led2 = 1; 91 1 SPISlaveResetOut = 0; 92 1 93 1 while ( SPISlaveResetIn_b == 0 ) ; // Wait until the slave is ready 94 1 95 1 // Continuous transaction loop 96 1 97 1 while ( 1 ) 98 1 { 99 2 100 2 // Led2 = 1; 101 2 102 2 SPIF = 0; 103 2 104 2 resetRequest = 0; 105 2 SPISlaveResetOut = 1; 106 2 while ( SPISlaveResetIn_b == 1 ) ; // Wait until the slave is reset 107 2 SPISlaveResetOut = 0; 108 2 while ( SPISlaveResetIn_b == 0 ) ; // Wait until the slave is ready 109 2 110 2 while ( resetRequest == 0 ) 111 2 // for ( i = 0; i<1000 ; i ++ ) 112 2 { 113 3 114 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 115 3 // Send event generate request 116 3 SPI0DAT = GenerateLHCbEvent; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 117 3 // Send Idle (give time for event to be buffered C51 COMPILER V7.05 EVENTLOOP 03/14/2005 09:10:54 PAGE 3 118 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 119 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 120 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 121 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 122 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 123 3 // Send flush request 124 3 125 3 SPI0DAT = FlushRequest; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 126 3 // Send Idle to allow flush setup to complete 127 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 128 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 129 3 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 130 3 131 3 for ( nPacket=0; nPacket<10; nPacket++ ) 132 3 { 133 4 134 4 // Send packet request 135 4 SPI0DAT = PacketRequest; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 136 4 137 4 // Wait for packet 138 4 Led2 = 1; 139 4 while ( sdata != Data ) 140 4 { 141 5 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 142 5 } 143 4 Led2 = 0; 144 4 // Receive the 64-byte packet 145 4 146 4 for ( nByte=0; nByte < 64; nByte++ ) // Get the data packet 147 4 { 148 5 SPI0DAT = Idle; while ( SPIF == 0 ); 149 5 packet.cdata[nByte] = SPI0DAT; // Read the byte from slave 150 5 SPIF = 0; // Reset the interrupt flag 151 5 } 152 4 // P1 = nPacket & 0xff; 153 4 154 4 if ( nPacket == 0 ) 155 4 { 156 5 P1 = packet.cdata[0]; 157 5 L1Count = packet.cdata[0]; 158 5 Led1 = 1; 159 5 if ( L1Count != ((L1CountLast + 1)&0xff) ) 160 5 { 161 6 Led1 = 0; 162 6 break; 163 6 } 164 5 L1CountLast = L1Count; 165 5 } 166 4 167 4 168 4 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 169 4 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 170 4 SPI0DAT = Idle; while ( SPIF == 0 ); sdata = SPI0DAT; SPIF = 0; 171 4 } 172 3 173 3 // while (1); 174 3 // resetRequest = 1; 175 3 176 3 } 177 2 // while (1); 178 2 } 179 1 C51 COMPILER V7.05 EVENTLOOP 03/14/2005 09:10:54 PAGE 4 180 1 } *** WARNING C280 IN LINE 62 OF EVENTLOOP.C: 'i': unreferenced local variable *** WARNING C280 IN LINE 62 OF EVENTLOOP.C: 'status_cnt': unreferenced local variable *** WARNING C280 IN LINE 63 OF EVENTLOOP.C: 'rc': unreferenced local variable 181 182 // SPI0_Init 183 184 void SPI0_Init(void) 185 { 186 1 SPI0CFG = 0x40; // MSTEN=1, CKPHA=0, CKPOL=0 187 1 SPI0CKR = 0x1; // SPI clock rate 188 1 ESPI0 = 0; // Disable SPI0 interrupt (we do not use it) 189 1 SPI0CN = 0x1; // Enable 190 1 } 191 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 384 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 78 7 IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 3 WARNING(S), 0 ERROR(S)