📄 pca9555.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\output\pca9555.o --device=DARMST --apcs=interwork -O0 -Id:\Keil\ARM\INC\ST\71x src\BSP\PCA9555.c]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
Write_PCA9555_Reg PROC
;;;29 void Write_PCA9555_Reg( u8 cmd, u8 dat )
;;;30 {
000000 e92d4070 PUSH {r4-r6,lr}
000004 e1a04000 MOV r4,r0
000008 e1a05001 MOV r5,r1
;;;31 u32 i = 10000;
00000c e59f644c LDR r6,|L1.1120|
;;;32
;;;33 I2C_STARTGenerate( I2C0, ENABLE ); // I2C总线开始条件
000010 e3a01001 MOV r1,#1
000014 e59f0448 LDR r0,|L1.1124|
000018 ebfffffe BL I2C_STARTGenerate
;;;34 while ( !( I2C0->SR1 & I2C_SB ) )
00001c ea000004 B |L1.52|
;;;35 {
;;;36 I2C_ERR_EXIT(i);
|L1.32|
000020 e2466001 SUB r6,r6,#1
000024 e3560000 CMP r6,#0
000028 1a000001 BNE |L1.52|
;;;37 }
;;;38
;;;39 I2C0->DR = (PCA9555_I2C_ADDR | (PCA9555_ADDR << 1)) & 0xfe; // 发送器件地址
;;;40 while ( !( I2C0->SR2 & 0x20 ) ) // ENDAD
;;;41 {
;;;42 I2C_ERR_EXIT(i);
;;;43 }
;;;44 I2C0->CR |= 0x20; // Set PE
;;;45
;;;46 while ( !( I2C0->SR1 & I2C_BTF ) ) // 发送命令
;;;47 {
;;;48 I2C_ERR_EXIT(i);
;;;49 }
;;;50 I2C0->DR = cmd;
;;;51 while ( !( I2C0->SR1 & I2C_BTF ) ) // 发送数据
;;;52 {
;;;53 I2C_ERR_EXIT(i);
;;;54 }
;;;55 I2C0->DR = dat;
;;;56 while ( !( I2C0->SR1 & I2C_BTF ) )
;;;57 {
;;;58 I2C_ERR_EXIT(i);
;;;59 }
;;;60
;;;61
;;;62 I2C_STOPGenerate( I2C0, ENABLE ); // 停止I2C总线
;;;63 while ( I2C0->CR & I2C_STOP_Mask )
;;;64 {
;;;65 I2C_ERR_EXIT(i);
;;;66 }
;;;67
;;;68
;;;69 }
|L1.44|
00002c e8bd4070 POP {r4-r6,lr}
000030 e12fff1e BX lr
|L1.52|
000034 e59f0428 LDR r0,|L1.1124| ;34
000038 e5d00004 LDRB r0,[r0,#4] ;34
00003c e3100001 TST r0,#1 ;34
000040 0afffff6 BEQ |L1.32| ;34
000044 e3a00040 MOV r0,#0x40 ;39
000048 e59f1414 LDR r1,|L1.1124| ;39
00004c e5c10018 STRB r0,[r1,#0x18] ;39
000050 ea000003 B |L1.100| ;40
|L1.84|
000054 e2466001 SUB r6,r6,#1 ;42
000058 e3560000 CMP r6,#0 ;42
00005c 1a000000 BNE |L1.100| ;42
000060 eafffff1 B |L1.44| ;42
|L1.100|
000064 e59f03f8 LDR r0,|L1.1124| ;40
000068 e5d00008 LDRB r0,[r0,#8] ;40
00006c e3100020 TST r0,#0x20 ;40
000070 0afffff7 BEQ |L1.84| ;40
000074 e59f03e8 LDR r0,|L1.1124| ;44
000078 e5d00000 LDRB r0,[r0,#0] ;44
00007c e3800020 ORR r0,r0,#0x20 ;44
000080 e59f13dc LDR r1,|L1.1124| ;44
000084 e5c10000 STRB r0,[r1,#0] ;44
000088 ea000003 B |L1.156| ;46
|L1.140|
00008c e2466001 SUB r6,r6,#1 ;48
000090 e3560000 CMP r6,#0 ;48
000094 1a000000 BNE |L1.156| ;48
000098 eaffffe3 B |L1.44| ;48
|L1.156|
00009c e59f03c0 LDR r0,|L1.1124| ;46
0000a0 e5d00004 LDRB r0,[r0,#4] ;46
0000a4 e3100008 TST r0,#8 ;46
0000a8 0afffff7 BEQ |L1.140| ;46
0000ac e59f03b0 LDR r0,|L1.1124| ;50
0000b0 e5c04018 STRB r4,[r0,#0x18] ;50
0000b4 ea000003 B |L1.200| ;51
|L1.184|
0000b8 e2466001 SUB r6,r6,#1 ;53
0000bc e3560000 CMP r6,#0 ;53
0000c0 1a000000 BNE |L1.200| ;53
0000c4 eaffffd8 B |L1.44| ;53
|L1.200|
0000c8 e59f0394 LDR r0,|L1.1124| ;51
0000cc e5d00004 LDRB r0,[r0,#4] ;51
0000d0 e3100008 TST r0,#8 ;51
0000d4 0afffff7 BEQ |L1.184| ;51
0000d8 e59f0384 LDR r0,|L1.1124| ;55
0000dc e5c05018 STRB r5,[r0,#0x18] ;55
0000e0 ea000003 B |L1.244| ;56
|L1.228|
0000e4 e2466001 SUB r6,r6,#1 ;58
0000e8 e3560000 CMP r6,#0 ;58
0000ec 1a000000 BNE |L1.244| ;58
0000f0 eaffffcd B |L1.44| ;58
|L1.244|
0000f4 e59f0368 LDR r0,|L1.1124| ;56
0000f8 e5d00004 LDRB r0,[r0,#4] ;56
0000fc e3100008 TST r0,#8 ;56
000100 0afffff7 BEQ |L1.228| ;56
000104 e3a01001 MOV r1,#1 ;62
000108 e59f0354 LDR r0,|L1.1124| ;62
00010c ebfffffe BL I2C_STOPGenerate ;62
000110 ea000003 B |L1.292| ;63
|L1.276|
000114 e2466001 SUB r6,r6,#1 ;65
000118 e3560000 CMP r6,#0 ;65
00011c 1a000000 BNE |L1.292| ;65
000120 eaffffc1 B |L1.44| ;65
|L1.292|
000124 e59f0338 LDR r0,|L1.1124| ;63
000128 e5d00000 LDRB r0,[r0,#0] ;63
00012c e3100002 TST r0,#2 ;63
000130 1afffff7 BNE |L1.276| ;63
000134 eaffffbc B |L1.44|
ENDP
Initial_PCA9555 PROC
;;;81 void Initial_PCA9555(void)
;;;82 {
000138 e92d4010 PUSH {r4,lr}
;;;83 os_mut_wait( MUT_i2c, 0xffff );
00013c e59f1324 LDR r1,|L1.1128|
000140 e59f0324 LDR r0,|L1.1132|
000144 ebfffffe BL os_mut_wait
;;;84 GPIO_Config( GPIO1, 0x0800, GPIO_IPUPD_WP ); //将P1.11配置为上拉输入用于PCA9555的IRQ线
000148 e3a02003 MOV r2,#3
00014c e3a01b02 MOV r1,#0x800
000150 e59f0318 LDR r0,|L1.1136|
000154 ebfffffe BL GPIO_Config
;;;85 GPIO_Config( GPIO1, I2C_SCL | I2C_SDA, GPIO_AF_OD );
000158 e3a02006 MOV r2,#6
00015c e3a01a06 MOV r1,#0x6000
000160 e59f0308 LDR r0,|L1.1136|
000164 ebfffffe BL GPIO_Config
;;;86
;;;87 I2C_Init( I2C0 );
000168 e59f02f4 LDR r0,|L1.1124|
00016c ebfffffe BL I2C_Init
;;;88 I2C_FCLKConfig( I2C0 );
000170 e59f02ec LDR r0,|L1.1124|
000174 ebfffffe BL I2C_FCLKConfig
;;;89 I2C_OnOffConfig( I2C0, ENABLE );
000178 e3a01001 MOV r1,#1
00017c e59f02e0 LDR r0,|L1.1124|
000180 ebfffffe BL I2C_OnOffConfig
;;;90 I2C_SpeedConfig( I2C0, 400000 );
000184 e59f12e8 LDR r1,|L1.1140|
000188 e59f02d4 LDR r0,|L1.1124|
00018c ebfffffe BL I2C_SpeedConfig
;;;91 I2C_AcknowledgeConfig( I2C0, ENABLE );
000190 e3a01001 MOV r1,#1
000194 e59f02c8 LDR r0,|L1.1124|
000198 ebfffffe BL I2C_AcknowledgeConfig
;;;92
;;;93 Write_PCA9555_Reg(0x02, 0xff); // 所有P0输出置为高电平
00019c e3a010ff MOV r1,#0xff
0001a0 e3a00002 MOV r0,#2
0001a4 ebfffffe BL Write_PCA9555_Reg
;;;94 Write_PCA9555_Reg(0x03, 0xff); // 所有P1输出置为高电平
0001a8 e3a010ff MOV r1,#0xff
0001ac e3a00003 MOV r0,#3
0001b0 ebfffffe BL Write_PCA9555_Reg
;;;95
;;;96 Write_PCA9555_Reg(0x04, 0x00); // 所有P0输入均不反转
0001b4 e3a01000 MOV r1,#0
0001b8 e3a00004 MOV r0,#4
0001bc ebfffffe BL Write_PCA9555_Reg
;;;97 Write_PCA9555_Reg(0x05, 0x00); // 所有P1输入均不反转
0001c0 e3a01000 MOV r1,#0
0001c4 e3a00005 MOV r0,#5
0001c8 ebfffffe BL Write_PCA9555_Reg
;;;98
;;;99 Write_PCA9555_Reg(0x06, 0x00); // 配置输入输出P0.0/1/2/3/4/5/6/7输出
0001cc e3a01000 MOV r1,#0
0001d0 e3a00006 MOV r0,#6
0001d4 ebfffffe BL Write_PCA9555_Reg
;;;100 Write_PCA9555_Reg(0x07, 0xf0); // 配置输入输出P1.0/1/2/3输出、4/5/6/7输入
0001d8 e3a010f0 MOV r1,#0xf0
0001dc e3a00007 MOV r0,#7
0001e0 ebfffffe BL Write_PCA9555_Reg
;;;101
;;;102 os_mut_release( MUT_i2c );
0001e4 e59f0280 LDR r0,|L1.1132|
0001e8 ebfffffe BL os_mut_release
;;;103 }
0001ec e8bd4010 POP {r4,lr}
0001f0 e12fff1e BX lr
ENDP
Read_PCA9555_Reg PROC
;;;115 u8 Read_PCA9555_Reg( u8 RegAddr )
;;;116 {
0001f4 e92d4070 PUSH {r4-r6,lr}
0001f8 e1a04000 MOV r4,r0
;;;117 u8 c;
;;;118 u32 i = 10000;
0001fc e59f625c LDR r6,|L1.1120|
;;;119
;;;120
;;;121 I2C_STARTGenerate( I2C0, ENABLE ); // I2C总线开始条件
000200 e3a01001 MOV r1,#1
000204 e59f0258 LDR r0,|L1.1124|
000208 ebfffffe BL I2C_STARTGenerate
;;;122 while ( !( I2C0->SR1 & I2C_SB ) )
00020c ea000005 B |L1.552|
;;;123 {
;;;124 I2C_ERR_RETURN(i, 0x00);
|L1.528|
000210 e2466001 SUB r6,r6,#1
000214 e3560000 CMP r6,#0
000218 1a000002 BNE |L1.552|
00021c e3a00000 MOV r0,#0
|L1.544|
000220 e8bd4070 POP {r4-r6,lr}
;;;125 }
;;;126
;;;127
;;;128 I2C0->DR = (PCA9555_I2C_ADDR | (PCA9555_ADDR << 1)) & 0xfe; // 发送器件地址
;;;129 while ( !( I2C0->SR2 & 0x20 ) ) // ENDAD
;;;130 {
;;;131 I2C_ERR_RETURN(i, 0x00);
;;;132 }
;;;133 I2C0->CR |= 0x20; // Set PE
;;;134
;;;135 while ( !( I2C0->SR1 & I2C_BTF ) ) //发送命令
;;;136 {
;;;137 I2C_ERR_RETURN(i, 0x00);
;;;138 }
;;;139 I2C0->DR = RegAddr;
;;;140 while ( !( I2C0->SR1 & I2C_BTF ) )
;;;141 {
;;;142 I2C_ERR_RETURN(i, 0x00);
;;;143 }
;;;144
;;;145
;;;146 I2C_AcknowledgeConfig( I2C0, DISABLE );
;;;147
;;;148 I2C_STARTGenerate( I2C0, ENABLE ); // 二次启动I2C总线
;;;149 while ( !( I2C0->SR1 & I2C_SB ) )
;;;150 {
;;;151 I2C_ERR_RETURN(i, 0x00);
;;;152 }
;;;153
;;;154 I2C0->DR = (PCA9555_I2C_ADDR | (PCA9555_ADDR << 1)) | 0x01; // 发送器件地址
;;;155 while ( !( I2C0->SR2 & 0x20 ) ) // ENDAD
;;;156 {
;;;157 I2C_ERR_RETURN(i, 0x00);
;;;158 }
;;;159 I2C0->CR |= 0x20; // Set PE
;;;160
;;;161 while ( !( I2C0->SR1 & I2C_BTF ) ) // 接收数据
;;;162 {
;;;163 I2C_ERR_RETURN(i, 0x00);
;;;164 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -