📄 lib_twi.lst
字号:
ARM COMPILER V2.53, lib_twi 19/07/06 08:38:07 PAGE 1
ARM COMPILER V2.53, COMPILATION OF MODULE lib_twi
OBJECT MODULE PLACED IN .\out\lib_twi.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe lib_twi.c THUMB BROWSE DEBUG PRINT(.\OUT\LIB_TWI.LST) TABS(4) OBJECT(.\out\l
-ib_twi.obj)
stmt level source
1 #include "lib_twi.h"
2 #include "lib_AT91SAM7S64.h"
3 #define ERROR (AT91C_TWI_NACK)//状态寄存器的一位,如果置1表示从机未应答
4 //*============================================================================
5 //* TWI初始化
6 //*============================================================================
7 //*----------------------------------------------------------------------------
8 //* 函数名: AT91F_SetTwiClock
9 //* 功能: 设置TWI时钟波形发生寄存器
10 //*----------------------------------------------------------------------------
11 void AT91F_SetTwiClock(void)
12 {
13 1 int sclock;
14 1
15 1 sclock = (10*MCK /AT91C_TWI_CLOCK);
16 1 if (sclock % 10 >= 5)
17 1 sclock = (sclock /10) - 5;
18 1 else
19 1 sclock = (sclock /10)- 6;
20 1 sclock = (sclock + (4 - sclock %4)) >> 2; // div 4
21 1
22 1 AT91C_BASE_TWI->TWI_CWGR = ( 1<<16 ) | (sclock << 8) | sclock ;
23 1 }
24
25 //*----------------------------------------------------------------------------
26 //*函数名: AT91F_TWI_Open
27 //* 功能: 初始化TWI接口
28 //*----------------------------------------------------------------------------
29 void AT91F_TWI_Open(void)
30 {
31 1 // 配置I/O口作为TWI功能
32 1 AT91F_TWI_CfgPIO ();
33 1
34 1 // 将TWD和TWCK定义为开路
35 1 AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,Twd_Twck);
36 1
37 1 // 开TWI时钟源
38 1 AT91F_TWI_CfgPMC ();
39 1
40 1 // 配置TWI工作在主模式,禁止TWI中断,采用查询读写方式
41 1 AT91F_TWI_Configure (AT91C_BASE_TWI);
42 1
43 1 // 设置TWI时钟波形发生寄存器
44 1 AT91F_SetTwiClock();
45 1 }
46
47 //*=============================================================================
48 //* 写EPROM
49 //*=============================================================================
50 //*----------------------------------------------------------------------------
51 //* 函数名:AT91F_TWI_WriteByte
52 //* 功能: 发送(以字节为单位)数据到设备(EPROM)
53 //*参数说明:
54 // pTwi:指向TWI结构的首地址-----设为AT91C_BASE_TWI
55 // mode:TWI的工作模式----用于设置WTI的主模式寄存器(内部器件地址长度,主机读写方向,器件地址),
-见DATASHEET
56 // int_address:器件的内部地址(要写入的位置)
57 // data2send:代写的数据缓冲区地址
ARM COMPILER V2.53, lib_twi 19/07/06 08:38:07 PAGE 2
58 // nb:写入的字节数
59 //*----------------------------------------------------------------------------
60 int AT91F_TWI_WriteByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data2send, int nb)
61 {
62 1 unsigned int status,counter=0,error=0;
63 1
64 1 // 设置TWI内部地址寄存器---可设为0,1,2,3位内部地址
65 1 if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;
66 1
67 1 // 设置TWI的主模式寄存器(此处为主机写)
68 1 pTwi->TWI_MMR = mode & ~AT91C_TWI_MREAD;
69 1
70 1 // 如果只写1个字节
71 1 if(nb <2)
72 1 {
73 2 //发送START状态,使能传输,传输完后发送STOP状态
74 2 pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN | AT91C_TWI_STOP;
75 2 //将数据写入发送保持寄存器
76 2 pTwi->TWI_THR = *data2send;
77 2 }
78 1
79 1 //如果一次写入多个字节
80 1 else
81 1 {
82 2 for(counter=0;counter<nb;counter++)
83 2 {
84 3
85 3 //发送START状态,使能传输
86 3 pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN;
87 3
88 3 //最后一个数据发送完后,接着发送STOP状态
89 3 if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
90 3
91 3 //读取状态寄存器
92 3 status = pTwi->TWI_SR;
93 3
94 3 //如果发送完一个字节后没收到应答信号,则表明有一次传输错误
95 3 if ((status & ERROR) == ERROR) error++;
96 3
97 3 while (!(status & AT91C_TWI_TXRDY))
98 3 {
99 4 status = pTwi->TWI_SR;
100 4 if ((status & ERROR) == ERROR) error++;
101 4 } //END while
102 3
103 3 //传输下一个字节
104 3 pTwi->TWI_THR = *(data2send+counter);
105 3 }//END for
106 2 }//END else
107 1
108 1 //读取状态寄存器
109 1 status = pTwi->TWI_SR;
110 1 //如果发送完一个字节后没收到应答信号,则表明有一次传输错误
111 1 if ((status & ERROR) == ERROR) error++;
112 1
113 1 //等待数据发送完
114 1 while (!(status & AT91C_TWI_TXCOMP))
115 1 {
116 2 //读取状态寄存器
117 2 status = pTwi->TWI_SR;
118 2 //如果发送完一个字节后没收到应答信号,则表明有一次传输错误
119 2 if ((status & ERROR) == ERROR) error++;
120 2 }//END while
121 1
122 1 return error;
123 1 }
ARM COMPILER V2.53, lib_twi 19/07/06 08:38:07 PAGE 3
124
125 //*=============================================================================
126 //* 读(EPROM)
127 //*=============================================================================
128 //*----------------------------------------------------------------------------
129 //* 函数名:AT91F_TWI_ReadByte
130 //* 功能: 从设备(EPROM)中读取一个字节的数据
131 //*参数说明:
132 // pTwi:指向TWI结构的首地址-----设为AT91C_BASE_TWI
133 // mode:TWI的工作模式----用于设置WTI的主模式寄存器(内部器件地址长度,主机读写方向,器件地址),
-见DATASHEET
134 // int_address:器件的内部地址(要写入的位置)
135 // data2read:数据缓冲区地址
136 // nb:要读出的字节数
137 //* Creation : 张正锋 2005-12-30 zhangzf@baite-group.com
138 //*----------------------------------------------------------------------------
139 int AT91F_TWI_ReadByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data2read, int nb)
140 {
141 1 unsigned int status,counter=0,error=0;
142 1
143 1 // 设置TWI内部地址寄存器---可设为0,1,2,3位内部地址
144 1 if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;
145 1
146 1 // 设置TWI的主模式寄存器(此处为主机读)
147 1 pTwi->TWI_MMR = mode | AT91C_TWI_MREAD;
148 1
149 1 //如果只读取一个字节
150 1 if (nb == 1)
151 1 {
152 2 //发送START状态,接收完后发送STOP状态
153 2 pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP;
154 2
155 2 //读取状态寄存器
156 2 status = pTwi->TWI_SR;
157 2 //如果没收到应答信号,则表明有一次传输错误
158 2 if ((status & ERROR) == ERROR) error++;
159 2
160 2 //等待操作完
161 2 while (!(status & AT91C_TWI_TXCOMP)){
162 3 status = pTwi->TWI_SR;
163 3 if ((status & ERROR) == ERROR) error++;
164 3 }
165 2
166 2 //将数据放入缓冲区
167 2 *(data2read) = pTwi->TWI_RHR;
168 2 } //END if
169 1
170 1 //如果读取多个字节
171 1 else
172 1 {
173 2 //发送START状态,接收完后发送STOP状态
174 2 pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN;
175 2
176 2 //读取状态寄存器
177 2 status = pTwi->TWI_SR;
178 2 //如果没收到应答信号,则表明有一次传输错误
179 2 if ((status & ERROR) == ERROR) error++;
180 2
181 2 //等待操作完
182 2 while (!(status & AT91C_TWI_TXCOMP))
183 2 {
184 3 status = pTwi->TWI_SR;
185 3 if ((status & ERROR )== ERROR) error++;
186 3
187 3 //查看是否收到一个字节数据
188 3 if(status & AT91C_TWI_RXRDY)
ARM COMPILER V2.53, lib_twi 19/07/06 08:38:07 PAGE 4
189 3 {
190 4 //将数据放入缓从区
191 4 *(data2read+counter++) = pTwi->TWI_RHR;
192 4
193 4 //如果是最后一次读取则发送STOP 状态
194 4 if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
195 4 } //END if
196 3 } //END while
197 2 } //END else
198 1
199 1 return error;
200 1 }
201
202
203
204
205
ARM COMPILER V2.53, lib_twi 19/07/06 08:38:07 PAGE 5
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (?C?UDIV?T)
EXTERN CODE16 (?C?SDIV?T)
*** PUBLICS:
PUBLIC AT91F_TWI_Open?T
PUBLIC AT91F_TWI_WriteByte?T
PUBLIC AT91F_TWI_ReadByte?T
PUBLIC AT91F_SetTwiClock?T
*** CODE SEGMENT '?PR?AT91F_MC_EFC_GetModeReg?T?lib_twi':
66: __inline unsigned int AT91F_MC_EFC_GetModeReg(
00000000 1C01 MOV R1,R0 ; pMC
00000002 ---- Variable 'pMC' assigned to Register 'R1' ----
69: return pMC->MC_FMR;
00000002 1C08 MOV R0,R1 ; pMC
00000004 6E00 LDR R0,[R0,#0x60]
70: }
00000006 4770 BX R14
00000008 ENDP ; 'AT91F_MC_EFC_GetModeReg?T'
*** CODE SEGMENT '?PR?AT91F_MC_EFC_GetStatus?T?lib_twi':
97: __inline unsigned int AT91F_MC_EFC_GetStatus(
00000000 1C01 MOV R1,R0 ; pMC
00000002 ---- Variable 'pMC' assigned to Register 'R1' ----
100: return pMC->MC_FSR;
00000002 1C08 MOV R0,R1 ; pMC
00000004 6E80 LDR R0,[R0,#0x68]
101: }
00000006 4770 BX R14
00000008 ENDP ; 'AT91F_MC_EFC_GetStatus?T'
*** CODE SEGMENT '?PR?AT91F_PDC_SetNextRx?T?lib_twi':
132: __inline void AT91F_PDC_SetNextRx (
00000000 B410 PUSH {R4}
00000002 ---- Variable 'bytes' assigned to Register 'R2' ----
00000002 1C0C MOV R4,R1 ; address
00000004 ---- Variable 'address' assigned to Register 'R4' ----
00000004 1C03 MOV R3,R0 ; pPDC
00000006 ---- Variable 'pPDC' assigned to Register 'R3' ----
137: pPDC->PDC_RNPR = (unsigned int) address;
00000006 1C21 MOV R1,R4 ; address
00000008 1C18 MOV R0,R3 ; pPDC
0000000A 6101 STR R1,[R0,#0x10]
138: pPDC->PDC_RNCR = bytes;
0000000C 1C11 MOV R1,R2 ; bytes
0000000E 1C18 MOV R0,R3 ; pPDC
00000010 6141 STR R1,[R0,#0x14]
139: }
00000012 BC10 POP {R4}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -