📄 i2c.lst
字号:
##############################################################################
# #
# IAR ARM ANSI C/C++ Compiler V4.31A/W32 KICKSTART 08/Jun/2006 15:24:50 #
# Copyright 1999-2005 IAR Systems. All rights reserved. #
# #
# Cpu mode = interwork #
# Endian = little #
# Stack alignment = 4 #
# Source file = E:\项目文档\LPC2103 开发板\项目文档\LPC210X #
# EK_V2.0\调试代码\IAR\JLINK for IAR Program #
# Example\I2C\SRC\I2C.C #
# Command line = "E:\项目文档\LPC2103 开发板\项目文档\LPC210X #
# EK_V2.0\调试代码\IAR\JLINK for IAR Program #
# Example\I2C\SRC\I2C.C" -lCN "E:\项目文档\LPC2103 #
# 开发板\项目文档\LPC210X EK_V2.0\调试代码\IAR\JLINK #
# for IAR Program Example\I2C\Jlink_RAM\List\" -o #
# "E:\项目文档\LPC2103 开发板\项目文档\LPC210X #
# EK_V2.0\调试代码\IAR\JLINK for IAR Program #
# Example\I2C\Jlink_RAM\Obj\" -z2 --no_cse #
# --no_unroll --no_inline --no_code_motion --no_tbaa #
# --no_clustering --no_scheduling --debug --cpu_mode #
# thumb --endian little --cpu ARM7TDMI-S #
# --stack_align 4 --interwork -e --fpu None #
# --dlib_config "C:\Program Files\IAR #
# Systems\Embedded Workbench 4.0 #
# Kickstart\ARM\LIB\dl4tptinl8n.h" -I "C:\Program #
# Files\IAR Systems\Embedded Workbench 4.0 #
# Kickstart\ARM\INC\" #
# List file = E:\项目文档\LPC2103 开发板\项目文档\LPC210X #
# EK_V2.0\调试代码\IAR\JLINK for IAR Program #
# Example\I2C\Jlink_RAM\List\I2C.lst #
# Object file = E:\项目文档\LPC2103 开发板\项目文档\LPC210X #
# EK_V2.0\调试代码\IAR\JLINK for IAR Program #
# Example\I2C\Jlink_RAM\Obj\I2C.r79 #
# #
# #
##############################################################################
E:\项目文档\LPC2103 开发板\项目文档\LPC210X EK_V2.0\调试代码\IAR\JLINK for IAR Program Example\I2C\SRC\I2C.C
1
2 /****************************************Copyright (c)**************************************************
3 **
4 ** 北天星国际有限公司
5 ** http://www.po-star.com
6 **
7 **------------------------------------------------------------------------------------------------------
8 ********************************************************************************************************
9 **函数功能:给24C02里写入4个字节,在串口上打印出来;然后读出来,也在串口上打印出来
10 显示完后比较,如果不相等,蜂鸣器鸣叫;如果相等,LED闪烁
11 **说明:JP2_LED2连接上,J9连接上.实验前按复位键。保证复位i2c
12 ********************************************************************/
13
14
15
16 #include "..\inc\config.h"
17 #define STA (1<<5)
18 #define I2CEN (1<<6)
19 #define STO (1<<4)
20 #define SI (1<<3)
21 #define AA (1<<2)
22
23 #define WRMode 0 //写控制位
24 #define RDMode 1 //读控制位
25 #define C02MasterAddr 0xA0 //24c02的器件地址
26 #define C02SlaveAddr 0 //24C02的子地址
27 #define lastbyte 1 //最后一位标志位
28
\ In segment DATA_Z, align 4, align-sorted
29 U8 I2C_buf1[10];
\ I2C_buf1:
\ 00000000 DS8 12
\ In segment DATA_Z, align 4, align-sorted
30 U8 I2C_buf2[10];
\ I2C_buf2:
\ 00000000 DS8 12
31
32 extern void UART0_PutString(char *str);
33 extern void UART0_PutChar ( U32 data);
34 extern void UART0_Init (void);
35 extern void PLL_Init(void);
36 /***********************i2c总线初始化*********************/
\ In segment CODE, align 4, keep-with-next
37 void I2C_Init(void)
38 { /* 设置I2C时钟为100KHz */
39 I2SCLH = I2SCLL = 14; // 晶振为11.0592MHz,Fpclk = 2.7648MHz,I2C时钟速率=2.7648/28=100k
\ I2C_Init:
\ 00000000 0E20 MOV R0,#+14
\ 00000002 0549 LDR R1,??I2C_Init_0 ;; 0xe001c014
\ 00000004 0860 STR R0,[R1, #+0]
\ 00000006 0549 LDR R1,??I2C_Init_0+0x4 ;; 0xe001c010
\ 00000008 0860 STR R0,[R1, #+0]
40 I2CONCLR=STA|SI|AA|STO;
\ 0000000A .... LDR R0,??DataTable16 ;; 0xe001c018
\ 0000000C 3C21 MOV R1,#+60
\ 0000000E 0170 STRB R1,[R0, #+0]
41 I2CONSET=I2CEN; //I2EN=1,使能I2C功能
\ 00000010 .... LDR R0,??DataTable15 ;; 0xe001c000
\ 00000012 4021 MOV R1,#+64
\ 00000014 0170 STRB R1,[R0, #+0]
42 }
\ 00000016 7047 BX LR ;; return
\ ??I2C_Init_0:
\ 00000018 14C001E0 DC32 0xe001c014
\ 0000001C 10C001E0 DC32 0xe001c010
43
44 /*************************发送起始信号*********************/
\ In segment CODE, align 4, keep-with-next
45 void I2C_Start(void)
46 {
\ I2C_Start:
\ 00000000 00B5 PUSH {LR}
47 I2CONSET=STA; //启动发送START脉冲
\ 00000002 .... LDR R0,??DataTable15 ;; 0xe001c000
\ 00000004 2021 MOV R1,#+32
\ 00000006 0170 STRB R1,[R0, #+0]
48 //I2CONSET=SI; //发送完起始位会自动置1
49 do{}while(0x08!=I2CSTAT); //等待完成start脉冲发送
\ ??I2C_Start_0:
\ 00000008 .... LDR R0,??DataTable17 ;; 0xe001c004
\ 0000000A 0078 LDRB R0,[R0, #+0]
\ 0000000C 0006 LSL R0,R0,#+24 ;; ZeroExt R0,R0,#+24,#+24
\ 0000000E 000E LSR R0,R0,#+24
\ 00000010 0828 CMP R0,#+8
\ 00000012 F9D1 BNE ??I2C_Start_0
50 I2CONCLR=STA; //清除STA位,结束过程
\ 00000014 .... LDR R0,??DataTable16 ;; 0xe001c018
\ 00000016 2021 MOV R1,#+32
\ 00000018 0170 STRB R1,[R0, #+0]
51 }
\ 0000001A 01BC POP {R0}
\ 0000001C 0047 BX R0 ;; return
52
53 /*****************发送结束信号*********************/
\ In segment CODE, align 4, keep-with-next
54 void I2C_Stop(void)
55 {
56 I2CONSET=STO; //启动发送STop脉冲,STO位是自动清除的.不必判断是否结束
\ I2C_Stop:
\ 00000000 .... LDR R0,??DataTable15 ;; 0xe001c000
\ 00000002 1021 MOV R1,#+16
\ 00000004 0170 STRB R1,[R0, #+0]
57 I2CONCLR=SI; //只能清除SI,清除STO还是会有影响,STO同时清除,返回到初始化的状态
\ 00000006 .... LDR R0,??DataTable16 ;; 0xe001c018
\ 00000008 0821 MOV R1,#+8
\ 0000000A 0170 STRB R1,[R0, #+0]
58 }
\ 0000000C 7047 BX LR ;; return
59
60 /************************延时*********************************/
\ In segment CODE, align 4, keep-with-next
61 void DelayMs(U32 dly)
62 { U32 i;
\ DelayMs:
\ 00000000 00B5 PUSH {LR}
63
64 for(; dly>0; dly--)
\ ??DelayMs_0:
\ 00000002 0028 CMP R0,#+0
\ 00000004 09D0 BEQ ??DelayMs_1
65 for(i=0; i<1000; i++);
\ 00000006 0022 MOV R2,#+0
\ 00000008 111C MOV R1,R2
\ ??DelayMs_2:
\ 0000000A FA22 MOV R2,#+250
\ 0000000C 9200 LSL R2,R2,#+2 ;; #+1000
\ 0000000E 9142 CMP R1,R2
\ 00000010 01D2 BCS ??DelayMs_3
\ 00000012 491C ADD R1,#+1
\ 00000014 F9E7 B ??DelayMs_2
\ ??DelayMs_3:
\ 00000016 401E SUB R0,#+1
\ 00000018 F3E7 B ??DelayMs_0
66 }
\ ??DelayMs_1:
\ 0000001A 01BC POP {R0}
\ 0000001C 0047 BX R0 ;; return
67
68 /***************写8位数据*****************************/
\ In segment CODE, align 4, keep-with-next
69 void WriteByte(U8 data)
70 {
71 I2DAT=data;
\ WriteByte:
\ 00000000 .... LDR R1,??DataTable18 ;; 0xe001c008
\ 00000002 0870 STRB R0,[R1, #+0]
72 I2CONCLR=SI; //启动发送
\ 00000004 .... LDR R1,??DataTable16 ;; 0xe001c018
\ 00000006 0822 MOV R2,#+8
\ 00000008 0A70 STRB R2,[R1, #+0]
73 }
\ 0000000A 7047 BX LR ;; return
74
75 /***************写器件地址和读写信号*****************************/
\ In segment CODE, align 4, keep-with-next
76 void WriteAddr(U8 ReadMode)
77 {
\ WriteAddr:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
78 WriteByte(C02MasterAddr+ReadMode);
\ 00000004 201C MOV R0,R4
\ 00000006 A030 ADD R0,#+160
\ 00000008 0006 LSL R0,R0,#+24 ;; ZeroExt R0,R0,#+24,#+24
\ 0000000A 000E LSR R0,R0,#+24
\ 0000000C ........ BL WriteByte
79 if(ReadMode) do{}while(I2CSTAT!=0x40); //等待器件地址和读信号完成
\ 00000010 002C CMP R4,#+0
\ 00000012 06D0 BEQ ??WriteAddr_0
\ ??WriteAddr_1:
\ 00000014 .... LDR R0,??DataTable17 ;; 0xe001c004
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -