📄 eep_040.lst
字号:
151 1 return WORD;
152 1 }
153
154
155 //------------------------------------------------------------------------------------
156 // Interrupt Service Routine
157 //------------------------------------------------------------------------------------
158
159
160 // SMBus interrupt service routine:
161
162 void SMBUS_ISR (void) interrupt 7
163 {
164 1 switch (SMB0STA){ // Status code for the SMBus (SMB0STA register)
165 2
166 2 // Master Transmitter/Receiver: START condition transmitted.
167 2 // The R/W bit of the COMMAND word sent after this state will
168 2 // always be a zero (W) because for both read and write,
169 2 // the memory address must be written first.
170 2 case SMB_START:
171 2 SFRPAGE = SMB0_PAGE;
172 2 SMB0DAT = (COMMAND & 0xFE); // Load address of the slave to be accessed.
173 2 STA = 0; // Manually clear START bit
174 2 break;
175 2
176 2 // Master Transmitter/Receiver: Repeated START condition transmitted.
177 2 // This state should only occur during a read, after the memory address has been
178 2 // sent and acknowledged.
179 2 case SMB_RP_START:
C51 COMPILER V7.50 EEP_040 12/06/2006 11:04:37 PAGE 4
180 2 SFRPAGE = SMB0_PAGE;
181 2 SMB0DAT = COMMAND; // COMMAND should hold slave address + R.
182 2 STA = 0;
183 2 break;
184 2
185 2 // Master Transmitter: Slave address + WRITE transmitted. ACK received.
186 2 // case SMB_MTADDACK:
187 2 // SFRPAGE = SMB0_PAGE;
188 2
189 2 // SMB0DAT = LOW_ADD; // Load high byte of memory address
190 2 // to be written.
191 2 // break;
192 2
193 2 // Master Transmitter: Slave address + WRITE transmitted. NACK received.
194 2 // The slave is not responding. Send a STOP followed by a START to try again.
195 2 case SMB_MTADDNACK:
196 2 SFRPAGE = SMB0_PAGE;
197 2 STO = 1;
198 2 STA = 1;
199 2 break;
200 2
201 2 // Master Transmitter: Data byte transmitted. ACK received.
202 2 // This state is used in both READ and WRITE operations. Check BYTE_NUMBER
203 2 // for memory address status - if only HIGH_ADD has been sent, load LOW_ADD.
204 2 // If LOW_ADD has been sent, check COMMAND for R/W value to determine
205 2 // next state.
206 2 case SMB_MTDBACK:
207 2 switch (BYTE_NUMBER){
208 3 case 2: // If BYTE_NUMBER=2, only HIGH_ADD
209 3 SMB0DAT = LOW_ADD; // has been sent.
210 3 BYTE_NUMBER--; // Decrement for next time around.
211 3 break;
212 3 case 1: // If BYTE_NUMBER=1, LOW_ADD was just sent.
213 3 if (COMMAND & 0x01){ // If R/W=READ, sent repeated START.
214 4 SFRPAGE = SMB0_PAGE;
215 4 STO = 0;
216 4 STA = 1;
217 4
218 4 } else {
219 4 SFRPAGE = SMB0_PAGE;
220 4 SMB0DAT = WORD; // If R/W=WRITE, load byte to write.
221 4 BYTE_NUMBER--;
222 4 }
223 3 break;
224 3 default: // If BYTE_NUMBER=0, transfer is finished.
225 3 SFRPAGE = SMB0_PAGE;
226 3
227 3 STO = 1;
228 3 SM_BUSY = 0; // Free SMBus
229 3 }
230 2 break;
231 2
232 2
233 2 // Master Transmitter: Data byte transmitted. NACK received.
234 2 // Slave not responding. Send STOP followed by START to try again.
235 2 case SMB_MTDBNACK:
236 2 SFRPAGE = SMB0_PAGE;
237 2 STO = 1;
238 2 STA = 1;
239 2 break;
240 2
241 2 // Master Transmitter: Arbitration lost.
C51 COMPILER V7.50 EEP_040 12/06/2006 11:04:37 PAGE 5
242 2 // Should not occur. If so, restart transfer.
243 2 case SMB_MTARBLOST:
244 2 SFRPAGE = SMB0_PAGE;
245 2 STO = 1;
246 2 STA = 1;
247 2 break;
248 2
249 2 // Master Receiver: Slave address + READ transmitted. ACK received.
250 2 // Set to transmit NACK after next transfer since it will be the last (only)
251 2 // byte.
252 2 case SMB_MRADDACK:
253 2 SFRPAGE = SMB0_PAGE;
254 2 AA = 0; // NACK sent on acknowledge cycle.
255 2 break;
256 2
257 2 // Master Receiver: Slave address + READ transmitted. NACK received.
258 2 // Slave not responding. Send repeated start to try again.
259 2 case SMB_MRADDNACK:
260 2 SFRPAGE = SMB0_PAGE;
261 2 STO = 0;
262 2 STA = 1;
263 2 break;
264 2
265 2 // Data byte received. ACK transmitted.
266 2 // State should not occur because AA is set to zero in previous state.
267 2 // Send STOP if state does occur.
268 2 case SMB_MRDBACK:
269 2 SFRPAGE = SMB0_PAGE;
270 2 STO = 1;
271 2 SM_BUSY = 0;
272 2 break;
273 2
274 2 // Data byte received. NACK transmitted.
275 2 // Read operation has completed. Read data register and send STOP.
276 2 case SMB_MRDBNACK:
277 2 SFRPAGE = SMB0_PAGE;
278 2 WORD = SMB0DAT;
279 2 STO = 1;
280 2 SM_BUSY = 0; // Free SMBus
281 2 break;
282 2
283 2 // All other status codes meaningless in this application. Reset communication.
284 2 default:
285 2 SFRPAGE = SMB0_PAGE;
286 2 STO = 1; // Reset communication.
287 2 SM_BUSY = 0;
288 2 break;
289 2 }
290 1
291 1 SI=0; // clear interrupt flag
292 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 354 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 1
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILER V7.50 EEP_040 12/06/2006 11:04:37 PAGE 6
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -