⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pca9555.txt

📁 使用STR710的SPI接口访问外部EEPROM的例子程序.使用KEIL UV3编译.使用了MDK3.05操作系统.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; 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 + -