📄 stm32f10x_i2c.txt
字号:
;;;303 }
;;;304 }
000012 4770 BX lr
;;;305
ENDP
AREA ||i.I2C_DMACmd||, CODE, READONLY, ALIGN=1
I2C_DMACmd PROC
;;;314 *******************************************************************************/
;;;315 void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000 2900 CMP r1,#0
;;;316 {
;;;317 /* Check the parameters */
;;;318 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;319 assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;320
;;;321 if (NewState != DISABLE)
;;;322 {
;;;323 /* Enable the selected I2C DMA requests */
;;;324 I2Cx->CR2 |= CR2_DMAEN_Set;
000002 8881 LDRH r1,[r0,#4]
000004 d002 BEQ |L8.12|
000006 f4416100 ORR r1,r1,#0x800
00000a e001 B |L8.16|
|L8.12|
;;;325 }
;;;326 else
;;;327 {
;;;328 /* Disable the selected I2C DMA requests */
;;;329 I2Cx->CR2 &= CR2_DMAEN_Reset;
00000c f4216100 BIC r1,r1,#0x800
|L8.16|
000010 8081 STRH r1,[r0,#4] ;324
;;;330 }
;;;331 }
000012 4770 BX lr
;;;332
ENDP
AREA ||i.I2C_DMALastTransferCmd||, CODE, READONLY, ALIGN=1
I2C_DMALastTransferCmd PROC
;;;341 *******************************************************************************/
;;;342 void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000 2900 CMP r1,#0
;;;343 {
;;;344 /* Check the parameters */
;;;345 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;346 assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;347
;;;348 if (NewState != DISABLE)
;;;349 {
;;;350 /* Next DMA transfer is the last transfer */
;;;351 I2Cx->CR2 |= CR2_LAST_Set;
000002 8881 LDRH r1,[r0,#4]
000004 d002 BEQ |L9.12|
000006 f4415180 ORR r1,r1,#0x1000
00000a e001 B |L9.16|
|L9.12|
;;;352 }
;;;353 else
;;;354 {
;;;355 /* Next DMA transfer is not the last transfer */
;;;356 I2Cx->CR2 &= CR2_LAST_Reset;
00000c f4215180 BIC r1,r1,#0x1000
|L9.16|
000010 8081 STRH r1,[r0,#4] ;351
;;;357 }
;;;358 }
000012 4770 BX lr
;;;359
ENDP
AREA ||i.I2C_DeInit||, CODE, READONLY, ALIGN=2
I2C_DeInit PROC
;;;108 *******************************************************************************/
;;;109 void I2C_DeInit(I2C_TypeDef* I2Cx)
000000 490a LDR r1,|L10.44|
;;;110 {
000002 b510 PUSH {r4,lr}
;;;111 /* Check the parameters */
;;;112 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;113
;;;114 switch (*(u32*)&I2Cx)
000004 1840 ADDS r0,r0,r1
000006 d00d BEQ |L10.36|
000008 f5b06f80 CMP r0,#0x400
00000c d10d BNE |L10.42|
;;;115 {
;;;116 case I2C1_BASE:
;;;117 /* Enable I2C1 reset state */
;;;118 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
;;;119 /* Release I2C1 from reset state */
;;;120 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
;;;121 break;
;;;122
;;;123 case I2C2_BASE:
;;;124 /* Enable I2C2 reset state */
;;;125 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
00000e 2101 MOVS r1,#1
000010 058c LSLS r4,r1,#22
|L10.18|
000012 4620 MOV r0,r4
000014 f7fffffe BL RCC_APB1PeriphResetCmd
;;;126 /* Release I2C2 from reset state */
;;;127 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
000018 4620 MOV r0,r4
00001a e8bd4010 POP {r4,lr}
00001e 2100 MOVS r1,#0
000020 f7ffbffe B.W RCC_APB1PeriphResetCmd
|L10.36|
000024 2101 MOVS r1,#1 ;118
000026 054c LSLS r4,r1,#21 ;118
000028 e7f3 B |L10.18|
|L10.42|
;;;128 break;
;;;129
;;;130 default:
;;;131 break;
;;;132 }
;;;133 }
00002a bd10 POP {r4,pc}
;;;134
ENDP
|L10.44|
DCD 0xbfffac00
AREA ||i.I2C_DualAddressCmd||, CODE, READONLY, ALIGN=1
I2C_DualAddressCmd PROC
;;;474 *******************************************************************************/
;;;475 void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000 2900 CMP r1,#0
;;;476 {
;;;477 /* Check the parameters */
;;;478 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;479 assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;480
;;;481 if (NewState != DISABLE)
;;;482 {
;;;483 /* Enable dual addressing mode */
;;;484 I2Cx->OAR2 |= OAR2_ENDUAL_Set;
000002 8981 LDRH r1,[r0,#0xc]
000004 d002 BEQ |L11.12|
000006 f0410101 ORR r1,r1,#1
00000a e001 B |L11.16|
|L11.12|
;;;485 }
;;;486 else
;;;487 {
;;;488 /* Disable dual addressing mode */
;;;489 I2Cx->OAR2 &= OAR2_ENDUAL_Reset;
00000c f0210101 BIC r1,r1,#1
|L11.16|
000010 8181 STRH r1,[r0,#0xc] ;484
;;;490 }
;;;491 }
000012 4770 BX lr
;;;492
ENDP
AREA ||i.I2C_FastModeDutyCycleConfig||, CODE, READONLY, ALIGN=1
I2C_FastModeDutyCycleConfig PROC
;;;870 *******************************************************************************/
;;;871 void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle)
000000 f5b14f80 CMP r1,#0x4000
;;;872 {
;;;873 /* Check the parameters */
;;;874 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;875 assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle));
;;;876
;;;877 if (I2C_DutyCycle != I2C_DutyCycle_16_9)
;;;878 {
;;;879 /* I2C fast mode Tlow/Thigh=2 */
;;;880 I2Cx->CCR &= I2C_DutyCycle_2;
000004 8b81 LDRH r1,[r0,#0x1c]
000006 d002 BEQ |L12.14|
000008 f4214180 BIC r1,r1,#0x4000
00000c e001 B |L12.18|
|L12.14|
;;;881 }
;;;882 else
;;;883 {
;;;884 /* I2C fast mode Tlow/Thigh=16/9 */
;;;885 I2Cx->CCR |= I2C_DutyCycle_16_9;
00000e f4414180 ORR r1,r1,#0x4000
|L12.18|
000012 8381 STRH r1,[r0,#0x1c] ;880
;;;886 }
;;;887 }
000014 4770 BX lr
;;;888
ENDP
AREA ||i.I2C_GeneralCallCmd||, CODE, READONLY, ALIGN=1
I2C_GeneralCallCmd PROC
;;;501 *******************************************************************************/
;;;502 void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000 2900 CMP r1,#0
;;;503 {
;;;504 /* Check the parameters */
;;;505 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;506 assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;507
;;;508 if (NewState != DISABLE)
;;;509 {
;;;510 /* Enable generall call */
;;;511 I2Cx->CR1 |= CR1_ENGC_Set;
000002 8801 LDRH r1,[r0,#0]
000004 d002 BEQ |L13.12|
000006 f0410140 ORR r1,r1,#0x40
00000a e001 B |L13.16|
|L13.12|
;;;512 }
;;;513 else
;;;514 {
;;;515 /* Disable generall call */
;;;516 I2Cx->CR1 &= CR1_ENGC_Reset;
00000c f0210140 BIC r1,r1,#0x40
|L13.16|
000010 8001 STRH r1,[r0,#0] ;511
;;;517 }
;;;518 }
000012 4770 BX lr
;;;519
ENDP
AREA ||i.I2C_GenerateSTART||, CODE, READONLY, ALIGN=1
I2C_GenerateSTART PROC
;;;368 *******************************************************************************/
;;;369 void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000 2900 CMP r1,#0
;;;370 {
;;;371 /* Check the parameters */
;;;372 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;373 assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;374
;;;375 if (NewState != DISABLE)
;;;376 {
;;;377 /* Generate a START condition */
;;;378 I2Cx->CR1 |= CR1_START_Set;
000002 8801 LDRH r1,[r0,#0]
000004 d002 BEQ |L14.12|
000006 f4417180 ORR r1,r1,#0x100
00000a e001 B |L14.16|
|L14.12|
;;;379 }
;;;380 else
;;;381 {
;;;382 /* Disable the START condition generation */
;;;383 I2Cx->CR1 &= CR1_START_Reset;
00000c f4217180 BIC r1,r1,#0x100
|L14.16|
000010 8001 STRH r1,[r0,#0] ;378
;;;384 }
;;;385 }
000012 4770 BX lr
;;;386
ENDP
AREA ||i.I2C_GenerateSTOP||, CODE, READONLY, ALIGN=1
I2C_GenerateSTOP PROC
;;;395 *******************************************************************************/
;;;396 void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000 2900 CMP r1,#0
;;;397 {
;;;398 /* Check the parameters */
;;;399 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;400 assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;401
;;;402 if (NewState != DISABLE)
;;;403 {
;;;404 /* Generate a STOP condition */
;;;405 I2Cx->CR1 |= CR1_STOP_Set;
000002 8801 LDRH r1,[r0,#0]
000004 d002 BEQ |L15.12|
000006 f4417100 ORR r1,r1,#0x200
00000a e001 B |L15.16|
|L15.12|
;;;406 }
;;;407 else
;;;408 {
;;;409 /* Disable the STOP condition generation */
;;;410 I2Cx->CR1 &= CR1_STOP_Reset;
00000c f4217100 BIC r1,r1,#0x200
|L15.16|
000010 8001 STRH r1,[r0,#0] ;405
;;;411 }
;;;412 }
000012 4770 BX lr
;;;413
ENDP
AREA ||i.I2C_GetFlagStatus||, CODE, READONLY, ALIGN=1
I2C_GetFlagStatus PROC
;;;1002 *******************************************************************************/
;;;1003 FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, u32 I2C_FLAG)
000000 4602 MOV r2,r0
;;;1004 {
;;;1005 FlagStatus bitstatus = RESET;
;;;1006 u32 i2cstatus = 0;
;;;1007 u32 flag1 = 0, flag2 = 0;
;;;1008
;;;1009 /* Check the parameters */
;;;1010 assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;1011 assert_param(IS_I2C_GET_FLAG(I2C_FLAG));
;;;1012
;;;1013 /* Read the I2Cx status register */
;;;1014 flag1 = I2Cx->SR1;
000002 8a93 LDRH r3,[r2,#0x14]
000004 2000 MOVS r0,#0 ;1005
;;;1015 flag2 = I2Cx->SR2;
000006 8b12 LDRH r2,[r2,#0x18]
;;;1016 flag2 = (flag2 & FLAG_Mask) << 16;
;;;1017
;;;1018 /* Get the I2C status value */
;;;1019 i2cstatus = flag1 | flag2;
;;;1020
;;;1021 /* Get bit[23:0] of the flag */
;;;1022 I2C_FLAG &= FLAG_Mask;
000008 f021417f BIC r1,r1,#0xff000000
00000c ea434302 ORR r3,r3,r2,LSL #16 ;1019
;;;1023
;;;1024 /* Check the status of the specified I2C flag */
;;;1025 if ((i2cstatus & I2C_FLAG) != (u32)RESET)
000010 420b TST r3,r1
000012 d000 BEQ |L16.22|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -