📄 stm8s_i2c.ls
字号:
1 ; C Compiler for STM8 (COSMIC Software)
2 ; Generator V4.2.8 - 03 Dec 2008
3 ; Optimizer V4.2.8 - 03 Dec 2008
33 ; 64 void I2C_DeInit(void)
33 ; 65 {
35 switch .text
36 0000 _I2C_DeInit:
40 ; 66 I2C->CR1 = I2C_CR1_RESET_VALUE;
42 0000 725f5210 clr 21008
43 ; 67 I2C->CR2 = I2C_CR2_RESET_VALUE;
45 0004 725f5211 clr 21009
46 ; 68 I2C->FREQR = I2C_FREQR_RESET_VALUE;
48 0008 725f5212 clr 21010
49 ; 69 I2C->OARL = I2C_OARL_RESET_VALUE;
51 000c 725f5213 clr 21011
52 ; 70 I2C->OARH = I2C_OARH_RESET_VALUE;
54 0010 725f5214 clr 21012
55 ; 71 I2C->ITR = I2C_ITR_RESET_VALUE;
57 0014 725f521a clr 21018
58 ; 72 I2C->CCRL = I2C_CCRL_RESET_VALUE;
60 0018 725f521b clr 21019
61 ; 73 I2C->CCRH = I2C_CCRH_RESET_VALUE;
63 001c 725f521c clr 21020
64 ; 74 I2C->TRISER = I2C_TRISER_RESET_VALUE;
66 0020 3502521d mov 21021,#2
67 ; 75 }
70 0024 81 ret
249 .const: section .text
250 0000 L01:
251 0000 000186a1 dc.l 100001
252 0004 L21:
253 0004 000f4240 dc.l 1000000
254 ; 99 void I2C_Init(u32 OutputClockFrequencyHz, u16 OwnAddress, I2C_DutyCycle_TypeDef DutyCycle, I2C_Ack_TypeDef Ack, I2C_AddMode_TypeDef AddMode, u8 InputClockFrequencyMHz )
254 ; 100 {
255 switch .text
256 0025 _I2C_Init:
258 0025 5209 subw sp,#9
259 00000009 OFST: set 9
262 ; 101 u16 result = 0x0004;
264 ; 102 u16 tmpval = 0;
266 ; 103 u8 tmpccrh = 0;
268 0027 0f07 clr (OFST-2,sp)
269 ; 106 assert_param(IS_I2C_ACK_OK(Ack));
271 ; 107 assert_param(IS_I2C_ADDMODE_OK(AddMode));
273 ; 108 assert_param(IS_I2C_OWN_ADDRESS_OK(OwnAddress));
275 ; 109 assert_param(IS_I2C_INPUT_CLOCK_FREQ_OK(InputClockFrequencyMHz));
277 ; 110 assert_param(IS_I2C_OUTPUT_CLOCK_FREQ_OK(OutputClockFrequencyHz));
279 ; 115 I2C->FREQR &= (u8)(~I2C_FREQR_FREQ);
281 0029 c65212 ld a,21010
282 002c a4c0 and a,#192
283 002e c75212 ld 21010,a
284 ; 117 I2C->FREQR |= InputClockFrequencyMHz;
286 0031 c65212 ld a,21010
287 0034 1a15 or a,(OFST+12,sp)
288 0036 c75212 ld 21010,a
289 ; 121 I2C->CR1 &= (u8)(~I2C_CR1_PE);
291 0039 72115210 bres 21008,#0
292 ; 124 I2C->CCRH &= (u8)(~(I2C_CCRH_FS | I2C_CCRH_DUTY | I2C_CCRH_CCR));
294 003d c6521c ld a,21020
295 0040 a430 and a,#48
296 0042 c7521c ld 21020,a
297 ; 125 I2C->CCRL &= (u8)(~I2C_CCRL_CCR);
299 0045 725f521b clr 21019
300 ; 128 if (OutputClockFrequencyHz > I2C_MAX_STANDARD_FREQ) /* FAST MODE */
302 0049 96 ldw x,sp
303 004a 1c000c addw x,#OFST+3
304 004d cd0000 call c_ltor
306 0050 ae0000 ldw x,#L01
307 0053 cd0000 call c_lcmp
309 0056 257c jrult L131
310 ; 131 tmpccrh = I2C_CCRH_FS;
312 0058 a680 ld a,#128
313 005a 6b07 ld (OFST-2,sp),a
314 ; 133 if (DutyCycle == I2C_DUTYCYCLE_2)
316 005c 96 ldw x,sp
317 005d 0d12 tnz (OFST+9,sp)
318 005f 262b jrne L331
319 ; 136 result = (u16) ((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz * 3));
321 0061 1c000c addw x,#OFST+3
322 0064 cd0000 call c_ltor
324 0067 a603 ld a,#3
325 0069 cd0000 call c_smul
327 006c 96 ldw x,sp
328 006d 5c incw x
329 006e cd0000 call c_rtol
331 0071 7b15 ld a,(OFST+12,sp)
332 0073 b703 ld c_lreg+3,a
333 0075 3f02 clr c_lreg+2
334 0077 3f01 clr c_lreg+1
335 0079 3f00 clr c_lreg
336 007b ae0004 ldw x,#L21
337 007e cd0000 call c_lmul
339 0081 96 ldw x,sp
340 0082 5c incw x
341 0083 cd0000 call c_ludv
343 0086 be02 ldw x,c_lreg+2
344 0088 1f08 ldw (OFST-1,sp),x
346 008a 202f jra L531
347 008c L331:
348 ; 141 result = (u16) ((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz * 25));
350 008c 1c000c addw x,#OFST+3
351 008f cd0000 call c_ltor
353 0092 a619 ld a,#25
354 0094 cd0000 call c_smul
356 0097 96 ldw x,sp
357 0098 5c incw x
358 0099 cd0000 call c_rtol
360 009c 7b15 ld a,(OFST+12,sp)
361 009e b703 ld c_lreg+3,a
362 00a0 3f02 clr c_lreg+2
363 00a2 3f01 clr c_lreg+1
364 00a4 3f00 clr c_lreg
365 00a6 ae0004 ldw x,#L21
366 00a9 cd0000 call c_lmul
368 00ac 96 ldw x,sp
369 00ad 5c incw x
370 00ae cd0000 call c_ludv
372 00b1 be02 ldw x,c_lreg+2
373 00b3 1f08 ldw (OFST-1,sp),x
374 ; 143 tmpccrh |= I2C_CCRH_DUTY;
376 00b5 7b07 ld a,(OFST-2,sp)
377 00b7 aa40 or a,#64
378 00b9 6b07 ld (OFST-2,sp),a
379 00bb L531:
380 ; 147 if (result < (u16)0x01)
382 00bb 1e08 ldw x,(OFST-1,sp)
383 00bd 2603 jrne L731
384 ; 150 result = (u16)0x0001;
386 00bf 5c incw x
387 00c0 1f08 ldw (OFST-1,sp),x
388 00c2 L731:
389 ; 156 tmpval = ((InputClockFrequencyMHz * 3) / 10) + 1;
391 00c2 7b15 ld a,(OFST+12,sp)
392 00c4 97 ld xl,a
393 00c5 a603 ld a,#3
394 00c7 42 mul x,a
395 00c8 a60a ld a,#10
396 00ca cd0000 call c_sdivx
398 00cd 5c incw x
399 00ce 1f05 ldw (OFST-4,sp),x
400 ; 157 I2C->TRISER = (u8)tmpval;
402 00d0 7b06 ld a,(OFST-3,sp)
404 00d2 2038 jra L141
405 00d4 L131:
406 ; 164 result = (u16)((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz << (u8)1));
408 00d4 96 ldw x,sp
409 00d5 1c000c addw x,#OFST+3
410 00d8 cd0000 call c_ltor
412 00db 3803 sll c_lreg+3
413 00dd 3902 rlc c_lreg+2
414 00df 3901 rlc c_lreg+1
415 00e1 96 ldw x,sp
416 00e2 3900 rlc c_lreg
417 00e4 5c incw x
418 00e5 cd0000 call c_rtol
420 00e8 7b15 ld a,(OFST+12,sp)
421 00ea b703 ld c_lreg+3,a
422 00ec 3f02 clr c_lreg+2
423 00ee 3f01 clr c_lreg+1
424 00f0 3f00 clr c_lreg
425 00f2 ae0004 ldw x,#L21
426 00f5 cd0000 call c_lmul
428 00f8 96 ldw x,sp
429 00f9 5c incw x
430 00fa cd0000 call c_ludv
432 00fd be02 ldw x,c_lreg+2
433 ; 167 if (result < (u16)0x0004)
435 00ff a30004 cpw x,#4
436 0102 2403 jruge L341
437 ; 170 result = (u16)0x0004;
439 0104 ae0004 ldw x,#4
440 0107 L341:
441 0107 1f08 ldw (OFST-1,sp),x
442 ; 176 I2C->TRISER = (u8)(InputClockFrequencyMHz + 1);
444 0109 7b15 ld a,(OFST+12,sp)
445 010b 4c inc a
446 010c L141:
447 010c c7521d ld 21021,a
448 ; 181 I2C->CCRL = (u8)result;
450 010f 7b09 ld a,(OFST+0,sp)
451 0111 c7521b ld 21019,a
452 ; 182 I2C->CCRH = (u8)(((u8)(result >> 8) & I2C_CCRH_CCR) | tmpccrh);
454 0114 7b08 ld a,(OFST-1,sp)
455 0116 a40f and a,#15
456 0118 1a07 or a,(OFST-2,sp)
457 011a c7521c ld 21020,a
458 ; 185 I2C->CR1 |= I2C_CR1_PE;
460 011d 72105210 bset 21008,#0
461 ; 188 I2C_AcknowledgeConfig(Ack);
463 0121 7b13 ld a,(OFST+10,sp)
464 0123 ad6f call _I2C_AcknowledgeConfig
466 ; 191 I2C->OARL = (u8)(OwnAddress);
468 0125 7b11 ld a,(OFST+8,sp)
469 0127 c75213 ld 21011,a
470 ; 192 I2C->OARH = (u8)((u8)AddMode |
470 ; 193 I2C_OARH_ADDCONF |
470 ; 194 (u8)((OwnAddress & (u16)0x0300) >> (u8)7));
472 012a 7b10 ld a,(OFST+7,sp)
473 012c a403 and a,#3
474 012e 97 ld xl,a
475 012f 4f clr a
476 0130 02 rlwa x,a
477 0131 a607 ld a,#7
478 0133 L61:
479 0133 54 srlw x
480 0134 4a dec a
481 0135 26fc jrne L61
482 0137 9f ld a,xl
483 0138 6b04 ld (OFST-5,sp),a
484 013a 7b14 ld a,(OFST+11,sp)
485 013c aa40 or a,#64
486 013e 1a04 or a,(OFST-5,sp)
487 0140 c75214 ld 21012,a
488 ; 195 }
491 0143 5b09 addw sp,#9
492 0145 81 ret
547 ; 212 void I2C_Cmd(FunctionalState NewState)
547 ; 213 {
548 switch .text
549 0146 _I2C_Cmd:
553 ; 216 assert_param(IS_FUNCTIONALSTATE_OK(NewState));
555 ; 218 if (NewState != DISABLE)
557 0146 4d tnz a
558 0147 2705 jreq L371
559 ; 221 I2C->CR1 |= I2C_CR1_PE;
561 0149 72105210 bset 21008,#0
564 014d 81 ret
565 014e L371:
566 ; 226 I2C->CR1 &= (u8)(~I2C_CR1_PE);
568 014e 72115210 bres 21008,#0
569 ; 228 }
572 0152 81 ret
607 ; 245 void I2C_GeneralCallCmd(FunctionalState NewState)
607 ; 246 {
608 switch .text
609 0153 _I2C_GeneralCallCmd:
613 ; 249 assert_param(IS_FUNCTIONALSTATE_OK(NewState));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -