; generated by Component: ARM Compiler 5.05 (build 41) Tool: ArmCC [4d0eb9]
; commandline ArmCC [--list --debug -c --asm --interleave -o.\obj\i2c.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\i2c.d --cpu=Cortex-M0 --apcs=interwork -I..\..\..\Library\CMSIS\Include -I..\..\..\Library\Device\Nuvoton\Mini51Series\Include -I..\..\..\Library\StdDriver\inc -I.\StdDriver\inc -I.\CMSIS -IG:\Geek\Projects\Zulolo_F\Force\Code\Zulolo_F_Force\RTE -ID:\Keil_v5\ARM\PACK\Nuvoton\NuMicro_DFP\1.0.2\Device\Mini51\Include -ID:\Keil_v5\ARM\CMSIS\Include -I\ -D__MICROLIB --omf_browse=.\obj\i2c.crf StdDriver\src\i2c.c]
                          THUMB

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  I2C_Open PROC
;;;31       */
;;;32     uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock)
000000  b570              PUSH     {r4-r6,lr}
;;;33     {
000002  4604              MOV      r4,r0
;;;34         uint32_t u32Div;
;;;35     
;;;36         /* Enable I2C clock */
;;;37         CLK->APBCLK |= CLK_APBCLK_I2C_EN_Msk;
000004  485d              LDR      r0,|L1.380|
000006  6882              LDR      r2,[r0,#8]
000008  23ff              MOVS     r3,#0xff
00000a  3301              ADDS     r3,#1
00000c  431a              ORRS     r2,r2,r3
00000e  6082              STR      r2,[r0,#8]
;;;38     
;;;39         u32Div = (uint32_t) (((SystemCoreClock * 10)/(u32BusClock * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
000010  4d5b              LDR      r5,|L1.384|
000012  220a              MOVS     r2,#0xa
000014  6828              LDR      r0,[r5,#0]  ; SystemCoreClock
000016  0089              LSLS     r1,r1,#2
000018  4350              MULS     r0,r2,r0
00001a  f7fffffe          BL       __aeabi_uidivmod
00001e  210a              MOVS     r1,#0xa
000020  1d40              ADDS     r0,r0,#5
000022  f7fffffe          BL       __aeabi_uidivmod
000026  1e40              SUBS     r0,r0,#1
;;;40         i2c->I2CLK = u32Div;
000028  6120              STR      r0,[r4,#0x10]
;;;41     
;;;42         /* Enable I2C */
;;;43         i2c->I2CON |= I2C_I2CON_ENSI_Msk;
00002a  6821              LDR      r1,[r4,#0]
00002c  2240              MOVS     r2,#0x40
00002e  4311              ORRS     r1,r1,r2
000030  6021              STR      r1,[r4,#0]
;;;44     
;;;45         return ( SystemCoreClock / ((u32Div+1)<<2) );
000032  0081              LSLS     r1,r0,#2
000034  1d09              ADDS     r1,r1,#4
000036  6828              LDR      r0,[r5,#0]  ; SystemCoreClock
000038  f7fffffe          BL       __aeabi_uidivmod
;;;46     }
00003c  bd70              POP      {r4-r6,pc}
;;;47     
                          ENDP

                  I2C_Close PROC
;;;52       */
;;;53     void I2C_Close(I2C_T *i2c)
00003e  2105              MOVS     r1,#5
;;;54     {
;;;55         /* Rreset SPI */
;;;56         SYS->IPRSTC2 |= SYS_IPRSTC2_I2C_RST_Msk;
000040  0709              LSLS     r1,r1,#28
000042  68cb              LDR      r3,[r1,#0xc]
000044  22ff              MOVS     r2,#0xff
000046  3201              ADDS     r2,#1
000048  4313              ORRS     r3,r3,r2
00004a  60cb              STR      r3,[r1,#0xc]
;;;57         SYS->IPRSTC2 &= ~SYS_IPRSTC2_I2C_RST_Msk;
00004c  68cb              LDR      r3,[r1,#0xc]
00004e  4393              BICS     r3,r3,r2
000050  60cb              STR      r3,[r1,#0xc]
;;;58     
;;;59         /* Disable I2C */
;;;60         i2c->I2CON &= ~I2C_I2CON_ENSI_Msk;
000052  6801              LDR      r1,[r0,#0]
000054  2240              MOVS     r2,#0x40
000056  4391              BICS     r1,r1,r2
000058  6001              STR      r1,[r0,#0]
;;;61     }
00005a  4770              BX       lr
;;;62     
                          ENDP

                  I2C_ClearTimeoutFlag PROC
;;;67       */
;;;68     void I2C_ClearTimeoutFlag(I2C_T *i2c)
00005c  6941              LDR      r1,[r0,#0x14]
;;;69     {
;;;70         i2c->I2CTOC |= I2C_I2CTOC_TIF_Msk;
00005e  2201              MOVS     r2,#1
000060  4311              ORRS     r1,r1,r2
000062  6141              STR      r1,[r0,#0x14]
;;;71     }
000064  4770              BX       lr
;;;72     
                          ENDP

                  I2C_Trigger PROC
;;;81       */
;;;82     void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack)
000066  b530              PUSH     {r4,r5,lr}
;;;83     {
;;;84         uint32_t u32Reg = 0;
000068  2400              MOVS     r4,#0
;;;85     
;;;86         if (u8Start)
00006a  9d03              LDR      r5,[sp,#0xc]
00006c  2900              CMP      r1,#0
00006e  d000              BEQ      |L1.114|
;;;87             u32Reg |= I2C_STA;
000070  2420              MOVS     r4,#0x20
                  |L1.114|
;;;88         if (u8Stop)
000072  2a00              CMP      r2,#0
000074  d001              BEQ      |L1.122|
;;;89             u32Reg |= I2C_STO;
000076  2110              MOVS     r1,#0x10
000078  430c              ORRS     r4,r4,r1
                  |L1.122|
;;;90         if (u8Si)
00007a  2b00              CMP      r3,#0
00007c  d001              BEQ      |L1.130|
;;;91             u32Reg |= I2C_SI;
00007e  2108              MOVS     r1,#8
000080  430c              ORRS     r4,r4,r1
                  |L1.130|
;;;92         if (u8Ack)
000082  2d00              CMP      r5,#0
000084  d001              BEQ      |L1.138|
;;;93             u32Reg |= I2C_AA;
000086  2104              MOVS     r1,#4
000088  430c              ORRS     r4,r4,r1
                  |L1.138|
;;;94     
;;;95         i2c->I2CON = (i2c->I2CON & ~0x3C) | u32Reg;
00008a  6801              LDR      r1,[r0,#0]
00008c  223c              MOVS     r2,#0x3c
00008e  4391              BICS     r1,r1,r2
000090  4321              ORRS     r1,r1,r4
000092  6001              STR      r1,[r0,#0]
;;;96     }
000094  bd30              POP      {r4,r5,pc}
;;;97     
                          ENDP

                  I2C_DisableInt PROC
;;;102      */
;;;103    void I2C_DisableInt(I2C_T *i2c)
000096  6801              LDR      r1,[r0,#0]
;;;104    {
;;;105        i2c->I2CON &= ~I2C_I2CON_EI_Msk;
000098  2280              MOVS     r2,#0x80
00009a  4391              BICS     r1,r1,r2
00009c  6001              STR      r1,[r0,#0]
;;;106    }
00009e  4770              BX       lr
;;;107    
                          ENDP

                  I2C_EnableInt PROC
;;;112      */
;;;113    void I2C_EnableInt(I2C_T *i2c)
0000a0  6801              LDR      r1,[r0,#0]
;;;114    {
;;;115        i2c->I2CON |= I2C_I2CON_EI_Msk;
0000a2  2280              MOVS     r2,#0x80
0000a4  4311              ORRS     r1,r1,r2
0000a6  6001              STR      r1,[r0,#0]
;;;116    }
0000a8  4770              BX       lr
;;;117    
                          ENDP

                  I2C_GetClockBusFreq PROC
;;;122      */
;;;123    uint32_t I2C_GetClockBusFreq(I2C_T *i2c)
0000aa  b510              PUSH     {r4,lr}
;;;124    {
;;;125        uint32_t u32Divider = I2C->I2CLK;
0000ac  4835              LDR      r0,|L1.388|
0000ae  6900              LDR      r0,[r0,#0x10]
;;;126    
;;;127        return ( SystemCoreClock / ((u32Divider+1)<<2) );
0000b0  0081              LSLS     r1,r0,#2
0000b2  4833              LDR      r0,|L1.384|
0000b4  1d09              ADDS     r1,r1,#4
0000b6  6800              LDR      r0,[r0,#0]  ; SystemCoreClock
0000b8  f7fffffe          BL       __aeabi_uidivmod
;;;128    }
0000bc  bd10              POP      {r4,pc}
;;;129    
                          ENDP

                  I2C_SetClockBusFreq PROC
;;;135      */
;;;136    uint32_t I2C_SetClockBusFreq(I2C_T *i2c, uint32_t u32BusClock)
0000be  b570              PUSH     {r4-r6,lr}
;;;137    {
0000c0  4604              MOV      r4,r0
;;;138        uint32_t u32Div;
;;;139    
;;;140        u32Div = (uint32_t) (((SystemCoreClock * 10)/(u32BusClock * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
0000c2  482f              LDR      r0,|L1.384|
0000c4  220a              MOVS     r2,#0xa
0000c6  6800              LDR      r0,[r0,#0]  ; SystemCoreClock
0000c8  0089              LSLS     r1,r1,#2
0000ca  4605              MOV      r5,r0
0000cc  4350              MULS     r0,r2,r0
0000ce  f7fffffe          BL       __aeabi_uidivmod
0000d2  210a              MOVS     r1,#0xa
0000d4  1d40              ADDS     r0,r0,#5
0000d6  f7fffffe          BL       __aeabi_uidivmod
0000da  1e40              SUBS     r0,r0,#1
;;;141        i2c->I2CLK = u32Div;
0000dc  6120              STR      r0,[r4,#0x10]
;;;142    
;;;143        return ( SystemCoreClock / ((u32Div+1)<<2) );
0000de  0081              LSLS     r1,r0,#2
0000e0  4628              MOV      r0,r5
0000e2  1d09              ADDS     r1,r1,#4
0000e4  f7fffffe          BL       __aeabi_uidivmod
;;;144    }
0000e8  bd70              POP      {r4-r6,pc}
;;;145    
                          ENDP

                  I2C_GetIntFlag PROC
;;;152      */
;;;153    uint32_t I2C_GetIntFlag(I2C_T *i2c)
0000ea  6800              LDR      r0,[r0,#0]
;;;154    {
;;;155        return ( (i2c->I2CON & I2C_I2CON_SI_Msk) == I2C_I2CON_SI_Msk ? 1:0 );
0000ec  0700              LSLS     r0,r0,#28
0000ee  0fc0              LSRS     r0,r0,#31
;;;156    }
0000f0  4770              BX       lr
;;;157    
                          ENDP

                  I2C_GetStatus PROC
;;;162      */
;;;163    uint32_t I2C_GetStatus(I2C_T *i2c)
0000f2  68c0              LDR      r0,[r0,#0xc]
;;;164    {
;;;165        return ( i2c->I2CSTATUS );
;;;166    }
0000f4  4770              BX       lr
;;;167    
                          ENDP

                  I2C_GetData PROC
;;;172      */
;;;173    uint32_t I2C_GetData(I2C_T *i2c)
0000f6  6880              LDR      r0,[r0,#8]
;;;174    {
;;;175        return ( i2c->I2CDAT );
;;;176    }
0000f8  4770              BX       lr
;;;177    
                          ENDP

                  I2C_SetData PROC
;;;183      */
;;;184    void I2C_SetData(I2C_T *i2c, uint8_t u8Data)
0000fa  6081              STR      r1,[r0,#8]
;;;185    {
;;;186        i2c->I2CDAT = u8Data;
;;;187    }
0000fc  4770              BX       lr
;;;188    
                          ENDP

                  I2C_SetSlaveAddr PROC
;;;196      */
;;;197    void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode)
0000fe  0052              LSLS     r2,r2,#1
;;;198    {
;;;199        switch (u8SlaveNo)
;;;200        {
;;;201            case 0:
;;;202                i2c->I2CADDR0  = (u8SlaveAddr << 1) | u8GCMode;
000100  431a              ORRS     r2,r2,r3
000102  2900              CMP      r1,#0                 ;199
000104  d005              BEQ      |L1.274|
000106  2901              CMP      r1,#1                 ;199
000108  d005              BEQ      |L1.278|
00010a  2902              CMP      r1,#2                 ;199
00010c  d005              BEQ      |L1.282|
00010e  2903              CMP      r1,#3                 ;199
000110  d005              BEQ      |L1.286|
                  |L1.274|
;;;203                break;
;;;204            case 1:
;;;205                i2c->I2CADDR1  = (u8SlaveAddr << 1) | u8GCMode;
;;;206                break;
;;;207            case 2:
;;;208                i2c->I2CADDR2  = (u8SlaveAddr << 1) | u8GCMode;
;;;209                break;
;;;210            case 3:
;;;211                i2c->I2CADDR3  = (u8SlaveAddr << 1) | u8GCMode;
;;;212                break;
;;;213            default:
;;;214                i2c->I2CADDR0  = (u8SlaveAddr << 1) | u8GCMode;
000112  6042              STR      r2,[r0,#4]
;;;215        }
;;;216    }
000114  4770              BX       lr
                  |L1.278|
000116  6182              STR      r2,[r0,#0x18]         ;205
000118  4770              BX       lr
                  |L1.282|
00011a  61c2              STR      r2,[r0,#0x1c]         ;208
00011c  4770              BX       lr
                  |L1.286|
00011e  6202              STR      r2,[r0,#0x20]         ;211
000120  4770              BX       lr
;;;217    
                          ENDP

                  I2C_SetSlaveMask PROC
;;;224      */
;;;225    void I2C_SetSlaveMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask)
000122  2900              CMP      r1,#0
;;;226    {
000124  d005              BEQ      |L1.306|
;;;227        switch (u8SlaveNo)
000126  2901              CMP      r1,#1
000128  d005              BEQ      |L1.310|
00012a  2902              CMP      r1,#2
00012c  d005              BEQ      |L1.314|
00012e  2903              CMP      r1,#3
000130  d005              BEQ      |L1.318|
                  |L1.306|
;;;228        {
;;;229            case 0:
;;;230                i2c->I2CADM0  = u8SlaveAddrMask;
;;;231                break;
;;;232            case 1:
;;;233                i2c->I2CADM1  = u8SlaveAddrMask;
;;;234                break;
;;;235            case 2:
;;;236                i2c->I2CADM2  = u8SlaveAddrMask;
;;;237                break;
;;;238            case 3:
;;;239                i2c->I2CADM3  = u8SlaveAddrMask;
;;;240                break;
;;;241            default:
;;;242                i2c->I2CADM0  = u8SlaveAddrMask;
000132  6242              STR      r2,[r0,#0x24]
;;;243        }
;;;244    }
000134  4770              BX       lr
                  |L1.310|
000136  6282              STR      r2,[r0,#0x28]         ;233
000138  4770              BX       lr
                  |L1.314|
00013a  62c2              STR      r2,[r0,#0x2c]         ;236
00013c  4770              BX       lr
                  |L1.318|
00013e  6302              STR      r2,[r0,#0x30]         ;239
000140  4770              BX       lr
;;;245    
                          ENDP

                  I2C_EnableTimeout PROC
;;;251      */
;;;252    void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout)
000142  2202              MOVS     r2,#2
;;;253    {
;;;254        if(u8LongTimeout)
000144  2900              CMP      r1,#0
;;;255            i2c->I2CTOC |= I2C_I2CTOC_DIV4_Msk;
;;;256        else
;;;257            i2c->I2CTOC &= ~I2C_I2CTOC_DIV4_Msk;
000146  6941              LDR      r1,[r0,#0x14]
000148  d001              BEQ      |L1.334|
00014a  4311              ORRS     r1,r1,r2              ;255
00014c  e000              B        |L1.336|
                  |L1.334|
00014e  4391              BICS     r1,r1,r2
                  |L1.336|
000150  6141              STR      r1,[r0,#0x14]
;;;258    
;;;259        i2c->I2CTOC |= I2C_I2CTOC_ENTI_Msk;
000152  6941              LDR      r1,[r0,#0x14]
000154  2204              MOVS     r2,#4
000156  4311              ORRS     r1,r1,r2
000158  6141              STR      r1,[r0,#0x14]
;;;260    }
00015a  4770              BX       lr
;;;261    
                          ENDP

                  I2C_DisableTimeout PROC
;;;266      */
;;;267    void I2C_DisableTimeout(I2C_T *i2c)
00015c  6941              LDR      r1,[r0,#0x14]
;;;268    {
;;;269        i2c->I2CTOC &= ~I2C_I2CTOC_ENTI_Msk;
00015e  2204              MOVS     r2,#4
000160  4391              BICS     r1,r1,r2
000162  6141              STR      r1,[r0,#0x14]
;;;270    }
000164  4770              BX       lr
;;;271    
                          ENDP

                  I2C_EnableWakeup PROC
;;;276      */
;;;277    void I2C_EnableWakeup(I2C_T *i2c)
000166  6bc1              LDR      r1,[r0,#0x3c]
;;;278    {
;;;279        i2c->I2CON2 |= I2C_I2CON2_WKUPEN_Msk;
000168  2201              MOVS     r2,#1
00016a  4311              ORRS     r1,r1,r2
00016c  63c1              STR      r1,[r0,#0x3c]
;;;280    }
00016e  4770              BX       lr
;;;281    
                          ENDP

                  I2C_DisableWakeup PROC
;;;286      */
;;;287    void I2C_DisableWakeup(I2C_T *i2c)
000170  6bc1              LDR      r1,[r0,#0x3c]
;;;288    {
;;;289        i2c->I2CON2 &= ~I2C_I2CON2_WKUPEN_Msk;
000172  0849              LSRS     r1,r1,#1
000174  0049              LSLS     r1,r1,#1
000176  63c1              STR      r1,[r0,#0x3c]
;;;290    }
000178  4770              BX       lr
;;;291    
                          ENDP

00017a  0000              DCW      0x0000
                  |L1.380|
                          DCD      0x50000200
                  |L1.384|
                          DCD      SystemCoreClock
                  |L1.388|
                          DCD      0x40020000

;*** Start embedded assembler ***

#line 1 "StdDriver\\src\\i2c.c"
	AREA ||.rev16_text||, CODE
	THUMB
	EXPORT |__asm___5_i2c_c_I2C_Open____REV16|
#line 118 ".\\CMSIS\\core_cmInstr.h"
|__asm___5_i2c_c_I2C_Open____REV16| PROC
#line 119

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE
	THUMB
	EXPORT |__asm___5_i2c_c_I2C_Open____REVSH|
#line 132
|__asm___5_i2c_c_I2C_Open____REVSH| PROC
#line 133

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
