📄 i2cbus.lst
字号:
154 0005C 9F03ED03 S or.b #03h,P7 ; SDA/SCL Hi-Z.
155 00060 97FCEF03 S and.b #0fch,PD7 ; Deacltivate I2C bus.
156 00064 B77D03 Z mov.b #00h,U2C1 ; '
157 00067 B77803 Z mov.b #00h,U2MR ; '
158 0006A B77703 Z mov.b #00h,U2SMR ; '
159 0006D C7807603 S mov.b #80h,U2SMR2 ; '
160 00071 B74A00 Z mov.b #00h,STSPIC ; '
161 00074 B75000 Z mov.b #00h,S2RIC ; '
162 00077 B4 Z mov.b #00h,R0L ; '
163 00078 iic_stop_common: ;
164 00078 EB33 popc FLG ; Pop flag register.
165 .if DEBUG == 1 ; ---DEBUG---
166 0007A 7E8F881F bclr 0,dp ; ---DEBUG---
167 .endif ; ---DEBUG---
168 0007E F3 rts ;
169 ;;; ***************************************************************************
170 ;;; ***************************************************************************
171 ;;; unsigned char iic_mw_start(R0H,A0,R0L)
172 ;; Start Master Write on I2C bus.
173 ;; Variables;
174 ;; ROH: Transmission data length.
175 ;; A0: Data sram start address
176 ;; ROL: Target (ID) address.
177 ;; Return Values;
178 ;; 0: Master transmission started correctly.
179 ;; 1: Cannot start master transmission.
180 ;;; --------------------------------------------------------------------------
181 0007F 04 .align ;
182 00080 _iic_mw_start: ;
183 .if DEBUG == 1 ; --- DEBUG ---
184 00080 7E9F891F bset 1,dp ; --- DEBUG ---
185 .endif ; --- DEBUG ---
186 00084 EB32 pushc FLG ; Push Flag register on to stack.
* M16C FAMILY ASSEMBLER * SOURCE LIST Mon Sep 10 15:02:41 2001 PAGE 004
SEQ. LOC. OBJ. 0XMSDA ....*....SOURCE STATEMENT....7....*....8....*....9....*....0....*....1....*....2....*....3....*....4
187 00086 EB65 fclr I ; Disable interrupt.
188 ;;
189 00088 070000r S mov.b R0H,mw_lng ; Set master transmit data length.
190 0008B 734F0000r mov.w A0,mw_data ; Set master transmit data address
191 0008F EB05 fclr C ; Set Carry flag to ZERO "WRITE".
192 00091 76A0 rolc.b R0L ; Shift "ROL" left; Carry --> to LSBit of R0L.
193 00093 030000r S mov.b R0L,mw_target ; Set target's (ID) address.
194 ;;
195 00096 7EBFBA1B btst 2,U2SMR ; Bit test of Bus Busy flag.
196 0009A 685A jc m_Ereturn ; Jump to master error return.
197 0009C C7020000r S mov.b #02h,m_iic ; Else Set master transmit mode.
198 000A0 FE23 B jmp m_start ; Jump to Master Start Function.
199 ;;; ***************************************************************************
200 ;;; ***************************************************************************
201 ;;; unsigned char iic_mr_start(R0H,R2,R0L)
202 ;; Start Master Read on I2C bus.
203 ;; Variables;
204 ;; ROH: Receive data length.
205 ;; A0: Receive data start address.
206 ;; ROL: Receive target (ID) address
207 ;; Return Values;
208 ;; 0: Master Read started successfully.
209 ;; 1: Cannot start master read.
210 ;;; --------------------------------------------------------------------------
211 .align ;
212 000A2 _iic_mr_start: ;
213 .if DEBUG == 1 ; --- DEBUG ---
214 000A2 7E9F8A1F bset 2,dp ; --- DEBUG ---
215 .endif ; --- DEBUG ---
216 000A6 EB32 pushc FLG ; Push Flag register on to stack.
217 000A8 EB65 fclr I ; Disable interrupts.
218 ;;
219 000AA AB dec.b R0H ; Decrement receive data length.
220 000AB 070000r S mov.b R0H,mr_lng ; Store receive data length.
221 000AE 734F0000r mov.w A0,mr_data ; Store receive target address.
222 000B2 EB04 fset C ; Set carry in flag register to ONE "READ".
223 000B4 76A0 rolc.b R0L ; Shift "ROL" left: Carry --> to LSBit of R0L.
224 000B6 030000r S mov.b R0L,mr_target ; Store target's (ID) address.
225 ;;
226 000B9 7EBFBA1B btst 2,U2SMR ; Bit test of Bus Busy flag.
227 000BD 6837 jc m_Ereturn ; Jump to master error return.
228 000BF C7030000r S mov.b #03h,m_iic ; Else set master receive mode.
229 ;;; --------------------------------------------------------------------------
230 ;; Master start write/read function; Make Start.
231 ;;; --------------------------------------------------------------------------
232 000C3 04 .align ;
233 000C4 m_start: ;
234 ;;
235 000C4 7E8FFB1B bclr 3,U2RB+1 ; Reset Arbitration Lost detection flag.
236 000C8 C301 S mov.b #01h,R0H ; Set Ninth bit to one.
237 000CA 7E8FBC1B bclr 4,U2SMR ; UART2 initialization denied.
238 000CE C78D7603 S mov.b #8dh,U2SMR2 ; Enable I2C "See page 30 of app. note".
239 000D2 B77803 Z mov.b #00h,U2MR ; Initialize "Serial I/O mode not valid(port control).
240 000D5 7E8F681F bclr 0,P7 ; Set data output to low.
241 000D9 C7027803 S mov.b #02h,U2MR ; Set Serial I/O mode to I2C mode.
242 ;
243 000DD 730F7A03 mov.w R0,U2TB ; Copy data to U2 Transmit buffer.
244 000E1 7E9FB11B bset 1,U2SMR2 ; Enable Clock synchronous mode.
245 000E5 F50404 W jsr wait_4usec ; New delay counter July 1999 by Bruce Embry.
246 000E8 7E9FB51B bset 5,U2SMR2 ; Set SCL output to low.
247 000EC F50904 W jsr wait_15usec ; New delay counter July 1999 by Bruce Embry
248 000EF 7E8FB51B bclr 5,U2SMR2 ; Bit Clear SCL output to high.
* M16C FAMILY ASSEMBLER * SOURCE LIST Mon Sep 10 15:02:41 2001 PAGE 005
SEQ. LOC. OBJ. 0XMSDA ....*....SOURCE STATEMENT....7....*....8....*....9....*....0....*....1....*....2....*....3....*....4
249 ;;; for C
250 000F3 B4 Z mov.b #00h,R0L ; Return value to c-code, "0: Master started successfully."
251 000F4 61 S jmp m_start_end ;
252 000F5 m_Ereturn: ;
253 000F5 C401 S mov.b #01h,R0L ; Stop Master transmit.
254 000F7 m_start_end: ;
255 000F7 EB33 popc FLG ;
256 .if DEBUG == 1 ; --- DEBUG ---
257 000F9 B7F103 Z mov.b #00h,dp ; --- DEBUG ---
258 .endif ; --- DEBUG ---
259 000FC F3 rts ; Return sub-routine.
260 ;;; ***************************************************************************
261 ;;; ***************************************************************************
262 ;; I2C Stop/Start function; Detect interrupt: Bus Collision detection interrupt.
263 ;;; ---------------------------------------------------------------------------
264 000FD 04 .align ;
265 000FE stsp_int: ;
266 .if DEBUG == 1 ; --- DEBUG ---
267 000FE 7E9F8D1F bset 5,dp ; --- DEBUG ---
268 .endif ; --- DEBUG ---
269 00102 7442 push.b R1L ; Place R1L on to Stack.
270 00104 9F035000 S or.b #S2RIPL,S2RIC ; clear interrupt status register.
271 00108 7EBFBA1B btst 2,U2SMR ; Bit test
272 0010C 6A11 jz stop_int ; Jump if BBS = 1
273 ;;; ----------------------------------------------------------------------------
274 ;; If Bus Busy Flag == 0 Continue with start-int.
275 ;;; ----------------------------------------------------------------------------
276 0010E start_int: ;
277 0010E B74A00 Z mov.b #00h,STSPIC ; Disable Start Stop interrupt request.
278 00111 7EBF0000r btst 1,m_iic ; Test for master / slave operation.
279 00115 6A37 jz stsp_int_end ; Jump if master.
280 00117 start_int10: ;
281 ;;
282 ;;
283 00117 F59003 W jsr make_stop ; Jump to make_stop and return.
284 0011A D842 Q mov.b #04h,R1L ; Status return value: "Improper Start Condition Detected."
285 0011C FE16 B jmp stsp_common_master
286 ;;; ----------------------------------------------------------------------------
287 ;;
288 ;;; ----------------------------------------------------------------------------
289 .align ;
290 0011E stop_int: ;
291 0011E B74A00 Z mov.b #00h,STSPIC ; Disable interrupt.
292 00121 C7D17603 S mov.b #0d1h,U2SMR2 ;
293 00125 E7000000r S cmp.b #00h,m_iic ; Set I2C bus mode condition to "Wait mode stop to start con
294 00129 6A23 jeq stsp_int_end ;
295 0012B stop_int10: ;
296 ;;; ----------------------------
297 0012B 7EBF0000r btst 1,m_iic ; Test for Master mode.
298 0012F 6A1D jz stsp_int_end ; If not master mode jump to stsp_int_end.
299 ;;
300 ;; Master mode
301 00131 D852 Q mov.b #05h,R1L ;
302 ;;; ------------------------------------------------------------------------------
303 ;; Master common function.
304 ;;; ------------------------------------------------------------------------------
305 00133 stsp_common_master: ;
306 00133 744F0000r push.b md_cnt ; Push Master Receive Data Count on to stack.
307 ;
308 00137 7EBF0000r btst 0,m_iic ; Bit test for Read or Write mode.
309 0013B 6806 jc stsp_common_master10 ; If Read
310 ;; W
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -